Java Camel Netty未从文件发送到UDP
我可以使用Camel-Netty成功读取文件并通过UDP发送内容,但前提是在通过UDP发送之前在处理器中修改消息内容 我有一个简单的类要演示,它有两条驼峰路线:Java Camel Netty未从文件发送到UDP,java,udp,apache-camel,netty,Java,Udp,Apache Camel,Netty,我可以使用Camel-Netty成功读取文件并通过UDP发送内容,但前提是在通过UDP发送之前在处理器中修改消息内容 我有一个简单的类要演示,它有两条驼峰路线: 从“收件箱”目录中读取一个文件(我使用的测试文件很小,小于50字节),将其写入“发件箱”目录,然后通过UDP发送 从UDP读取并简单地处理消息(在本例中,只需打印出一些行) 将文件写入发件箱似乎总是可行的(对我来说,这意味着驼峰连接是正常的),但只有在我手动更新消息内容的情况下,通过UDP发送似乎才可行。代码如下,我已尝试了以下操作:
- 按原样编码(处理器被注释掉)
- 文件写入发件箱(内容与输入文件匹配)
- 通过UDP未收到任何内容
- 处理器未注释,只是在.setBody中执行(“blah”);
- 文件被写入发件箱(内容为“blah”)
- 通过UDP接收的消息“blah”
- 处理器未注释,只是在.setBody(in.getBody())中执行;
- 文件写入发件箱(内容与输入文件匹配)
- 通过UDP未收到任何内容
- 处理器未注释,只执行System.out.println(“从文件中读取[“+in+””);
- 文件写入发件箱(内容与输入文件匹配)
- 通过UDP未收到任何内容
- “从文件读取[test.txt]”行被打印多次
- 处理器未注释,在.setBody(in.getBody()+“…Blah”)中执行;
- 虽然文件内容是“GenericFile[test.txt]…Blah”(输入文件名是test.txt),而不是实际的文件内容,但该文件是编写的
- 通过UDP接收数据(同样是“GenericFile[test.txt]”等等),而不是实际的文件内容
您的文件有多大?UDP消息中的最大负载限制约为64K。我不确定如果您尝试写入比该限制更大的缓冲区会发生什么情况。此外,大型UDP消息将被底层传输分割(每个以太网帧约1460字节)。如果其中一个片段在网络上丢失,则整个UDP消息将被丢弃。@johnslr-对于我正在使用的测试文件来说,文件大小很小-小于50字节,只有几行文本。我添加了另一个测试用例,试图证明大小不是问题所在-但这只会导致更混乱的行为。。。(参见问题中的更新)检查getIn().getBody()的返回类型。我不太熟悉Camel,但它是否返回一个文件对象作为引用,而不是实际的文件体?Camel网站上的ETL示例引用了convertBodyTo(…)可能加载文件的步骤。或者,您可能需要在处理器中手动加载文件。
public class App {
public static void main(String[] args) throws Exception {
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
public void configure() {
from("file://inbox?noop=true")
// .process(new Processor() {
// public void process(Exchange exchange) {
// Message in = exchange.getIn();
// in.setBody("blah");
// in.setBody(in.getBody());
// System.out.println("Read [" + in + "] from file");
// }
// })
.to("file://outbox")
.to("netty:udp://localhost:9999/");
}
});
context.addRoutes(new RouteBuilder() {
public void configure() {
from("netty:udp://localhost:9999/")
.process(new Processor() {
public void process(Exchange exchange) {
Message in = exchange.getIn();
System.out.println("Got [" + in.getBody() + "] over UDP");
}
});
}
});
context.start();
Thread.sleep(5000);
context.stop();
}
}