我正在使用Openshift 4部署多个微服务,这些微服务通过使用发布-订阅消息传递模型的AMQ代理连接。然而,当我将pod的数量增加到2时,我遇到了一个问题,所有pod都在使用相同的消息,而不仅仅是一个消息。
有人能建议如何配置下面的java代码或AMQ代理,以确保消息只被发布-订阅模型中的一个pod使用吗?有没有我应该注意的特定设置或需要对配置进行的更改?谢谢。
配置:
@Bean
public JmsListenerContainerFactory<DefaultMessageListenerContainer> jmsListenerContainerPublisherFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setErrorHandler(throwable -> {
log.info("An error has occurred in the transaction: " + throwable.getMessage());
log.error("Error: ", throwable);
});
configurer.configure(factory, connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
收听者:
@JmsListener(destination = "${queue.dummyObject}",
containerFactory = "jmsListenerContainerPublisherFactory")
public void onConsumePublishedMessage(String message) throws JsonProcessingException {
DummyObjectDTO dummyObjectDTO = mapper.readValue(message, DummyObjectDTO.class);
LOG.info(" Received onConsumePublishedMessage message : " + dummyObjectDTO);
}
制作人:
private <T> T sendFeatured(T value, String queue, boolean publish, Selector selector) {
*
*
jmsTemplate.setPubSubDomain(true);
jmsTemplate.convertAndSend(queue, objectAsJson);
*
*
return value;
}
2条答案
按热度按时间bwleehnv1#
由于您使用的是ActiveMQ Artemis,因此可以使用JMS 2中引入的共享订阅功能。在配置
DefaultJmsListenerContainerFactory
时,请使用setSubscriptionShared
和setSubscriptionName
:每一组订阅者都需要使用一个唯一的订阅名称,这样只有其中一个订阅者而不是所有订阅者接收到消息。
zyfwsgd62#
您对发布/订阅主题的期望与其伊势情况或功能不匹配。
如果只想让一个接收者处理一条消息,那么你应该使用一个queue和a命令,而不是事件。
当使用事件和发布/订阅(主题)与多个订阅者一起执行同一任务时,您必须确保事件处理是幂等的。