【问题标题】:Posting plain text to ActiveMQ from WSO2 proxy从 WSO2 代理向 ActiveMQ 发布纯文本
【发布时间】:2014-10-02 18:56:11
【问题描述】:

我是WSO2和ActiveMQ的新手,一直在尝试实现一个看似简单的消息转换,但没有成功。 我需要在 WSO2 上公开一个 Web 服务,该服务将仅采用一个特定输入参数的值(三个), 并将该值作为纯文本字符串转发到 ActiveMQ 队列。所以,没有后端服务,没有对进程的响应, 在发布到队列之前,只需要一个简单的单向转发操作即可提取值并转换为纯文本。 我已经通过代理示例和很多谷歌搜索,但是,我所管理的最多的是在队列中获得所需的值, 但作为一个POX,那是不能令人满意的。 实际上我怀疑 WSO2 是否能够发布纯文本字符串, 然而,在有些文章中,人们发誓它几乎可以做任何可以想象的事情,只是他们没有具体解释如何。

我所做的是使用 PayloadFactory 调解器提取所需的值“arg2”, 到<xdr> 元素中(因为 PayloadFactory 坚持使用 XML 或 JSON 格式,不允许纯文本)。 然后我将该元素发送到队列。问题 #1 是 WSO2 是否可以以某种方式自动将该 xml 转换为纯文本? 目前我认为没有。

所以,在发送之前,我已经尝试了很多方法来在没有任何 xml 标记的情况下获取该值, 主要使用 Enrich 中介,甚至是 Javascript,但在某一时刻,事情会失败——要么 WSO2 不允许我定义这样的中介, 或者它根本无法按预期/要求执行,或者在运行时失败。 丰富的调解员也没有真正清楚地解释-“来源”是什么意思, 以及所有这些选项的“目标”是什么 - 无论我选择什么选项,我从未见过 Enrich 调解员对我的信息进行任何更改。 请问我做错了什么? :)

下面是我当前的 WSO2 代理定义,它现在包含了我迄今为止从网上编译的几乎所有内容, 但它仍然只将值格式发布到队列中 - 所以这只是我迄今为止尝试过的一个说明:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="VomsXdrPlain"
       transports="http"
       statistics="disable"
       trace="enable"
       startOnLoad="true">
   <target>
      <inSequence>
         <!-- first, the extraction -->
         <payloadFactory media-type="xml">
            <format>
               <xdr xmlns="">$1</xdr>
            </format>
            <args>
               <arg xmlns:xsd="http://api.service.com/"
                    evaluator="xml"
                    expression="//xsd:arg2"/>
            </args>
         </payloadFactory>
         <!-- the following was added out of desperation -->
         <property name="OUT_ONLY" value="true"/>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
         <property name="FORCE_POST_PUT_NOBODY"
                   value="true"
                   scope="axis2"
                   type="BOOLEAN"/>
         <!-- here the idea was to put the value into a property, so it might be used in the Enrich mediator -->
         <property name="xdrTicket"
                   expression="//xdr/text()"
                   scope="default"
                   type="STRING"/>

         <!-- how to use the Enrich mediator properly for this purpose? -->
         <enrich>
            <source type="property" clone="true" property="xdrTicket"/>
            <target type="body"/>
         </enrich>

         <!-- then I tried scripting... but the setPayLoadXML method also insists on tags so I've put "abc" -->
         <script language="js">
             var xmlPayload = mc.getPayloadXML();
         var xdrTick = xmlPayload.substr(0,36);
         mc.setPayloadXML(<abc>{xdrTick}</abc> );
         </script>

         <!-- this is posting to the queue and it works, but again, allowed formats are only POX, SOAP, REST, or AS-IS... but no PLAIN TEXT -->
         <send>
            <endpoint>
               <address uri="jms:/VomsXdrService?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616&amp;transport.jms.DestinationType=queue"
                        format="pox"/>
            </endpoint>
         </send>
      </inSequence>
   </target>

   <parameter name="transport.jms.ContentType">
      <rules xmlns="">
         <jmsProperty>contentType</jmsProperty>
         <default>text/plain; charset=ISO-8859-1</default>
      </rules>
   </parameter>
   <parameter name="ContentType" value="text/plain"/>
   <parameter name="transports">jms</parameter>
   <description/>
</proxy>

请求如下:

<body>
   <p:writeXDRRequest xmlns:p="http://api.service.com/">
      <xsd:arg0 xmlns:xsd="http://api.service.com/">VOMS</xsd:arg0>
      <xsd:arg1 xmlns:xsd="http://api.service.com/">SDR</xsd:arg1>
      <xsd:arg2 xmlns:xsd="http://api.service.com/">1.0|321|2014-09-24T13:25:19.183+0000</xsd:arg2>
   </p:writeXDRRequest>
</body>

在队列中,只需要 arg2 的值,纯文本,没有任何标签:

1.0|321|2014-09-24T13:25:19.183+0000

【问题讨论】:

    标签: wso2 activemq esb


    【解决方案1】:
    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="VomsXdrPlain"
           transports="http"
           statistics="disable"
           trace="enable"
           startOnLoad="true">
       <target>
          <inSequence>
             <payloadFactory media-type="xml">
                <format>
                    <text xmlns="http://ws.apache.org/commons/ns/payload">$1</text>
                </format>
                <args>
                   <arg xmlns:xsd="http://api.service.com/"
                        evaluator="xml"
                        expression="//xsd:arg2"/>
                </args>
             </payloadFactory>
             <property name="OUT_ONLY" value="true"/>
             <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
             <property name="messageType" value="text/plain; charset=windows-1252" scope="axis2"/>
             <!-- this is posting to the queue and it works, but again, allowed formats are only POX, SOAP, REST, or AS-IS... but no PLAIN TEXT -->
             <send>
                <endpoint>
                   <address uri="jms:/dynamicQueues/TestQueue?transport.jms.ConnectionFactory=myQueueConnectionFactory"/>
                </endpoint>
             </send>
          </inSequence>
       </target>
       <description/>
    </proxy>
    

    https://docs.wso2.com/display/ESB481/Converting+the+SOAP+Messages+to+Plain+Text+Mail

    【讨论】:

    • 抱歉,缺少 messageType 属性定义,我已经更新了答案
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多