【发布时间】:2015-02-26 13:50:42
【问题描述】:
我们有一个使用 Spring Integration 用 Java 编写的应用程序。应用程序向 3d 方服务发送请求,每个请求都表示为字节数组并通过纯 TCP 发送。与 3d 方的连接存储在池中(使用 CachingClientConnectionFactory)。
我们可以向 3d 方发送多种类型的请求,现在需要为每种类型的请求设置不同的超时值。但是,现在这看起来有问题,因为网关和 ConnectionFactory 组件设置了连接超时设置,并且无法为特定的单个请求设置连接超时。
我们希望避免仅仅为了支持不同的连接超时而引入多个网关和连接工厂。
频道和网关配置
<int:channel id="myInput" />
<int:gateway id="myGateway"
service-interface="com.mypackage.TcpGateway"
default-request-channel="myInput"/>
<int-ip:tcp-outbound-gateway id="myOutGateway"
request-channel="mybInput"
reply-channel="clientBytesChannel"
connection-factory="myConnectionFactory"
request-timeout="${conn.timeout}"
remote-timeout="${conn.timeout}"/>
TcpGateway.java
package com.mypackage.TcpGateway;
public interface TcpGateway {
byte[] send(byte[] message);
}
RequestProcessor.java
public class RequestProcessors {
@Autowired
private TcpGateway myGateway;
public MyResponse process(MyRequest requestMessage) {
byte[] binaryMessage = transformRequest(requestMessage);
byte[] response = myGateway.send(binaryMessage);
return transformResponse(response);
}
// rest of business logic here
}
查看上面的源代码,似乎最简单的方法是扩展本机组件 TcpOutboundGateway 并将属性 remoteTimeout 替换为将超时设置保存为 ThreadLocal 变量的单例 bean。然后可以在将请求传递给myGateway.send() 之前,根据RequestProcessors.process() 方法中的请求类型设置必要的值。
但是,我无法找到一种优雅的方式来使用我的自定义类重新定义 TcpOutboundGateway 组件。分析 Spring Integration 的源代码后,似乎 TcpOutboundGateway 对输入请求一无所知,而是注册在消息处理器链中,并在需要时调用。所以,现在这看起来不是一个简单的解决方案。
如果您对如何更改标签<int-ip:tcp-outbound-gateway> 使用的类有任何想法,或者如果您对如何以完全不同的方式解决主要超时问题有任何想法,请告知。
谢谢。
【问题讨论】:
-
您可以发布您的解决方案吗?
标签: java spring spring-integration tcp-ip connection-timeout