RabbitMQ @RabbitListener 注解在 Spring 中不起作用(不是 Spring boot)



我正在尝试在我的弹簧核心开发的应用程序中实现rabbitmq。下面是我的绒球.xml

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>

这是我的兔子配置java文件


import org.springframework.amqp.core.*;
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.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
public class RabbitConfiguration {
public static final String QUEUE_NAME="MyQueue";
public static final String EXCHANGE_NAME="My_EXCHANGE";

@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory =
new CachingConnectionFactory("localhost");
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(connectionFactory());
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
rabbitTemplate.setMessageConverter(jsonMessageConverter());
return rabbitTemplate;
}
@Bean
public Queue myQueue() {
return new Queue(QUEUE_NAME,false);
}

@Bean
MessageListenerContainer messageListenerContainer() {
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
simpleMessageListenerContainer.setQueues(myQueue());
simpleMessageListenerContainer.setMessageListener(new RabbitMQListner());
return simpleMessageListenerContainer;
}
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
}

这是我的服务类,我正在尝试使用兔子

import com.rabbitmq.client.*;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class MessagingService{
public void send(String msg){
template.convertAndSend(QUEUE_NAME,msg);
}

@RabbitListener(queues = "foo")
public void receiveMessage(String car)
{
System.out.println("Hello"+car);
}
@Bean
private ApplicationContext context(){
return new AnnotationConfigApplicationContext(RabbitConfiguration.class);
}
@Bean
private AmqpTemplate amqpTemplate(){
return context().getBean(AmqpTemplate.class);
}
@Autowired
protected AmqpTemplate template;

发送方法工作正常。但是@Listener注释方法不起作用。它不听。 我也尝试过,我创建了另一个配置文件并用@EnableRabbit注释,但没有好处。有什么秘密香肠可以让它起作用吗?

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@EnableRabbit
@Configuration
public class AppConfig extends RabbitConfiguration {
@Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setMaxConcurrentConsumers(5);
factory.setMessageConverter(jsonMessageConverter());
return factory;
}
}

我希望你已经解决了这个问题,如果它没有解决,这就是我的想法。 使用@RabbitListener时,不需要使用 SimpleRabbitListenerContainerFactory 或 SimpleMessageListenerContainer 类。在 SimpleMessageListenerContainer config 类中,您映射了 RabbitMQListner 类用于侦听,但您正在尝试在 MessagingService 类中侦听 msg。 在 SimpleRabbitListenerContainerFactory 中,您 hvnt 设置了消息侦听器本身。

可能是代码正在创建自己的容器工厂,myRabbitListenerContainerFactory,但默认情况下@RabbitListener侦听rabbitListenerContainerFactory

尝试使用@RabbitListener(queues = "foo", connectionFactory="myRabbitListenerContainerFactory")

参考: https://docs.spring.io/spring-amqp/api/org/springframework/amqp/rabbit/annotation/RabbitListener.html

最新更新