32.1.6 接收消息

当JMS基础设施能够使用时,任何bean都能够被@JmsListener注解,以创建一个监听者端点。如果没有定义JmsListenerContainerFactory,将自动配置一个默认的。如果定义DestinationResolverMessageConverter beans,它们将自动关联该默认factory。

默认factory是事务性的,如果运行的设施出现JtaTransactionManager,它默认将关联到监听器容器。如果没有,sessionTransacted标记将启用。在后一场景中,你可以通过在监听器方法上添加@Transactional,以本地数据存储事务处理接收的消息,这可以确保接收的消息在本地事务完成后只确认一次。

下面的组件创建了一个以someQueue为目标的监听器端点:

  1. @Component
  2. public class MyBean {
  3. @JmsListener(destination = "someQueue")
  4. public void processMessage(String content) {
  5. // ...
  6. }
  7. }

具体查看@EnableJms javadoc

如果想创建多个JmsListenerContainerFactory实例或覆盖默认实例,你可以使用Spring Boot提供的DefaultJmsListenerContainerFactoryConfigurer,通过它可以使用跟自动配置的实例相同配置来初始化一个DefaultJmsListenerContainerFactory

例如,以下使用一个特殊的MessageConverter创建另一个factory:

  1. @Configuration
  2. static class JmsConfiguration {
  3. @Bean
  4. public DefaultJmsListenerContainerFactory myFactory(
  5. DefaultJmsListenerContainerFactoryConfigurer configurer) {
  6. DefaultJmsListenerContainerFactory factory =
  7. new DefaultJmsListenerContainerFactory();
  8. configurer.configure(factory, connectionFactory());
  9. factory.setMessageConverter(myMessageConverter());
  10. return factory;
  11. }
  12. }

然后,你可以像下面那样在任何@JmsListener注解中使用:

  1. @Component
  2. public class MyBean {
  3. @JmsListener(destination = "someQueue", containerFactory="myFactory")
  4. public void processMessage(String content) {
  5. // ...
  6. }
  7. }