Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Camel Netty未从文件发送到UDP_Java_Udp_Apache Camel_Netty - Fatal编程技术网

Java Camel Netty未从文件发送到UDP

Java Camel Netty未从文件发送到UDP,java,udp,apache-camel,netty,Java,Udp,Apache Camel,Netty,我可以使用Camel-Netty成功读取文件并通过UDP发送内容,但前提是在通过UDP发送之前在处理器中修改消息内容 我有一个简单的类要演示,它有两条驼峰路线: 从“收件箱”目录中读取一个文件(我使用的测试文件很小,小于50字节),将其写入“发件箱”目录,然后通过UDP发送 从UDP读取并简单地处理消息(在本例中,只需打印出一些行) 将文件写入发件箱似乎总是可行的(对我来说,这意味着驼峰连接是正常的),但只有在我手动更新消息内容的情况下,通过UDP发送似乎才可行。代码如下,我已尝试了以下操作:

我可以使用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();
        }
    }