【问题标题】:Spring Integration: individual timeouts settings for connections in the same poolSpring Integration:同一池中连接的单独超时设置
【发布时间】:2015-02-26 13:50:42
【问题描述】:

我们有一个使用 Spring Integration 用 Ja​​va 编写的应用程序。应用程序向 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 对输入请求一无所知,而是注册在消息处理器链中,并在需要时调用。所以,现在这看起来不是一个简单的解决方案。

如果您对如何更改标签&lt;int-ip:tcp-outbound-gateway&gt; 使用的类有任何想法,或者如果您对如何以完全不同的方式解决主要超时问题有任何想法,请告知。

谢谢。

【问题讨论】:

  • 您可以发布您的解决方案吗?

标签: java spring spring-integration tcp-ip connection-timeout


【解决方案1】:

有趣的问题。

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

我们可以做的一件事是添加一个remote-timeout-expression 并根据消息计算超时...

AsyncReply reply = new AsyncReply(calculateReplyTimeout(requestMessage));

随时打开JIRA Improvement Issue

同时,如果您想自定义网关,您可以轻松做到。

虽然命名空间 (&lt;int-ip:...) 不支持自定义类,但您始终可以使用 &lt;bean/&gt;s 连接网关。

您需要一个ConsumerEndpointFactoryBean,它会在其handler 属性中获取您的自定义网关。

【讨论】:

  • 我认为我们可以在这件事上使用现有问题jira.spring.io/browse/INT-3635
  • 谢谢加里!我在等待您的回复 :) 可能我没有完全理解您的想法。我相信当我们使用&lt;bean/&gt; 标签定义TcpOutboundGateway 组件时,不可能指定输入通道,因为网关不知道它(并且没有对应的属性)。 ConsumerEndpointFactoryBean 对此有何帮助?
  • 出站端点由 2 个组件组成,一个消费者端点和一个消息处理程序; tcp 网关是消息处理程序; ConsumerEndpointFactoryBean 基于输入通道类型构建正确的消费者。某些属性位于CEFBinputChannelautoStartuphandler 等);其余属性(例如connectionFactory)在处理程序上。命名空间解析器隐藏了这种(次要)复杂性。
  • 完美运行,加里!感谢您的帮助!
猜你喜欢
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多