如何在WSO2 ESB中调解纯TCP消息

时间:2014-02-20 20:56:50

标签: tcp wso2 wso2esb esb broker

我有一个应用程序(比方说,TcpApp)发送纯TCP消息(即没有SOAP,没有信封......只是一个原始字符串甚至是字节)。我需要连接ESB以通过特定端口(例如,3333)监听这些消息,并进行一些调解(现在,只做日志记录就足够了)。我认为从TcpApp创建ActiveMQ队列然后在ESB中从JMS创建代理服务(而不是直接将ESB连接到TcpApp)是个好主意。 我阅读了几个示例和答案,但始终是XML,TCP只是传输。有时会发生的是应用程序不通过TCP发送特殊格式(有时称为电报)。 我试图更改内容类型,但ESB仍然拒绝读取TCP端口。

<parameter name="transport.tcp.contentType">text/plain</parameter>

可能我仍然对解决方案的体系结构感到困惑,但我认为像这个TcpApp这样的经纪人,或像WSO2这样的ESB应该可以作为中介。我更喜欢先解析解决方案,以获得真正的配置以使其工作。 所有评论,欢迎!

2 个答案:

答案 0 :(得分:0)

在WSO2 EI 6.1.1中,我发现如果我还指定了recordDelimiter和recordDelimiterType,我可以成功处理纯文本TCP消息。工作代理的示例(换行符作为分隔符):

@bill_area_char = BillsPayment.joins(:bill).where(payed: false,date: from_date..to_date, active: true).group('MONTH(date)','bills.car_name').sum(:price)
result = Hash[Date::MONTHNAMES.compact.map {|x|[x,[]]}]
months = Hash[(1..12).zip Date::MONTHNAMES.compact]
@bill_area_char.each { |k, v| result[months[k[0]]] << {k[1]=>v} }

输入序列中的消息正文如下所示:

<parameter name="transport.tcp.responseClient">true</parameter>
<parameter name="transport.tcp.inputType">binary</parameter>
<parameter name="transport.tcp.recordDelimiter">0x0A</parameter>
<parameter name="transport.tcp.contentType">text/plain</parameter>
<parameter name="transport.tcp.port">50001</parameter>
<parameter name="transport.tcp.recordDelimiterType">byte</parameter>

答案 1 :(得分:0)

您需要使用正确的消息格式化程序和构建器来处理任何事情。在axis2.xml文件中使用以下格式化程序。

<messageFormatter contentType="application/binary" class="org.wso2.carbon.relay.ExpandingMessageFormatter"/>
<messageBuilder contentType="application/binary" class="org.wso2.carbon.relay.BinaryRelayBuilder"/>

只需更改您喜欢的内容类型,并在代理服务配置中使用相同的内容类型。实际上我也有一篇关于此的博文[1]:)

[1] - http://soatechflicks.blogspot.com/2017/05/processing-binary-data-from-tcp.html