# 32.1.5 接收消息

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

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

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

```java
@Component
public class MyBean {
@JmsListener(destination = "someQueue")
public void processMessage(String content) {
// ...
}
}
```

具体查看[@EnableJms javadoc](https://docs.spring.io/spring/docs/5.0.4.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) {
        // ...
    }

}
```
