1

我使用以下配置实现了一个简单的请求回复测试:

<int:gateway id="myGateway"
    service-interface="TestGateway" 
    default-request-channel="sendingChannel"
    default-reply-channel="replyChannel"
    default-reply-timeout="2000"
    />

<int:channel id="sendingChannel" />
<int:channel id="replyChannel" />

<int-jms:outbound-gateway id="myJmsGateway"
    connection-factory="jmsConnectionFactory"
    request-channel="sendingChannel"
    request-destination-name="outQueue"
    reply-channel="replyChannel"
    reply-destination-name="outQueueReply"
    receive-timeout="60000"
    />

和界面:

public interface TestGateway {
    @Gateway
    public String requestReply(@Header("myHeaderKey") String headerValue, String data);
}

虽然上述配置确实“有效”,但我有以下保留意见。

  1. 配置感觉是多余的。需要额外的网关和两个额外的通道。两个网关都实现了回复超时(尽管int:gateway连接到 a 时超时不会触发int-jms:outbound-gateway)。

  2. 网关方法的语义根据实现请求/回复的内容而变化。在超时时,int-jms:outbound-gateway将引发异常,该异常将传播给TestGateway. 如果将配置更改为替换int-jms:outbound-gatewayint:gateway则将返回 null。

鉴于此,客户端代码必须以相同的方式处理 null 和异常。

有没有更好的方法来连接网关?一种选择是更改int:channel's解决PollableChannel's问题 2 的方法,代价是增加一个额外的线程池。

4

1 回答 1

2
  1. 您无需配置回复渠道;默认情况下,jms 网关(没有回复通道)会自动将消息返回到入站网关。
  2. 使用直接通道时,消息传递网关的超时仅在线程尝试接收从流返回的任何回复时开始。

error-channel您可以通过向入站网关添加一个来避免不同的语义(null Vs 异常) 。

重要的是要了解myGateway将您的客户端与消息传递系统隔离,您只对接口进行编码。当然,您可以直接注入 JMS 网关,但随后您已将依赖项添加到代码中。使用消息传递网关,您可以更改技术而无需对客户端代码进行任何更改。您还可以通过提供TestGateway. 这是 Spring Integration 的一个强大功能。

于 2013-09-18T16:13:25.687 回答