Rabbitmq @RabbitListener未从队列接收消息

Rabbitmq @RabbitListener未从队列接收消息,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我正在使用@RabbitListner注释从RabbitMq队列接收消息 尽管我已经完成了执行此操作所需的所有步骤(即在我的配置类中添加@EnableRabbit注释)并将SimpleRableBitListenerContainerFactory声明为bean,但我的方法仍然没有从队列接收消息。有人能告诉我我遗漏了什么吗: 我正在使用SpringBoot启动我的应用程序 我的发射课 @Configuration @EnableAutoConfiguration @EnableRabbit @E

我正在使用@RabbitListner注释从RabbitMq队列接收消息

尽管我已经完成了执行此操作所需的所有步骤(即在我的配置类中添加@EnableRabbit注释)并将SimpleRableBitListenerContainerFactory声明为bean,但我的方法仍然没有从队列接收消息。有人能告诉我我遗漏了什么吗:

我正在使用SpringBoot启动我的应用程序

我的发射课

@Configuration
@EnableAutoConfiguration
@EnableRabbit
@EnableConfigurationProperties
@EntityScan("persistence.mysql.domain")
@EnableJpaRepositories("persistence.mysql.dao")
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ApiAuthenticationFilter.class),@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ApiVersionValidationFilter.class)},basePackages = {"common", "mqclient","apache", "dispatcher" })
public class Application {

public static void main(final String[] args) {
    final SpringApplicationBuilder appBuilder = new SpringApplicationBuilder(
            Application.class);
    appBuilder.application().setWebEnvironment(false);
    appBuilder.profiles("common", "common_mysql_db", "common_rabbitmq")
            .run(args);
}

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
}


}
下面是我在组件类中定义SimpleRableBitListenerContainerFactory的Bean

@Component(value = "inputQueueManager")
public class InputQueueManagerImpl extends AbstractQueueManagerImpl {
../../

 @Bean(name = "inputListenerContainerFactory")
 public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory()     

 {
 SimpleRabbitListenerContainerFactory factory = new    
 SimpleRabbitListenerContainerFactory();
 factory.setConnectionFactory(this.rabbitConnectionFactory);
 factory.setConcurrentConsumers(Integer.parseInt(this.concurrentConsumers));


factory.setMaxConcurrentConsumers(Integer.parseInt(this.maxConcurrentConsumers));
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
} }

最后是另一个控制器组件中的侦听器

@Controller
public class RabbitListner{
 @RabbitListener(queues = "Storm1", containerFactory = "inputListenerContainerFactory")
 @Override
 public void processMessage(QueueMessage message) {
    String topic = message.getTopic();
    String payload = message.getPayload();
    dispatcher.bean.EventBean eventBean = new dispatcher.bean.EventBean();
    System.out.println("Data read from the queue");
不幸的是,我正在将消息发送到队列,但processMessage中的代码从未执行过


我不确定这里有什么问题。有人能帮忙吗???

默认情况下,Json消息转换器需要在消息属性中提示要创建什么类型的对象

如果您的制作者没有设置这些属性,那么在没有帮助的情况下,它将无法进行转换

您可以将
类映射器
插入转换器

该框架提供了一个
DefaultClassMapper
,可以对其进行自定义,以查看不同于默认
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

如果您始终希望将json转换为相同的对象,只需设置默认类型:

DefaultClassMapper classMapper = newDefaultClassMapper();
classMapper.setDefaultType(QueueMessage.class);
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
converter.setClassMapper(classMapper);
factory.setMessageConverter(new Jackson2JsonMessageConverter());

.

我建议您打开调试日志并查看日志;您应该看到bean已连接,容器已启动。如果你不明白,把日志放到某个地方(比如pastebin),我看到我的bean正在初始化并加载到SpringApplicationContext中。但是我仍然看不到调用的processMessage代码。有一个问题,我们是否需要声明任何自定义java方法来接收消息,或者任何java方法都可以完成这项工作。我的意思是我已经声明了public void processMessage(QueueMessage)。QueueMessage是否应该实现一些SpringAMQP接口?只要消息可以转换为参数类型,任何方法都可以完成这项工作;究竟什么是队列消息
?它是否可以从JSON解码(因为这是您提供的转换器)。什么在传递信息?默认情况下,JSON消息转换器需要提示来知道将JSON转换为什么。如果这些标题不存在,您将需要自定义其
类映射器
。调试日志记录将每秒显示一次容器活动(查看是否有可用消息)。QueueMessage是一个自定义javaObject,具有2个属性topic和payload。另外,如果我使用自定义侦听器,那么我也会得到消息转换异常。不幸的是,我找不到多少定制类映射器的文档。在调试时,我可以看到类映射器设置为null,如果(getClassMapper()==null){JavaType targetJavaType=getJavaTypeMapper().toJavaType(message.getMessageProperties());当调用上面的命令时,我会遇到异常。如果可能的话,你可以帮助如何使用ClassMapper。如果你能在SPRING Amqp文档中记录它,那就更好了:)谢谢Gary。但有一件事,只有当我们使用相同的对象从队列发送和接收,并且在转换器端为发布者和使用者设置相同的ClassMapper时,这才有效。理想情况下,publisher会将任何对象发送给broker,在这种情况下,我相信这是行不通的。我正在寻找一种通用的方法。默认类映射程序
DefaultClassMapper
(出站)在消息中插入一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。