【问题标题】:How to implement this TCP stream reader in Spring Integration?如何在 Spring Integration 中实现这个 TCP 流读取器?
【发布时间】:2015-07-02 18:11:54
【问题描述】:

我想要一个流阅读器的 Spring Integration 实现。另一个应用程序(Java 之外)将数据流(由美元符号分隔)发送到端口 9999。此服务器监听

首先,我通过使用telnet 127.0.0.1 9999 连接到流来确保流是流式传输的。

然后我使用以下方法创建了一个简单的 java 应用程序。目前正在运行。

public void readStream() throws IOException{
    Scanner s = null;
    try {
        Socket skt = new Socket("localhost", 9999);
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(
                        skt.getInputStream()));
        s = new Scanner(bufferedReader);
        s.useDelimiter("[$]");
        System.out.println(s);
        while (s.hasNext()) {
            System.out.println("----------------------");
            System.out.println(s.next());
        }
    } finally {
        if (s != null) {
            s.close();
        }
    }
}

现在,我想在 Spring Integration 框架中实现它。 我看了https://github.com/spring-projects/spring-integration-samples/tree/master/basic/tcp-client-serverhttp://docs.spring.io/autorepo/docs/spring-integration/2.0.0.M3/spring-integration-reference/html/stream.html。但是我很困惑从哪里开始? 连接到发送应用程序需要什么? (我真的是 Spring 框架的新手。)

对我来说,困难在于术语。我应该创建一个 TCP 入站网关吗?还是接收通道适配器?还是因为我在请求流而出站??

EDIT 在 Gary 的 cmets 之后:

<bean class="org.springframework.integration.ip.tcp.serializer.ByteArraySingleTerminatorSerializer" id="deserializer1">
    <constructor-arg type="byte" value="$"/>
</bean>
<int-ip:tcp-connection-factory id="server" type="server" port="9999"
    deserializer="deserializer1"
/>
<int-ip:tcp-inbound-channel-adapter id="adapter" connection-factory="server" request-channel="channel1"/>
<int:channel id="channel1" />

【问题讨论】:

    标签: java spring tcp streaming spring-integration


    【解决方案1】:

    当服务器发送对入站请求的回复时,使用入站网关。入站通道适配器(&lt;int-ip:tcp-inbound-channel-adapter) 仅用于单向集成 - 客户端仅发送数据,不接收回复。

    您需要一个server connection factory,配置为使用ByteArraySingleTerminatorSerializer,并在deserializer 属性中配置您的$ 分隔符。

    请使用latest documentation,而不是您问题中的旧版本。

    【讨论】:

    • 是“服务器”我的应用程序,还是发送数据流的其他应用程序?
    • 服务器就是你的应用程序。
    • 谢谢 Gary,我添加了一些代码;这是你的意思吗?
    • 仅对于入站,您需要一个通道适配器,而不是网关;您需要将deserializer 设置为在入站端解码,设置为用于出站数据的serializer;您需要订阅channel1 来处理消息。
    • 所以,是的,您的术语不正确,服务器在 9999 上侦听客户端连接到 9999(不侦听)。客户端连接然后只接收数据是很不寻常的,但这是可能的。要使用 Spring Integration 做到这一点,您需要一个 client 连接工厂和适配器上的 client-mode="true"(通常,入站适配器使用服务器工厂并监听用于来自客户端的传入连接)。
    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2017-02-20
    • 1970-01-01
    • 2019-02-05
    • 2016-01-27
    相关资源
    最近更新 更多