@RabbitListener 未从队列接收消息
@RabbitListener Not receiving messages from queue
我正在使用@RabbitListner 批注从 RabbitMq 队列接收消息。
虽然我已经完成了执行此操作所需的所有步骤(即在我的配置中添加 @EnableRabbit 注释 class)并将 SimpleRabbitListenerContainerFactory 声明为一个 bean,但我的方法仍然没有从队列中接收消息。谁能提出我所缺少的建议:
我正在使用 Spring Boot 启动我的应用程序
我的发布class
@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();
}
}
这是我的 Bean,用于在组件内定义 SimpleRabbitListenerContainerFactory class
@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;
}
}
最后我的 Listener 在另一个 Controller 组件中
@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 消息转换器需要在消息属性中提示要创建的对象类型。
如果您的生产者不设置这些属性,则在没有一些帮助的情况下将无法进行转换。
您可以将 ClassMapper
注入转换器。
该框架提供了一个可以自定义的 DefaultClassMapper
- 可以查看与默认 __TypeId__
属性.
不同的消息 属性
如果你总是想将json转换为同一个对象,你可以简单地设置默认类型:
DefaultClassMapper classMapper = newDefaultClassMapper();
classMapper.setDefaultType(QueueMessage.class);
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
converter.setClassMapper(classMapper);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
我正在使用@RabbitListner 批注从 RabbitMq 队列接收消息。
虽然我已经完成了执行此操作所需的所有步骤(即在我的配置中添加 @EnableRabbit 注释 class)并将 SimpleRabbitListenerContainerFactory 声明为一个 bean,但我的方法仍然没有从队列中接收消息。谁能提出我所缺少的建议:
我正在使用 Spring Boot 启动我的应用程序
我的发布class
@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();
}
}
这是我的 Bean,用于在组件内定义 SimpleRabbitListenerContainerFactory class
@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;
} }
最后我的 Listener 在另一个 Controller 组件中
@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 消息转换器需要在消息属性中提示要创建的对象类型。
如果您的生产者不设置这些属性,则在没有一些帮助的情况下将无法进行转换。
您可以将 ClassMapper
注入转换器。
该框架提供了一个可以自定义的 DefaultClassMapper
- 可以查看与默认 __TypeId__
属性.
如果你总是想将json转换为同一个对象,你可以简单地设置默认类型:
DefaultClassMapper classMapper = newDefaultClassMapper();
classMapper.setDefaultType(QueueMessage.class);
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
converter.setClassMapper(classMapper);
factory.setMessageConverter(new Jackson2JsonMessageConverter());