JMS 主题订阅者在未连接时不接收消息

JMS topic subscribers do not receive messages when they aren't connected

我有一个发布者正在发布有关主题的消息,我有 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 main Initiator class(忽略class名称)

@SpringBootApplication
@EnableJms
public class QpidJMSSpringBootHelloWorld {

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

第二个消费者与第一个消费者相同,只是端口号在 application.properties

中发生了变化

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

发送到多播地址(即 JMS topic)的消息被路由到所有现有的多播队列(即 JMS subscriptions)。如果不存在订阅,则消息将被丢弃。这是多播路由的基本语义(即 JMS publish-subscribe)。

如果您希望在订阅者未连接时存储订阅者的消息,那么订阅者必须在发送任何它想要的消息之前创建一个持久 订阅。创建持久订阅后,发送到主题的消息将存储在该订阅中,即使订阅者未连接也是如此。