gpt4 book ai didi

java - springrabbitmq 获取对扇出消息的所有回复

转载 作者:行者123 更新时间:2023-12-02 10:22:45 26 4
gpt4 key购买 nike

以下类包含在多个消费者应用程序中:

@Component
@Configuration
public class HealthListener {

public static final String HEALTH_CHECK_QUEUE_NAME = "healthCheckQueue";
public static final String HEALTH_CHECK_FANOUT_EXCHANGE_NAME = "health-check-fanout";


@Bean
public Binding healthListenerBinding(
@Qualifier("healthCheckQueue") Queue queue,
@Qualifier("instanceFanoutExchange") FanoutExchange exchange) {
return BindingBuilder.bind(queue).to(exchange);
}

@Bean
public FanoutExchange instanceFanoutExchange() {
return new FanoutExchange(HEALTH_CHECK_FANOUT_EXCHANGE_NAME, true, false);
}

@Bean
public Queue healthCheckQueue() {
return new Queue(HEALTH_CHECK_QUEUE_NAME);
}

@RabbitListener(queues = HEALTH_CHECK_QUEUE_NAME)
public String healthCheck() {
return "some result";
}

}

我正在尝试向扇出交换发送消息,并接收所有回复,以了解哪些消费者正在运行。

我可以发送消息并得到第一个回复,如下所示:

@Autowired
RabbitTemplate template;

// ...
String firstReply = template.convertSendAndReceiveAsType("health-check-fanout", "", "", ParameterizedTypeReference.forType(String.class));

但是,我需要获得对此消息的所有回复,而不仅仅是第一个消息。我需要设置一个回复监听器,但我不知道如何设置。

最佳答案

(convertS|s)endAndReceive.*() 方法并非设计用于处理多个回复;它们严格来说是一种请求/一种回复方法。

您需要使用 (convertAndS|s)end() 方法发送请求,并实现您自己的回复机制,也许使用回复监听器容器以及一些组件汇总回复。

您可以使用 Spring Integration Aggregator 之类的工具来实现此目的,但您需要某种机制 (ReleaseStrategy) 来知道何时收到所有预期回复。

或者您可以简单地接收离散回复并单独处理它们。

编辑

@SpringBootApplication
public class So54207780Application {

public static void main(String[] args) {
SpringApplication.run(So54207780Application.class, args);
}

@Bean
public ApplicationRunner runner(RabbitTemplate template) {
return args -> template.convertAndSend("fanout", "", "foo", m -> {
m.getMessageProperties().setReplyTo("replies");
return m;
});
}

@RabbitListener(queues = "queue1")
public String listen1(String in) {
return in.toUpperCase();
}

@RabbitListener(queues = "queue2")
public String listen2(String in) {
return in + in;
}

@RabbitListener(queues = "replies")
public void replyHandler(String reply) {
System.out.println(reply);
}

@Bean
public FanoutExchange fanout() {
return new FanoutExchange("fanout");
}

@Bean
public Queue queue1() {
return new Queue("queue1");
}

@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(fanout());
}

@Bean
public Queue queue2() {
return new Queue("queue2");
}

@Bean
public Binding binding2() {
return BindingBuilder.bind(queue2()).to(fanout());
}

@Bean
public Queue replies() {
return new Queue("replies");
}

}

FOO
foofoo

关于java - springrabbitmq 获取对扇出消息的所有回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54207780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com