我是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&disconnectOnNoReply=false&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中的ConnectionlessBootstrap
和org.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构建大批量数据处理工具 - javaClosed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。 3年前关闭。 Improve this question 我正在尝试使用Java构建ETL工具。 ETL工具用于对大量数据(关系型和其他类型)进行批量读取,…