我使用以下配置实现了一个简单的请求回复测试:
<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);
}
虽然上述配置确实“有效”,但我有以下保留意见。
配置感觉是多余的。需要额外的网关和两个额外的通道。两个网关都实现了回复超时(尽管
int:gateway
连接到 a 时超时不会触发int-jms:outbound-gateway
)。网关方法的语义根据实现请求/回复的内容而变化。在超时时,
int-jms:outbound-gateway
将引发异常,该异常将传播给TestGateway
. 如果将配置更改为替换int-jms:outbound-gateway
,int:gateway
则将返回 null。
鉴于此,客户端代码必须以相同的方式处理 null 和异常。
有没有更好的方法来连接网关?一种选择是更改int:channel's
解决PollableChannel's
问题 2 的方法,代价是增加一个额外的线程池。