【问题标题】:spring integration tcp in-bound block when deserializerd反序列化时弹簧集成tcp入站块
【发布时间】:2014-04-17 03:09:40
【问题描述】:

反序列化器类是:

public class XmlPatternPacketSerializerDeserializer implements Serializer<Document>,
    Deserializer<Document> {

protected final Log logger = LogFactory.getLog(this.getClass());

@Override
public Document deserialize(InputStream inputStream) throws IOException {
    logger.info("begin deserialize...");

    DocumentBuilderFactory builderFactory = DocumentBuilderFactory
            .newInstance();
    builderFactory.setNamespaceAware(true);
    Document packetDoc = null;
    InputSource in = readSocketInputStream(inputStream);
    try {
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        packetDoc = builder.parse(in);
    } catch (Exception e) {
        logger.error(e);
    }

    System.out.println("build id >>> " + packetDoc.getElementsByTagName("building_id").item(0).getTextContent());
    return packetDoc;
}

@Override
public void serialize(Document object, OutputStream outputStream)
        throws IOException {
    // TODO Auto-generated method stub

}


private InputSource readSocketInputStream(InputStream inputStream) throws IOException {
    StringBuffer sb = new StringBuffer();
    int i = -1;
    while((i = inputStream.read())!=-1){
        sb.append((char)i);
    }
    System.out.println(sb.toString());
    return new InputSource(new StringReader(new     String(sb.toString().getBytes("UTF-8"))));
}
}

数据报包是xml格式,当服务器接收数据时,我想反序列化为一个文档对象。但不幸的是,反序列化时线程被阻塞了。 请帮忙。 集成xml配置在这里:

<bean id="xmlPatternPacketSerializerDeserializer"
    class="org.springframework.integration.samples.tcpclientserver.XmlPatternPacketSerializerDeserializer" />
<int-ip:tcp-connection-factory id="serverConnectionFactory"
    type="server" using-nio="true" port="${availableServerSocket}" deserializer="xmlPatternPacketSerializerDeserializer"/>
<int-ip:tcp-inbound-channel-adapter id="tcpInbound" channel="tcpReceive"
    connection-factory="serverConnectionFactory"/>
<int:service-activator id="tcpHandler" input-channel="tcpReceive"
    ref="tcpListener"/>

数据包在这里:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<common>
    <building_id>320411D001</building_id>
    <gateway_id>320411D00101</gateway_id>
    <type>continuous</type>
</common>
<data operation="continuous">
    <sequence>1</sequence>
    <parser>yes</parser>
    <total>5319</total>
    <current>93</current>
    <time>20130820160405</time>
    <meter id="0001" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">301.83
        </function>
    </meter>
    <meter id="0002" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">73.49
        </function>
    </meter>
    <meter id="0003" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">5.16
        </function>
    </meter>
    <meter id="0004" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">381.72
        </function>
    </meter>
    <meter id="0005" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">27.67
        </function>
    </meter>
    <meter id="0006" type="000001">
        <function id="01" coding="01A10" error="0" unit="kWh">36.41
        </function>
    </meter>
    <meter id="0007" type="000001">
        <function id="01" coding="01A10" error="0" unit="kWh">110.03
        </function>
    </meter>
    <meter id="0008" type="000001">
        <function id="01" coding="01A30" error="0" unit="kWh">192.25
        </function>
    </meter>
    <meter id="0009" type="000001">
        <function id="01" coding="01A10" error="0" unit="kWh">308.17
        </function>
    </meter>
    <meter id="0010" type="000001">
        <function id="01" coding="01C20" error="0" unit="kWh">0.00
        </function>
    </meter>
    <meter id="0011" type="000001">
        <function id="01" coding="01A20" error="0" unit="kWh">1305.52
        </function>
    </meter>
    <meter id="0012" type="000001">
        <function id="01" coding="01C10" error="0" unit="kWh">0.00
        </function>
    </meter>
    <meter id="0013" type="000001">
        <function id="01" coding="01C10" error="0" unit="kWh">492.67
        </function>
    </meter>
    <meter id="0014" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">6009.05
        </function>
    </meter>
    <meter id="0015" type="000001">
        <function id="01" coding="01D10" error="0" unit="kWh">62.60
        </function>
    </meter>
    <meter id="0016" type="000002">
        <function id="01" coding="01000" error="0" unit="kWh">237009.5
        </function>
        <function id="02" coding="00000" error="0" unit="">0.265
        </function>
        <function id="03" coding="00000" error="0" unit="">49.99
        </function>
        <function id="04" coding="00000" error="0" unit="W">500.0
        </function>
        <function id="05" coding="00000" error="0" unit="V">233.99
        </function>
        <function id="06" coding="00000" error="0" unit="V">233.69
        </function>
        <function id="07" coding="00000" error="0" unit="V">233.50
        </function>
        <function id="08" coding="00000" error="0" unit="A">0.000
        </function>
        <function id="09" coding="00000" error="0" unit="A">0.000
        </function>
        <function id="10" coding="00000" error="0" unit="A">8.600
        </function>
    </meter>
</data>
</root>

【问题讨论】:

  • 请原谅我的英语很差

标签: spring spring-integration


【解决方案1】:

这意味着反序列化器没有获取所有数据,正在等待更多数据。

在连接工厂上设置 so-timeout 以验证和/或使用调试器进入builder.parse(in);

【讨论】:

  • 我遗漏了一些客户端在间隔发送数据的消息。任何好的建议
  • 我不明白为什么需要等到客户端关闭
  • 我好像知道为什么服务器一直在等待。因为是长连接,服务器没有确认天气客户端的数据都来了。是吗?
  • 如果你不按照我的建议去做,我帮不了你。我怀疑packetDoc = builder.parse(in) 正在等待更多数据;设置so-timeout 将帮助您发现这一点。
【解决方案2】:

我的建议是首先将套接字流中的数据读取到String 中,如果流的结尾由&lt;/root&gt; 表示,则在将读取的数据(即字符串)传递给之前关闭套接字

Document document = builder.parse( new InputSource( new StringReader(string ) ) );

如果您的服务器继续传输许多 xml 消息,那么您可以构建 String 对象的数组,直到服务器通过关闭套接字完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2015-08-18
    • 2018-04-08
    相关资源
    最近更新 更多