企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 32.1.6 接收消息 当JMS基础设施能够使用时,任何bean都能够被`@JmsListener`注解,以创建一个监听者端点。如果没有定义`JmsListenerContainerFactory`,将自动配置一个默认的。如果定义`DestinationResolver`或`MessageConverter` beans,它们将自动关联该默认factory。 默认factory是事务性的,如果运行的设施出现`JtaTransactionManager`,它默认将关联到监听器容器。如果没有,`sessionTransacted`标记将启用。在后一场景中,你可以通过在监听器方法上添加`@Transactional`,以本地数据存储事务处理接收的消息,这可以确保接收的消息在本地事务完成后只确认一次。 下面的组件创建了一个以`someQueue`为目标的监听器端点: ```java @Component public class MyBean { @JmsListener(destination = "someQueue") public void processMessage(String content) { // ... } } ``` 具体查看[@EnableJms javadoc](http://docs.spring.io/spring/docs/4.3.3.RELEASE/javadoc-api/org/springframework/jms/annotation/EnableJms.html)。 如果想创建多个`JmsListenerContainerFactory`实例或覆盖默认实例,你可以使用Spring Boot提供的`DefaultJmsListenerContainerFactoryConfigurer`,通过它可以使用跟自动配置的实例相同配置来初始化一个`DefaultJmsListenerContainerFactory`。 例如,以下使用一个特殊的`MessageConverter`创建另一个factory: ```java @Configuration static class JmsConfiguration { @Bean public DefaultJmsListenerContainerFactory myFactory( DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory()); factory.setMessageConverter(myMessageConverter()); return factory; } } ``` 然后,你可以像下面那样在任何`@JmsListener`注解中使用: ```java @Component public class MyBean { @JmsListener(destination = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... } } ```