我看到了许多使用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)而出现。关于如何将其“缝合”在一起的任何想法或建议都会有所帮助。