如何使用Apache Camel

时间:2018-07-18 19:10:01

标签: tcp apache-camel

我看到了许多使用Apache Camel通过TCP连接发送或接收数据的示例,只要数据是文本。例如,设置端点,例如netty:tcp://localhost:5000?textline=true。这里要注意的重要事项是选项textline=true的用法。当您处理文本时,这种方法效果很好,如果只是字节,则效果不是很大。

我如何做同样的事情,除了发送二进制数据(它不是序列化的Java对象)而不是文本?从我发现的情况来看,似乎需要指定要使用的编解码器(而不是使用textline=true时的默认文本编解码器),但是我不知道该怎么做。

在Camel网站或其他任何地方都找不到如何执行此操作的好例子。

更新 [2018年7月19日星期四10:43:10 EDT]:

我设法取得了一定程度的成功。我创建了一个简单的DataFormat并将其插入流中:

public class ByteArrayFormat implements DataFormat {
  @Override
  public void marshal(Exchange exchange, Object object, OutputStream ostream) throws Exception {
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, object);
    ostream.write(bytes);
  }
  @Override
  public Object unmarshal(Exchange exchange, InputStream istream) throws Exception {
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, istream);
    return bytes;
  }
}

我不是100%确信这行得通,因为我可能一直都只是在看解长官。欢迎任何建议或更正。

然后我修改了路线,如下所示:

    public void configure() {
      from("netty4:tcp://localhost:5000?allowDefaultCodec=false&sync=false").unmarshal(new ByteArrayFormat())
          .process(processor).to("file://test");
    }

测试“处理器”无非是从交换中获取输入流并将数据十六进制转储到控制台。 “收件人”只是将其获取的内容放在文件中,因此我也可以在那里查看它。

然后,我做了一个简单的测试,通过管道传输二进制文件的内容(通过nc),然后观察发生了什么。据我所知,我以字节为单位接收了文件数据。

尽管有一个主要警告。结果被分解为1024个字节的块(我认为这是网络堆栈所施加的限制),因此3862个字节的原始文件作为四个“接收”的1024个字节的块(实际上是3 x 1024 + 790)而出现。关于如何将其“缝合”在一起的任何想法或建议都会有所帮助。

0 个答案:

没有答案