Подписчики темы JMS не получают сообщения, когда они не подключены - PullRequest
0 голосов
/ 20 января 2019

У меня есть один издатель, который публикует сообщения по теме, и у меня есть 2 подписчика S1 и S2, которые получают сообщения. Когда мой издатель отправляет сообщение, и оба подписчика активны, они оба получают сообщение. Однако, когда мои подписчики не и мой издатель отправляет сообщение, тогда, когда подписчики подходят, они не получают сообщение. Как мои подписчики могут получать сообщения, отправленные, когда они не работают?

Примечание. Я использую Spring Boot.

MessageProducer.java

@RestController
@RequestMapping("/rest/produce")
public class MessageProducer {
    private static final Logger LOG = LoggerFactory.getLogger(MessageProducer.class);

    @Autowired
    public JmsTemplate jmsTemplate;

    @GetMapping("/{message}")
    public void run(@PathVariable("message") final String message) throws Exception {
        final String messageText = "Hello Blockchain World";
        LOG.info("============= Sending " + message);
        sendMessage(message);
    }

    public void sendMessage(String payload) {
        this.jmsTemplate.convertAndSend("example", payload);
    }
}

application.properties - (MessageProducer)

spring.qpidjms.remoteURL=amqp://127.0.0.1:5672
spring.qpidjms.username=admin
spring.qpidjms.password=admin
activemq.broker-url=tcp://localhost:61616
server.port=8888
spring.jms.pub-sub-domain=true

MessageConsumer.java

@Component
public class MessageConsumer {
    private static final Logger LOG = LoggerFactory.getLogger(MessageConsumer.class);

    @JmsListener( destination = "example")
    public void processMsg(String message) {
        LOG.info("============= Received: " + message);
    }
}

Основной класс инициатора MessageConsumer (игнорировать имя класса)

@SpringBootApplication
@EnableJms
public class QpidJMSSpringBootHelloWorld {

    public static void main(String[] args) {
        SpringApplication.run(QpidJMSSpringBootHelloWorld.class, args);
    }
}

Второй потребитель такой же, как первый, просто номер порта не был изменен в приложении. Свойства

application.properties (MessageConsumer-1, S1)

spring.qpidjms.remoteURL=amqp://127.0.0.1:5672
spring.qpidjms.username=admin
spring.qpidjms.password=admin
activemq.broker-url=tcp://localhost:61616
server.port=9999
spring.jms.pub-sub-domain=true

application.properties (S2)

spring.qpidjms.remoteURL=amqp://127.0.0.1:5672
spring.qpidjms.username=admin
spring.qpidjms.password=admin
activemq.broker-url=tcp://localhost:61616
server.port=9990
spring.jms.pub-sub-domain=true

1 Ответ

0 голосов
/ 20 января 2019

Сообщения, отправленные на адрес многоадресной рассылки (т. Е. JMS тема ), направляются во все существующие очереди многоадресной рассылки (т. Е. JMS подписка ). Если подписки не существует, то сообщения отбрасываются. Это фундаментальная семантика многоадресной маршрутизации (то есть JMS публикация-подписка ).

Если вы хотите, чтобы сообщения для подписчика сохранялись, когда подписчик не подключен, то подписчик должен создать подписку durable до того, как будут отправлены любые сообщения, которые он хочет. После создания долговременной подписки сообщения, отправленные в тему, будут сохранены в этой подписке, даже если подписчик не подключен.

...