带有@RabbitListener注释的Spring核心不触发有界方法
我正在尝试在我的方法中使用rabbitmq@RabbitListener注释,以便在任何消息到达时,我的方法都可以自动执行。根据提供的官方文档,我创建了以下config类带有@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
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);
}
}