# JMS 支持
## JMS 支持
Spring 集成提供了用于接收和发送 JMS 消息的通道适配器。
你需要在项目中包含此依赖项:
Maven
```
org.springframework.integration
spring-integration-jms
5.5.9
```
Gradle
```
compile "org.springframework.integration:spring-integration-jms:5.5.9"
```
`javax.jms:javax.jms-api`必须通过一些特定于供应商的 JMS 实现显式地添加,例如 Apache ActiveMQ。
实际上有两个基于 JMS 的入站通道适配器。第一种使用 Spring 的`JmsTemplate`基于轮询周期来接收。第二种是“消息驱动”,依赖于 Spring `MessageListener`容器。出站通道适配器使用`JmsTemplate`按需转换和发送 JMS 消息。
通过使用`JmsTemplate`和`MessageListener`容器, Spring 集成依赖于 Spring 的 JMS 支持。理解这一点很重要,因为这些适配器上公开的大多数属性都配置了底层的`JmsTemplate`和`MessageListener`容器。有关`JmsTemplate`和`MessageListener`容器的更多详细信息,请参见[Spring JMS documentation](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html)。
Spring 尽管 JMS 通道适配器旨在用于单向消息传递(仅发送或仅接收), Spring 集成还提供了用于请求和应答操作的入站和出站 JMS 网关。入站网关依赖于 Spring 的`MessageListener`容器实现中的一个来实现消息驱动的接收。它还能够向`reply-to`目的地发送返回值,如接收到的消息所提供的那样。出站网关向`request-destination`(或`request-destination-name`或`request-destination-expression`)发送一条 JMS 消息,然后接收一条回复消息。你可以显式地配置`reply-destination`引用(或`reply-destination-name`或`reply-destination-expression`)。否则,出站网关使用 JMS[临时队列](https://docs.oracle.com/javaee/6/api/javax/jms/TemporaryQueue.html)。
在 Spring Integration2.2 之前,如果有必要,将为每个请求或回复创建(并删除)一个`TemporaryQueue`。从 Spring Integration2.2 开始,你可以将出站网关配置为使用`MessageListener`容器来接收回复,而不是直接使用新的(或缓存的)`Consumer`来接收每个请求的回复。在这样配置且未提供明确的应答目的地时,每个网关使用一个`TemporaryQueue`,而不是每个请求使用一个。
### 入站通道适配器
入站通道适配器需要对单个`JmsTemplate`实例的引用,或者对`ConnectionFactory`和`Destination`的引用(你可以提供一个“destinationName”来代替“destination”引用)。下面的示例定义了一个具有`Destination`引用的入站通道适配器:
爪哇 DSL
```
@Bean
public IntegrationFlow jmsInbound(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(
Jms.inboundAdapter(connectionFactory)
.destination("inQueue"),
e -> e.poller(poller -> poller.fixedRate(30000)))
.handle(m -> System.out.println(m.getPayload()))
.get();
}
```
Kotlin DSL
```
@Bean
fun jmsInbound(connectionFactory: ConnectionFactory) =
integrationFlow(
Jms.inboundAdapter(connectionFactory).destination("inQueue"),
{ poller { Pollers.fixedRate(30000) } })
{
handle { m -> println(m.payload) }
}
```
爪哇
```
@Bean
@InboundChannelAdapter(value = "exampleChannel", poller = @Poller(fixedRate = "30000"))
public MessageSource