【问题标题】:Correct configuration for transport Sender & Receiver JMS?传输发送方和接收方 JMS 的正确配置?
【发布时间】:2025-12-04 18:45:01
【问题描述】:

我有一些问题,因为文档不清楚..

我应该如何设置 WSO2 ESB 环境才能从 WSO2 MessageBroker 读取和写入消息。

我关注了ConfigurewithWSO2MessageBroker

  1. 我在同一台服务器上有 ESB 和 MB(MB 有 Offset=2) /repository/conf/axis2/axis2.xml

....

<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
        <parameter name="JMSTopic" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
        </parameter>

        <parameter name="JMSQueue" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
           <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        </parameter>

        <parameter name="default" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        </parameter>
    </transportReceiver>

...

和发件人部分

<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">    
      <parameter name="default" locked="false">
                 <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
                 <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
                 <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">ConnectionFactory</parameter>
          </parameter>        
     </transportSender>

jndi.properties 文件

connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'
connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'
connectionfactory.ConnectionFactory      = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'

queue.myQueue = myQueue
queue.testQueue= testQueue

topic.MyTopic = MyTopic

我的代理

<proxy name="SendMessagetoJMSProxy" transports="http" startOnLoad="true">
                  <target>
                     <endpoint>
                        <address uri="jms:/myQueue?&amp;transport.jms.DestinationType=queue"/>
                     </endpoint>
                     <inSequence>
                        <log level="custom">
                           <property name="STATE" value="message is sent to queue"/>
                        </log>
                        <property name="OUT_ONLY" value="true"/>
                        <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
                     </inSequence>
                     <outSequence/>
                  </target>
               </proxy>

我的 SOAP UI 调用

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples" xmlns:xsd="http://services.samples/xsd">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <ser:dummy>
                            <xsd:symbol>IBM</xsd:symbol>
                      </ser:dummy>
                   </soapenv:Body>
                </soapenv:Envelope>

根据文档,我应该在 JMS 消息代理中看到该消息,但我得到了

构建直通流时出错

TID[-1234] [ESB] [2017-05-16 12:52:47,137] 错误 {org.apache.synapse.transport.passthru.util.RelayUtils} - 构建直通流 org.apache.axiom 时出错.om.impl.builder.StAXOMBuilder.lookahead(StAXOMBuilder.java:711) org.apache.axiom.soap.impl.llom.SOAPBodyImpl.hasLookahead(SOAPBodyImpl.java:191) org.apache.axiom.soap.impl.llom .SOAPBodyImpl.getFirstElementLocalName(SOAPBodyImpl.java:217) org.apache.axiom.soap.impl.llom.SOAPBodyImpl.hasFault(SOAPBodyImpl.java:99) org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.hasFault(SOAPEnvelopeImpl .java:305) org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:189) org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:137) org .apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:100) org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:140) org.apache.synapse.mediators.AbstractListMediator.me diate(AbstractListMediator.java:83) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) org.apache。 synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:210) org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker. java:403) org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151) org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745)

端点:地址为 jms:/myQueue?&transport.jms.DestinationType=queue 的 AnonymousEndpoint 将被标记为 SUSPENDED,因为它失败了

第一个问题: axis2.xml 中的 java.naming.provider.url 参数是否相对于 [ESB Home] 位置?

我的案例服务器文件夹结构看起来像 ...

也许应该看起来像.....????

<parameter name="java.naming.provider.url" locked="false">file:/home/wso2admin/wso2esb-5.0.0/repository/conf/jndi.properties</parameter>

第二: 这个错误是否与 Message Builder 和 Formater 相关????

任何帮助都会很好......因为我被困了好几天......

【问题讨论】:

  • 删除 '&amp': ?& 不正确。此外,我认为您甚至不需要 jms 目的地类型,因为您将队列配置为“默认”。在我的情况下,我在axis2 xml中的'transsportsender'参数中添加了一个queue,但是我有一个activeMQ而不是MB所以它不是 100% 可比的。
  • 感谢 Jan 的评论,但我想知道我们是否在 axis2.xml 中为 transportReceiver 使用 JMS 配置部分,为什么我们不能只告诉代理我们需要的参数名称?为什么我们再次设置 ConnectionFactoryJNDIName,ConnectionFactoryType..ect..?我们可以放一些类似...
    的东西,它应该选择默认的 JMS 设置???

标签: wso2 wso2esb


【解决方案1】:

第一个问题:axis2.xml 中的java.naming.provider.url 参数是否相对于[ESB Home] 位置?

不,您不需要添加 ESB 主位置。

第二个问题:这个错误是否与 Message Builder 和 Formater 相关????

是的,消息生成器出现错误。

只需验证您是否添加了客户端 jar 并验证您的代理。请按照以下方式创建代理并尝试。

示例代理:

<proxy name="QueueProxy" startOnLoad="true" transports="jms">
    <target>
        <inSequence>
             <property name="OUT_ONLY" value="true"/>
             <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
            <send>
                <endpoint>
                    <address uri="jms:/MyQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&amp;java.naming.provider.url=repository/conf/jndi.properties"/>
                </endpoint>
            </send>
        </inSequence>
    </target>
</proxy>

参考:https://docs.wso2.com/display/ESB500/ESB+as+a+JMS+Producer

【讨论】:

    【解决方案2】:

    请尝试以下代理并检查您使用的 URL 格式

    <proxy xmlns="http://ws.apache.org/ns/synapse" name="StockQuoteProxy" transports="http">
    <target>
        <inSequence>
            <property action="set" name="OUT_ONLY" value="true"/>
            <send>
                <endpoint>
                    <address uri="jms:/myQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
    </target>
    <publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
    

    了解更多

    【讨论】:

    • 在这里,您正在使用 activemq 进行配置。它应该随着 MB 配置而改变
    【解决方案3】:

    感谢 Rajjaz 和 Jan ...

    我创建了一个代理

    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="SendMessagetoJMSProxy"
           startOnLoad="true"
           statistics="disable"
           trace="disable"
           transports="http,https">
       <target>
          <inSequence>
             <log level="custom">
                <property name="STATE" value="message is sent to myQueue"/>
             </log>
             <property name="OUT_ONLY" value="true"/>
             <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
          </inSequence>
          <outSequence/>
          <endpoint>
             <address uri="jms:/myQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&amp;java.naming.provider.url=repository/conf/jndi.properties"/>
          </endpoint>
       </target>
       <description/>
    </proxy>
    

    我还发现,如果您在axis2.xml 中为transportReceiver 定义了默认JMS 配置部分,那么放置队列名称就足够了

    所以这也有效

    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="SendMessagetoJMSProxy2"
           startOnLoad="true"
           statistics="disable"
           trace="disable"
           transports="http,https">
       <target>
          <inSequence>
             <log level="custom">
                <property name="STATE" value="message is sent to GST_TMS_ASSOCIATE_LEASE Queue"/>
             </log>
             <property name="OUT_ONLY" value="true"/>
             <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
          </inSequence>
          <outSequence/>
          <endpoint>
             <address uri="jms:/myQueue"/>
          </endpoint>
       </target>
       <description/>
    </proxy>
    

    现在我可以使用代理将消息发布到 JMS 队列...

    我有点困惑(仍然)所有这些登录系统日志来自哪里以及为什么?!?]1

    【讨论】:

      最近更新 更多