我有一个发布者正在发布有关主题的消息,我有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
答案 0 :(得分:1)
发送到多播地址(即JMS 主题)的消息被路由到所有现有的多播队列(即JMS 订阅)。如果不存在订阅,则消息将被丢弃。这是多播路由的基本语义(即JMS publish-subscribe )。
如果要在订户未连接时存储订户的消息,则订户必须先创建耐用订阅,然后才能发送所需的任何消息。创建持久订阅后,即使订阅者未连接,发送到该主题的消息也将存储在该订阅中。