使用Rabbitmq时如何分别配置消费者和生产者spring boot应用程序?

问题描述

我看了一个教程,该教程解释了如何将RabbitMQ集成到Spring Boot应用程序中。在本教程中,ReceiveMessageHandler.java(消费者)和SendMessageController.java(生产者)类在同一项目中。我想在两个不同的Spring Boot应用程序中实现它们。但是由于ConfigureRabbitMq类的缘故,我无法将教程项目分为消费者和生产者两个项目。因为它与ReceiveMessageHandler.java(消费者)类和SendMessageController.java(生产者)类都耦合。

如何实现和配置两个不同的cosnumer和生产者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");
}