gpt4 book ai didi

spring - 是否有任何 spring 集成 tcp-inbound-channel-adapter 示例?

转载 作者:可可西里 更新时间:2023-11-01 02:42:44 29 4
gpt4 key购买 nike

有谁知道使用 Spring 的 tcp-inbound-channel-adapter CLIENT 示例的简单示例?我想创建一个简单的 TCP 客户端,它向服务器发送一个短字符串,只接收一个字节作为应答,然后关闭套接字。这是我的 bean 定义:

<int-ip:tcp-connection-factory id="client2" type="client"
host="localhost" port="${availableServerSocket}" single-use="true"
so-timeout="10000" deserializer="climaxDeserializer"
so-keep-alive="false" />

<int:service-activator input-channel="clientBytes2StringChannel"
method="valaszjott" ref="echoService">
</int:service-activator>

<int:gateway
service-interface="org.springframework.integration.samples.tcpclientserver.SimpleGateway"
id="gw2" default-request-channel="gwchannel">
</int:gateway>
<int:channel id="gwchannel"></int:channel>
<int:object-to-string-transformer input-channel="gwchannel"
id="clientbyte2string" output-channel="outputchannel">
</int:object-to-string-transformer>
<int:channel id="outputchannel"></int:channel>
<int-ip:tcp-outbound-channel-adapter channel="outputchannel"
id="clientoutboundadapter" connection-factory="client2">
</int-ip:tcp-outbound-channel-adapter>
<int-ip:tcp-inbound-channel-adapter id="clientinboundadapter"
channel="inputchannel" connection-factory="client2" />
<int:channel id="inputchannel"></int:channel>
<int:service-activator ref="echoService" method="valaszjott"
input-channel="inputchannel" id="sa2">
</int:service-activator>

所以,我从我的主要方法中以这种方式使用它:

....
SimpleGateway gateway = (SimpleGateway) context.getBean("gw2");
String result = gateway.send("foo");
....

于是客户端向服务器发送"foo"+/r/n。在服务器端,我收到此消息,服务器仅响应客户端一个字节,( 06H ) 而没有 /r/n。客户端收到它,反序列化器找到它。这是我的反序列化器类:

@Component("climaxDeserializer")public class ClimaxDeserializer implements
Deserializer<Integer>{
public Integer deserialize(InputStream arg0) throws IOException {
int ertek;
do{
ertek = arg0.read();
if ( ertek == 6){
System.out.println("We have the ack byte !");
return 1;
}
} while( ertek >= 0);
return null;
}
}

解串器找到ack字节,方法返回一个整数,值为1。服务激活器指向这个方法:

public String valaszjott ( int success){
System.out.println("Answer: " + success);
if ( success == 1){
return "OK";
} else {
return "NOK";
}
}

此时一切正常,valaszjott 方法打印出 Answer: 1。但是 result 参数(在 main 方法中)永远不会得到 OKNOK 字符串值,并且套接字将保持打开状态。

我哪里弄错了?如果我将 tcp-inbound-channel-adaptertcp-outbound-channel-adapter 对更改为 tcp-outbound-gateway 它工作正常...

最佳答案

你的错误在于multi-threading .

<int:gateway>调用存在于一个线程中,但是 <int-ip:tcp-inbound-channel-adapter>message-driven组件,它是它自己的线程中的套接字的监听器。对于最后一个,无论您是否调用您的网关都无关紧要:服务器端始终可以将数据包发送到该套接字,您的适配器将接收它们。

为您的ack用例 <tcp-outbound-gateway>是最好的解决方案,因为你真的有一个 correlation在请求和回复之间。有了它,您就可以通过多个并发请求获得 yield 。

只需<tcp-outbound-channel-adapter><tcp-inbound-channel-adapter>不保证回复将按照与发送请求相同的顺序从服务器返回。

无论如何,在当前的解决方案中 gateway只是不知道回复,最后一个无法发送到 replyChannel来自请求消息 header 。

从另一边的套接字不会被关闭,因为它们是cached<int-ip:tcp-connection-factory> .

HTH

关于spring - 是否有任何 spring 集成 tcp-inbound-channel-adapter 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26619138/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com