Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
带有@RabbitListener注释的Spring核心不触发有界方法_Spring_Rabbitmq_Spring Amqp - Fatal编程技术网

带有@RabbitListener注释的Spring核心不触发有界方法

带有@RabbitListener注释的Spring核心不触发有界方法,spring,rabbitmq,spring-amqp,Spring,Rabbitmq,Spring Amqp,我正在尝试在我的方法中使用rabbitmq@RabbitListener注释,以便在任何消息到达时,我的方法都可以自动执行。根据提供的官方文档,我创建了以下config类 import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.config.SimpleRabbitLi

我正在尝试在我的方法中使用rabbitmq@RabbitListener注释,以便在任何消息到达时,我的方法都可以自动执行。根据提供的官方文档,我创建了以下config类

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.MessageListenerContainer;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfiguration {
    public static final String QUEUE_NAME="myQueue";
    public static final String EXCHANGE_NAME="my_EXCHANGE";

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setMaxConcurrentConsumers(5);
        return factory;
    }
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory =
                new CachingConnectionFactory("localhost");
        return connectionFactory;
    }
    @Bean
    public AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        return new RabbitTemplate(connectionFactory());
    }

    @Bean
    public Queue myQueue() {
        return new Queue(QUEUE_NAME);
    }
   @Bean
   MessageListenerContainer messageListenerContainer() {
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
        simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
        simpleMessageListenerContainer.setQueues(myQueue());
        simpleMessageListenerContainer.setMessageListener(new RabbitMQListner());
        return simpleMessageListenerContainer;
    }
    @Bean
    FanoutExchange exchange() {
        return new FanoutExchange(EXCHANGE_NAME);
    }

    @Bean
    Binding binding(Queue queue, FanoutExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange);
    }
    @Bean
    MessagingService messagingService(){
        return new MessagingService();
    }
}
然后在我的服务课上,我用了这样的方式:-


@Component
public class MessagingService {
public void send(String msg){
        ApplicationContext context =
                new AnnotationConfigApplicationContext(RabbitConfiguration.class);


        AmqpTemplate template = context.getBean(AmqpTemplate.class);

        template.convertAndSend(QUEUE_NAME,"Hello from template "+msg);
    }

    @RabbitListener(queues=QUEUE_NAME)
    private void receiveMessage(String order) {
        System.out.println("Hello"+order);
    }
send方法工作正常。但是receiveMessage方法不打印预期的输出。它应该在消息到达队列后立即打印消息。相反,当我试图在配置文件中应用@EnableRabbit注释时,我在运行时得到了
java.lang.ArrayStoreException
异常。方法receiveMessage甚至不会执行。

您可以忽略输入错误。

您还需要一个用@RabbitHandler注释的方法

例如:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

    @RabbitListener(queues = "myQueue")
    @RabbitHandler
    public void handle(String msg)  {
        System.out.println("RCVD :: " + msg);
    }

}