java - 使用rabbitmq时如何分别配置消费者和生产者spring boot app?
问题描述
我观看了一个教程,该教程解释了如何将 RabbitMQ 集成到 Spring Boot 应用程序中。在本教程中,ReceiveMessageHandler.java
(消费者)和SendMessageController.java
(生产者)类在同一个项目中。我想在两个不同的 Spring Boot 应用程序中实现它们。但是,由于课程的原因,我不能将教程项目分成两个消费者和生产者项目ConfigureRabbitMq
。因为它耦合了ReceiveMessageHandler.java
(消费者)和SendMessageController.java
(生产者)类。
如何实现和配置两个不同的 conumer 和 producer Spring Boot 应用程序?
ConfigureRabbitMq.java
import com.example.demorabbitmq.rabbitmq.consumer.ReceiveMessageHandler;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfigureRabbitMq {
public static final String EXCHANGE_NAME = "mikeexchange2";
public static final String QUEUE_NAME = "mikequeue2";
@Bean
Queue createQueue() {
return new Queue(QUEUE_NAME, true, false, false);
}
@Bean
TopicExchange exchange(){
return new TopicExchange(EXCHANGE_NAME);
}
@Bean
Binding binding(Queue q, TopicExchange exchange){
return BindingBuilder.bind(q).to(exchange).with("mike.#");
}
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory
, MessageListenerAdapter messageListenerAdapter){
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(QUEUE_NAME);
container.setMessageListener(messageListenerAdapter);
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(ReceiveMessageHandler handler){
return new MessageListenerAdapter(handler, "handleMessage");
}
}
ReceiveMessageHandler.java
(消费者)
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class ReceiveMessageHandler {
public void handleMessage(String messageBody){
log.info("HandleMessage!!!");
log.info(messageBody);
}
}
SendMessageController.java
(制片人)
import com.example.demorabbitmq.rabbitmq.ConfigureRabbitMq;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SendMessageController {
private final RabbitTemplate rabbitTemplate;
public SendMessageController(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
@PostMapping("/send")
public String sendMessage(@RequestParam String themessage){
rabbitTemplate.convertAndSend(ConfigureRabbitMq.EXCHANGE_NAME,
"mike.springmessages", themessage);
return "We have sent a message! :" + themessage;
}
}
解决方案
您需要在两个项目中配置 RabbitMQ,但是您不需要在 Producer 项目的 ConfigureRabbitMq.class 中创建以下 bean:
@Bean
MessageListenerAdapter listenerAdapter(ReceiveMessageHandler handler){
return new MessageListenerAdapter(handler, "handleMessage");
}
推荐阅读
- apache-flink - 如何在 Apache Flink 中合并两个 DataStream
- ios - 如何使用第一个视图控制器中的按钮更改第二个视图控制器中的图像
- android - Android Koin DI - ViewModel 注入
- json - 使用脚本将 JSON 文件导入 SQL 表
- python - 将 Keras 用于带有自定义 Y 参数的 sklearn AdaBoost
- c# - 使用 Automapper 和 Autofac 时为不可访问的实例指定构造函数
- amazon-web-services - 在 aws cli ssm 中的 powershell 命令中传递单引号字符串
- javascript - 修补现有的 js 函数但仍然显示
- html - 与 mat-date-range-input 一起使用时,即使设置了错误,mat-error 也不会显示
- javascript - Selenium 将参数传递给 OnClick 函数