Camel Netty UDP侦听器在0.0.0.0上侦听并且未接收到数据包 - java

我是Camel,Netty和UDP的新手,但我已经对此进行了一段时间的研究,但仍然不知道发生了什么。

我要做的就是使用Camel和Netty实现UDP侦听器(当前在Windows 7上,但会将项目迁移到Linux)。我的spring配置如下:

<camel:camelContext id="test">
    <camel:route>
        <camel:from uri="netty:udp://localhost:5150?sync=false"/>
        <camel:to uri="log:cameltest?level=DEBUG"/>     
        <camel:to uri="file://outbox"/>
    </camel:route>
</camel:camelContext>

侦听器似乎可以正常启动(通过Eclipse运行)。但是,当我执行netstat时,会看到以下内容:

UDP    0.0.0.0:5150
UDP    [::ffff:127.0.0.1]:5150

当我期望它正在监听127.0.0.1时。如果这是Camel / Netty / UDP的预期行为,那么我在网上阅读的所有内容都不清楚。

我正在通过从Java NIO UDP客户端发送进行测试。如果NIO UDP服务器正在侦听,它会收到很好的数据包(全部通过本地主机完成)。

我还测试了一个Camel / Netty / TCP侦听器,并且工作正常。

为什么监听器监听所有本地地址?如果是这样,为什么它不从本地主机接收我的数据包?

java大神给出的解决方案

我想到了。这是我最后的春季背景:

<bean class="org.jboss.netty.handler.codec.string.StringDecoder" id="stringDecoder">
    <constructor-arg value="ISO_8859_1" />
</bean>

<camel:camelContext id="test">
    <camel:route>
        <camel:from uri="netty:udp://localhost:5150?decoder=#stringDecoder&amp;disconnectOnNoReply=false&amp;sync=false"/>
        <camel:to uri="log:cameltest?level=DEBUG"/>     
        <camel:to uri="file://outbox"/>
    </camel:route>
</camel:camelContext>

在对UDP和Netty进行了一些研究之后,我发现监听0.0.0.0:[port#]似乎是Netty / UDP的默认行为。有关0.0.0.0含义的更多信息,请see this link。

一位程序员的同伴建议(因为我本质上是在框架中使用框架),因此请取出骆驼的东西并尝试使其在Netty中工作。我尝试了一下,就可以使它正常工作,并且还可以从我的NIO UDP客户端发送给它。有一阵子我以为问题出在骆驼上,因为我看不到Netty实现有什么问题。

在Netty / UDP,Camel / TCP和“损坏的” Camel / UDP中进行了数小时的逐步调试之后,我注意到Camel Netty实现使用了ConnectionlessBootstrap包中的org.jboss来绑定连接。在我的Netty实现中,我使用的是Bootstrap包中的io.netty

我找到了一个使用http://massapi.com/class/org/jboss/netty/bootstrap/ConnectionlessBootstrap.java.html中的ConnectionlessBootstraporg.jboss包的示例。当它开始工作时,我将实现与我的进行了比较,发现他的两端都有编码器和解码器。在这里,我想到了将CharsetUtil.ISO_8859_1解码器添加到侦听器并设法使项目正常运行的想法。

我还注意到我一次只能发送一次。将属性disconnectOnNoReply设置为false允许侦听器多次接收而不会断开连接。

希望这对以后的人有所帮助。 🙂

[edit]实际上,在进一步测试之后,可能不需要“ disconnectOnNoReply”。我只是尝试了没有它,它的工作原理。

如何在Java中以语言环境正确的顺序格式化日期和月份? - java

有没有一种方法可以用Java / Kotlin中的区域设置正确的格式格式化日和月(以紧凑格式)而不格式化年份?因此,对于英语,应为“ 9月20日”,而对于瑞典语为“ 9月20日”。为了进行比较,在Cocoa平台上,我可以执行以下操作(在Swift中):let formatter = DateFormatter() formatter.locale = Loc…

DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java

以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…

如何在JAVA中传递以逗号分隔的值作为函数参数的字符串 - java

我有一个可以接受任何数量的INTEGER参数的方法:pages(int,int...)此方法是选择PDF文件的某些页面。以以下字符串类型存储的书页:String pages = "1,2,3,6,9"; 我想将此字符串作为方法的参数看起来像:pages(1,2,3,6,9); java大神给出的解决方案 使用流可以很容易地做到这一点:St…

如何修改休眠的SQL查询? - java

我有点好奇,有没有办法修改hibernate的核心,以便我可以自定义生成的SQL query。例如,在生成的查询中添加功能以使用connect by prior(oracle)或我要自定义的任何其他子句。 java大神给出的解决方案 起初,这样的问题总是在我心中敲响警钟。你被警告了...AFAIK,hibernate使用所谓的dialects进行特定的优化。…

用Java构建大批量数据处理工具 - java

Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。 3年前关闭。 Improve this question 我正在尝试使用Java构建ETL工具。 ETL工具用于对大量数据(关系型和其他类型)进行批量读取,…