Hug*_*ama 3 java spring activemq-classic jms spring-boot
我需要为ActiveMQ创建一个主题和一个持久订阅者,我的问题是我不知道在哪里指定。我可以创建主题并使用消息,但是当我关闭订阅服务器然后继续发送消息并再次打开订阅服务器时,它将无法读取它们。
这是我到目前为止的内容:
发送消息:
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
jmsTemplate.setPubSubDomain(true);
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplate.setDeliveryPersistent(true);
jmsTemplate.convertAndSend("venta.topic",venta);
Run Code Online (Sandbox Code Playgroud)
收到消息:
@JmsListener(destination = "venta.topic",id = "comercial",subscription = "venta.topic")
public void receiveMessage(Venta venta) {
logger.log(Level.INFO, "RECEIVED : {0}",venta);
repository.save(venta);
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这篇文章,并且我了解我需要创建持久订阅者。
我还阅读了Spring文档
而且我认为这与DefaultJmsListenerContainerFactory(我没有实现,我使用的是默认配置)有关,文档显示:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setDestinationResolver(destinationResolver());
factory.setConcurrency("3-10");
return factory;
}
Run Code Online (Sandbox Code Playgroud)
但是我似乎找不到在哪里创建持久会话。生产者和订户都连接到独立的activemq二进制文件。
希望您能帮助我,在此先感谢。
正如前面的答案所指出的,有必要在工厂设置客户端ID和持久订阅:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setDestinationResolver(destinationResolver());
factory.setConcurrency("3-10");
factory.setClientID("brokerClientId");
factory.setSubscriptionDurable(true);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
但这本身并没有将客户端注册为持久订阅者,这是因为JMSListener需要containerFactory指定该客户端,否则它将采用默认值:
@JmsListener(
destination = "venta.topic",
id = "comercial",
subscription = "venta.topic",
//this was also needed with the same name as the bean above
containerFactory = "jmsListenerContainerFactory"
)
public void receiveMessage(Venta venta) {
logger.log(Level.INFO, "RECEIVED : {0}",venta);
repository.save(venta);
}
Run Code Online (Sandbox Code Playgroud)
值得一提的是,这篇帖子使我意识到自己的错误。
我希望这会帮助别人
DefaultJmsListenerContainerFactory 应该有唯一的 clientId 和持久的 sub。true 设置如下代码:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setDestinationResolver(destinationResolver());
factory.setConcurrency("3-10");
factory.setClientID("brokerClientId");
factory.setSubscriptionDurable(true);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6581 次 |
| 最近记录: |