Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 混合tcp连接工厂+tcp入站网关+路由器_Java_Spring Integration - Fatal编程技术网

Java 混合tcp连接工厂+tcp入站网关+路由器

Java 混合tcp连接工厂+tcp入站网关+路由器,java,spring-integration,Java,Spring Integration,我是否可以向同一tcp服务器、同一主机和端口发送不同的消息(不同的序列化/反序列化),并通过路由器的某个标头或有效负载值来区分tcp入站网关 我想为选择正确的tcp入站网关添加一个路由器,它取决于报头或有效负载中的某个字段,例如名为typedata的字段。在路由器、tcp入站网关、tcp连接工厂、序列化/反序列化之间输入请求或消息的顺序是什么?我在所选tcp入站网关的序列化/反序列化方面会有问题吗?正确的方法是什么 提前谢谢 编辑 在服务器中: <!-- Common --> &l

我是否可以向同一tcp服务器、同一主机和端口发送不同的消息(不同的序列化/反序列化),并通过路由器的某个标头或有效负载值来区分tcp入站网关

我想为选择正确的tcp入站网关添加一个路由器,它取决于报头或有效负载中的某个字段,例如名为typedata的字段。在路由器、tcp入站网关、tcp连接工厂、序列化/反序列化之间输入请求或消息的顺序是什么?我在所选tcp入站网关的序列化/反序列化方面会有问题吗?正确的方法是什么

提前谢谢

编辑

在服务器中:

<!-- Common -->
<int:channel id="channelConnectionFactoryRequest" />
<int:channel id="channelConnectionFactoryResponse" />

<router method="getDestinationChannel"
    input-channel="channelSConnectionFactoryRequest">
        <beans:bean class="org.mbracero.integration.CustomRouter" />
</router>

<beans:bean id="customSerializerDeserializer"
    class="org.mbracero.integration.serialization.CustomSerializerDeserializer" />

<int-ip:tcp-connection-factory id="customConnectionFactory"
    type="server" port="${payment.port}" single-use="true"
    serializer="customSerializerDeserializer"
    deserializer="customSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="customInboundGateway"
    connection-factory="customConnectionFactory"
    request-channel="channelCustomConnectionFactoryRequest"
    reply-channel="channelCustomConnectionFactoryResponse"
    error-channel="errorChannel" />

<!-- Custom -->

<beans:bean id="operations"
    class="org.mbracero.integration.applepay.impl.OperationsImpl" />

<!-- Operation One -->
<int:channel id="operationOneRequest" />

<int:service-activator input-channel="operationOneRequest"
    output-channel="operationOneResponse" ref="operations" method="getOperationOne" />

<!-- Operation Two -->
<int:channel id="operationTwoRequest" />

<int:service-activator input-channel="operationTwoRequest"
    output-channel="operationTwoResponse" ref="operations" method="getOperationTwo" />
resulttone&ResultTwo实现ResultBase。在customSerializerDeserializer的序列化中,我有:

@Override
public void serialize(ResultBase arg0, OutputStream arg1) throws IOException {

    byte[] xxx = XXX.getBytes();
    arg1.write(xxx);

    byte[] yyy = yyy.getBytes();
    arg1.write(senderName);

    // **Each custom object have a method for serialize their own data**
    arg0.transformDataToByte(arg1);

    arg1.flush();
}
在客户端:

<gateway id="tmGateway"
    service-interface="org.mbracero.integration.CustomGateway" />

<beans:bean id="operationOneSerializerDeserializer"
    class="org.mbracero.integration.serialization.OperationOneSerializerDeserializer" />

<int-ip:tcp-connection-factory id="operationOneFactory"
    type="client" host="127.0.0.1" port="7878" single-use="true"
    serializer="operationOneSerializerDeserializer" deserializer="operationOneSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="operationOneOutGateway"
    request-channel="operationOneChannel" connection-factory="operationOneFactory"
    request-timeout="5000" reply-timeout="5000" remote-timeout="5000" />


<beans:bean id="operationTwoSerializerDeserializer"
    class="org.mbracero.integration.operationTwoRequestSerializerDeserializer"/>

<int-ip:tcp-connection-factory id="operationTwoFactory"
    type="client" host="127.0.0.1" port="7878" single-use="true"
    serializer="operationTwoSerializerDeserializer"
    deserializer="operationTwoSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="operationTwoOutGateway"
    request-channel="operationTwoChannel" connection-factory="operationTwoFactory"
    request-timeout="50000" reply-timeout="50000" remote-timeout="50000" />

不能有两个服务器连接工厂在同一端口上侦听。TCP不允许这样做-网络堆栈不知道将请求路由到哪个服务器套接字

客户端没有问题,但是,使用单个套接字时,服务器必须了解如何反序列化这两种数据类型


将两个序列化器/反序列化器合并为一个可能会更容易,在消息的两侧添加另一个标头,以便反序列化器知道要解码的负载类型。

谢谢Gary,但现在我在连接工厂的结果和序列化方面遇到了一个新问题。在没有功能的情况下,通过编辑实现相互作用的目标。它显示了一个错误,如“否”无法从项转换为结果;代码、日志和堆栈跟踪-编辑问题-它们在注释中表现不好。翻译:我认为返回实现相同接口的对象是可行的,但在最初的问题中不起作用,因为您有两个反序列化程序;一个用于项目,一个用于结果。看起来您在新的通用反序列化程序中将它们混合在一起,但您没有显示代码或堆栈跟踪。我使用operationOne&operationOne/requestOne&ResultOne编辑了下面的内容。我已经删除了旧代码…但您仍然没有显示失败的代码或堆栈跟踪;如果你不满足我的要求,我帮不了你。
<gateway id="tmGateway"
    service-interface="org.mbracero.integration.CustomGateway" />

<beans:bean id="operationOneSerializerDeserializer"
    class="org.mbracero.integration.serialization.OperationOneSerializerDeserializer" />

<int-ip:tcp-connection-factory id="operationOneFactory"
    type="client" host="127.0.0.1" port="7878" single-use="true"
    serializer="operationOneSerializerDeserializer" deserializer="operationOneSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="operationOneOutGateway"
    request-channel="operationOneChannel" connection-factory="operationOneFactory"
    request-timeout="5000" reply-timeout="5000" remote-timeout="5000" />


<beans:bean id="operationTwoSerializerDeserializer"
    class="org.mbracero.integration.operationTwoRequestSerializerDeserializer"/>

<int-ip:tcp-connection-factory id="operationTwoFactory"
    type="client" host="127.0.0.1" port="7878" single-use="true"
    serializer="operationTwoSerializerDeserializer"
    deserializer="operationTwoSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="operationTwoOutGateway"
    request-channel="operationTwoChannel" connection-factory="operationTwoFactory"
    request-timeout="50000" reply-timeout="50000" remote-timeout="50000" />
@Gateway(requestChannel="operationOneChannel")
OperationOneResponse sendOperationOne(OperationOneRequest request);

@Gateway(requestChannel="operationTwoChannel")
OperationTwoResponse sendOperationTwo(OperationTwo request);