java 如何在Openshift 4上配置AMQ broker,以确保消息仅由发布-订阅模型中的一个pod使用?

9nvpjoqh  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(97)

我正在使用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;
}
bwleehnv

bwleehnv1#

由于您使用的是ActiveMQ Artemis,因此可以使用JMS 2中引入的共享订阅功能。在配置DefaultJmsListenerContainerFactory时,请使用setSubscriptionSharedsetSubscriptionName

factory.setPubSubDomain(true);
factory.setSubscriptionShared(true);
factory.setSubscriptionName("mySubscriptionName");
return factory;

每一组订阅者都需要使用一个唯一的订阅名称,这样只有其中一个订阅者而不是所有订阅者接收到消息。

zyfwsgd6

zyfwsgd62#

您对发布/订阅主题的期望与其伊势情况或功能不匹配。
如果只想让一个接收者处理一条消息,那么你应该使用一个queuea命令,而不是事件。
当使用事件和发布/订阅(主题)与多个订阅者一起执行同一任务时,您必须确保事件处理是幂等的。

相关问题