TCP按字节

时间:2015-07-06 09:51:28

标签: java spring-integration

我有客户端配置:

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

<int-ip:tcp-connection-factory id="clientRequestData"
    type="client" host="${clientRequestData.host}" port="${clientRequestData.port}" single-use="true"
    serializer="itemSerializerDeserializer" deserializer="resultSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="requestDataOutGateway"
    request-channel="requestData" connection-factory="clientRequestData"
    request-timeout="10000" reply-timeout="10000" remote-timeout="10000" />

SimpleGateway:

public interface SimpleGateway {
     @Gateway(requestChannel="requestData")
     Result sendData(Item item);
}

服务器配置:

<int:channel id="channelServerRequestData" />
<int:channel id="channelServerResponseData" />

<beans:bean id="requestService" class="org.mbracero.integration.RequestService" />

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

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

<int-ip:tcp-inbound-gateway id="TCPInboundGateway"
    connection-factory="requestDataServer" request-channel="channelServerRequestData"
    reply-channel="channelServerResponseData" error-channel="errorChannel" />

RequestService:

@Service
public class RequestService {
@ServiceActivator(inputChannel="channelServerRequestData", outputChannel="channelServerResponseData")
public Result requestData(Item input) {
    System.out.println("Input :::: " + input);
    Result ret = new Result("AAA", "DDDD");
    System.out.println("Ret :::: " + ret);
    return ret;
  }
}

ItemSerializerDeserializer:

public class ItemSerializerDeserializer implements Serializer<Item>, Deserializer<Item> {
(...)
}

ResultSerializerDeserializer:

public class ResultSerializerDeserializer implements Serializer<Result>, Deserializer<Result> {
(...)
}

现在我必须添加一些标题(发送和检索),但我需要像上面写的自定义序列化器/反序列化器一样。

例如,我需要发送下一个标题:

  • 发行人:4个字节。初始位置1 - 最终位置4
  • 客户端:4个字节。 Ini pos 5 - final pos 8
  • 产品:2个字节。 Ini pos 9 - final pos 10
  • 类型:3个字节。 Ini pos 11 - final pos 13
  • (...)

我已经按字节和位置发送和检索这些标题(没有名称/值,如Map)。

使用我的自定义序列化器/反序列化器,我可以使用有效负载,但我不知道如何使用标头。

我已经阅读了有关属性映射器的内容,但我不知道我是否以正确的方式。

在客户端配置中,例如:

(...)
<int-ip:tcp-connection-factory id="clientRequestData"
    type="client" host="${clientRequestData.host}" port="${clientRequestData.port}" single-use="true"
    serializer="itemSerializerDeserializer" deserializer="resultSerializerDeserializer"
    mapper="mapper" />

<beans:bean id="mapper"
      class="org.springframework.integration.ip.tcp.connection.MessageConvertingTcpMessageMapper">
    <beans:constructor-arg name="messageConverter">
        <beans:bean class="??????????"/>
    </beans:constructor-arg>
</beans:bean>
(...)

任何帮助?

提前致谢。

1 个答案:

答案 0 :(得分:0)

MessageConvertingTcpMessageMapperMapMessageConverter一起使用。

一般的想法是,出站,转换器将Message转换为包含所有Mapheaders的{​​{1}},并且序列化程序将地图序列化为{ {1}}。您可以告诉payload您希望在地图中包含哪些标题,以便您可以在序列化程序中访问它们。

在入站方,反序列化器会从byte[]创建MapMessageConverter,然后Map会将地图转换为byte[]

有关示例,请参阅MapJsonSerializer

另见this test case

修改

这是一个天真的实现(没有错误检查或输出长度检查)......

MessageConverter.toMessage()

Message一起使用时,Spring Integration标题将与数据一起传送到另一侧,他将解码数据并使用这些标题创建入站消息。