使用rabbitmq时如何分别配置消费者和生产者spring boot app?
How to configure separately both consumer and producer spring boot app when using rabbitmq?
我观看了解释如何将 RabbitMQ 集成到 Spring 启动应用程序中的教程。在教程中,ReceiveMessageHandler.java
(消费者)和 SendMessageController.java
(生产者)classes 在同一个项目中。我想在两个不同的 Spring 启动应用程序中实现它们。但是,由于 ConfigureRabbitMq
class,我无法将教程项目拆分为两个消费者和生产者项目。因为它耦合了 ReceiveMessageHandler.java
(消费者)和 SendMessageController.java
(生产者)classes.
如何实现和配置两个不同的 cosnumer 和 producer Spring 引导应用程序?
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");
}
我观看了解释如何将 RabbitMQ 集成到 Spring 启动应用程序中的教程。在教程中,ReceiveMessageHandler.java
(消费者)和 SendMessageController.java
(生产者)classes 在同一个项目中。我想在两个不同的 Spring 启动应用程序中实现它们。但是,由于 ConfigureRabbitMq
class,我无法将教程项目拆分为两个消费者和生产者项目。因为它耦合了 ReceiveMessageHandler.java
(消费者)和 SendMessageController.java
(生产者)classes.
如何实现和配置两个不同的 cosnumer 和 producer Spring 引导应用程序?
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");
}