Не могу подписаться на длительную тему с Solace JMS - PullRequest
0 голосов
/ 02 июля 2019

Я бы хотел подписаться на длительную тему, используя Solace JMS API.Но когда я запускаю свое приложение, оно выдает ошибку ниже:

[Context_3_ReactorThread] INFO com.solacesystems.jcsmp.impl.flow.BindRequestTask - Ответ об ошибке (503) - Превышено максимальное число клиентов для конечной точки долгосрочной темы

Я использую последнее изображение док-станции solace на centos 7. Версия изображения - solace-pubsub-standard (9.1.0.201).

Ниже приведен мой код:

@Bean
public SolConnectionFactory connectionFactory() {
    SolConnectionFactory connectionFactory = new SolConnectionFactoryImpl();
    connectionFactory.setHost("10.69.94.182");
    connectionFactory.setUsername("default");
    connectionFactory.setPassword("default");
    connectionFactory.setVPN("default");
    connectionFactory.setDynamicDurables(true);
    return connectionFactory;
}


@Bean
public DefaultJmsListenerContainerFactory pubSubContainerFactory(ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory listenerContainerFactory = new DefaultJmsListenerContainerFactory();
    listenerContainerFactory.setConnectionFactory(connectionFactory);
    listenerContainerFactory.setPubSubDomain(true);
    listenerContainerFactory.setSubscriptionDurable(true);
    return listenerContainerFactory;
}



@JmsListener(destination = "com.schindler.ioee.gdcs.Callback", containerFactory = "pubSubContainerFactory")
public void processCallback(Message message) {
    /*message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));*/
    log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());

}

Я попытался установить max-bind-count для конечной точки темы равным 1024, он также выдавал вышеуказанную ошибку.

Может ли кто-нибудь помочь.Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

Проблема была решена после прочтения документа https://docs.solace.com/Solace-JMS-API/Creating-Durable-Topic-S.htm. У меня есть 2 подписки, и я не смог добавить подписку в аннотации. Если имя подписки отсутствует, Spring будет использовать имя по умолчанию «org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter» в качестве имени подписки. Согласно документу, один сеанс не может подписаться на одну и ту же конечную точку темы дважды. Так что была выдана ошибка.

Мой наконец-то потребительский код выглядит так:

@Component
@Slf4j
public class MessageConsumer {

    @JmsListener(destination = "com.schindler.ioee.gdcs.Callback", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Callback")
    public void processCallback(Message message) {
        // message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
        log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());

    }

    @JmsListener(destination = "com.schindler.ioee.gdcs.Symptom", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Symptom")
    public void processSymptom(Message message) {
        // message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
        log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());

    }

    @JmsListener(destination = "com.schindler.ioee.gdcs.Equipment", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Equipment")
    public void processEquipment(Message message) {
        // message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
        log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());

    }


    @JmsListener(destination = "t/cn/rtc/*/status", subscription = "sms_mqtt_subscription", containerFactory = "pubSubContainerFactory")
    public void processStatus(Message message) {
        // message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
        log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), new String((byte[]) message.getPayload()));

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...