Netty4 - TCP服务器 - 使用Camel进行基本测试

时间:2015-12-06 21:46:26

标签: java maven tcp apache-camel netty

我是初学者学习Camel并尝试使用apache蓝图在camel上运行netty4。 我正在使用netty创建一个TCP服务器:

  <camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="timerToLog">
      <from uri="netty4:tcp://localhost:5150"/>
      <log message="The message contains ${body}"/>
      <to uri="mock:result"/>
    </route>
  </camelContext>

当我使用mvn:

运行camel时,一切正常
[         Blueprint Extender: 1] TCPNettyServerBootstrapFactory INFO  ServerBootstrap binding to localhost:5150
[         Blueprint Extender: 1] NettyConsumer                  INFO  Netty consumer bound to: localhost:5150
[         Blueprint Extender: 1] BlueprintCamelContext          INFO  Route: timerToLog started and consuming from: Endpoint[tcp://localhost:5150]

我使用Hercules连接到tcp服务器并发送数据(甚至尝试过windows telnet),并且一发送&#34; Hello&#34; ascii文本,连接因以下错误而关闭:

[d #0 - NettyEventExecutorGroup] NettyConsumer                  WARN  Closing channel as an exception was thrown from Netty. Caused by: [io.netty.hand
ler.codec.TooLongFrameException - Adjusted frame length exceeds 1048576: 1212501072 - discarded]
io.netty.handler.codec.TooLongFrameException: Adjusted frame length exceeds 1048576: 1212501072 - discarded
        at io.netty.handler.codec.LengthFieldBasedFrameDecoder.fail(LengthFieldBasedFrameDecoder.java:499)
        at io.netty.handler.codec.LengthFieldBasedFrameDecoder.failIfNecessary(LengthFieldBasedFrameDecoder.java:477)
        at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:403) ... 

我只发送&#34;你好&#34;在插座上,它仍然表示帧长度超过..! 我知道遗漏了一些非常基本的东西。请耐心帮助:)

1 个答案:

答案 0 :(得分:4)

根据Camel Netty4 Component文档,如果url的textline参数为NULL,则它会安装并使用默认的编码器/解码器。这相当于使用textline=false这是默认行为。

在你的例子中,你有这个用于netty4组件:

 <from uri="netty4:tcp://localhost:5150"/>

因此,您使用的默认编码器/解码器可能不是基于文本行的编码器/解码器。你可能会发现哪个是文档中的默认编码器,但我认为你可以通过查找这些信息来学习更多信息。

请记住,Netty使用编码器和解码器的概念向客户端和服务器发送数据或从客户端和服务器接收数据。这些解码器定义了Netty应如何从套接字读取原始数据。如果您对此不熟悉,可以获得大量关于Netty的文档。

让我们看看如何实现一个简单的基于文本行的协议编码器/解码器,就像你想要实现的那样。

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route id="timerToLog">
  <from uri="netty4:tcp://localhost:5150?textline=true"/>
  <log message="The message contains ${body}"/>
  <to uri="mock:result"/>
</route>

你所缺少的只是编码器位。