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

时间:2019-01-20 08:12:01

标签: activemq-artemis

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

@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

1 个答案:

答案 0 :(得分:1)

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

如果要在订户未连接时存储订户的消息,则订户必须先创建耐用订阅,然后才能发送所需的任何消息。创建持久订阅后,即使订阅者未连接,发送到该主题的消息也将存储在该订阅中。