Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用rabbitmq时,如何分别配置消费者和生产者spring引导应用程序?_Java_Spring_Spring Boot_Rabbitmq_Spring Amqp - Fatal编程技术网

Java 当使用rabbitmq时,如何分别配置消费者和生产者spring引导应用程序?

Java 当使用rabbitmq时,如何分别配置消费者和生产者spring引导应用程序?,java,spring,spring-boot,rabbitmq,spring-amqp,Java,Spring,Spring Boot,Rabbitmq,Spring Amqp,我观看了一个教程,该教程解释了如何将RabbitMQ集成到SpringBoot应用程序中。在本教程中,ReceiveMessageHandler.java(Consumer)和SendMessageController.java(Producer)类位于同一个项目中。我想在两个不同的Spring Boot应用程序中实现它们。但是,由于ConfigureRabbitMq类的原因,我无法将教程项目分为两个消费者项目和生产者项目。因为它耦合了ReceiveMessageHandler.java(使用者

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

如何实现和配置两个不同的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
(消费者)

SendMessageController.java
(制作人)


您需要在这两个项目中配置RabbitMQ,但不需要在Producer项目的ConfigureRabbitMq.class中创建以下bean:

@Bean
MessageListenerAdapter listenerAdapter(ReceiveMessageHandler handler){
     return new MessageListenerAdapter(handler, "handleMessage");
}

然而,如果我在producer项目中使用这个bean,那么producer如何解析ReceiveMessageHandler类?因为它将被放置在唯一的消费者项目中。好的,我明白了。但是,如果我从producer项目中删除这个Bean,它会导致如下错误:
com.example.producer.rabbitmq.ConfigureRabbitMq中方法simpleMessageListenerContainer的参数1需要找不到类型为“org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter”的bean。
您也不需要simpleMessageListenerContainer bean,在您的生产者类中,对吗?非常感谢您的帮助,在删除SimpleMessageListenerContainerBean后,它起作用了。我有一个问题,
createQueue
exchange
binding
bean应该同时放置在消费者类和生产者类中吗?或者只有一个就足够了?
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;
    }
}
@Bean
MessageListenerAdapter listenerAdapter(ReceiveMessageHandler handler){
     return new MessageListenerAdapter(handler, "handleMessage");
}