Java Spring集成:同一池中连接的单独超时设置

Java Spring集成:同一池中连接的单独超时设置,java,spring,spring-integration,tcp-ip,connection-timeout,Java,Spring,Spring Integration,Tcp Ip,Connection Timeout,我们有一个用Java编写的应用程序,它使用Spring集成。应用程序向3d party service发送请求,每个请求表示为字节数组,并通过普通TCP发送。与3d方的连接存储在池中(使用CachingClientConnectionFactory) 我们可以向3d方发送几种类型的请求,现在需要为每种类型的请求设置不同的超时值。然而,现在这看起来有问题,因为网关和ConnectionFactory组件设置了连接超时,并且没有办法为特定的单个请求设置连接超时 我们希望避免仅仅为了支持不同的连接超时

我们有一个用Java编写的应用程序,它使用Spring集成。应用程序向3d party service发送请求,每个请求表示为字节数组,并通过普通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}"/>
RequestProcessor.java

package com.mypackage.TcpGateway;

public interface TcpGateway {
    byte[] send(byte[] message);
}
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集成的源代码之后,TcpOutboundGateway似乎对输入请求一无所知,而是在消息处理器链中注册,并在需要时调用。所以,现在这看起来不是一个简单的解决方案

如果您对如何更改标记
使用的类有任何想法,或者您对如何以完全不同的方式解决主超时问题有任何想法,请提供建议

谢谢。

有趣的问题

(当前)AsyncReply对象不知道原始出站消息是正确的

我们可以做的一件事是添加一个
远程超时表达式
,并根据消息计算超时

AsyncReply reply=new AsyncReply(calculateReplyTimeout(requestMessage))

请随便开一家店

同时,如果您想定制网关,您可以轻松地进行定制


虽然名称空间(
我认为我们可以使用这个问题上的现有问题,谢谢Gary!我在等待您的答复:)可能我没有完全理解您的想法。我认为,当我们使用
标记定义
TcpOutboundGateway
组件时,不可能指定输入通道,因为gateway不知道它(并且没有相应的属性)。
ConsumerEndpointFactoryBean
如何对此提供帮助?出站端点由两个组件组成,一个消费者端点和一个消息处理程序;tcp网关是消息处理程序;
ConsumerEndpointFactoryBean
根据输入通道类型构建正确类型的消费者。某些属性位于
CEFB
inputChannel
autoStartup
handler
等)上;其余属性(例如,
connectionFactory
)位于处理程序上。名称空间解析器隐藏了这种(较小的)复杂性。工作得很好,Gary!谢谢你的帮助!您是否可以发布您的解决方案?