【问题标题】:wso2 EI 611 ActiveMQwso2 EI 611 ActiveMQ
【发布时间】:2018-02-12 15:30:26
【问题描述】:

在 ESB 中声明的消息存储

<?xml version="1.0" encoding="UTF-8"?>
<messageStore class="org.apache.synapse.message.store.impl.jms.JmsStore" name="MySQLStockAdjustment" xmlns="http://ws.apache.org/ns/synapse">
    <parameter name="store.jms.destination">MySQLStockAdjustment</parameter>
    <parameter name="store.failover.message.store.name">MySQLStockAdjustmentFailover</parameter>
    <parameter name="store.jms.connection.factory">myQueueConnectionFactory</parameter>
    <parameter name="store.producer.guaranteed.delivery.enable">true</parameter>
    <parameter name="store.jms.cache.connection">false</parameter>
    <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
    <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter>
    <parameter name="store.jms.JMSSpecVersion">1.1</parameter>
</messageStore>

我只是想开始将消息存储在其中,而不是使用代理从它读取消息..

代理很简单

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="stockAdjustment" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <!--  get all data -->
            <sequence key="AdjustmentContext"/>
            <filter regex="MySQL" source="$ctx:StockSource">
                <then>
                    <iterate expression="//request">
                        <target>
                            <sequence>
                                <property expression="//qty" name="qty" scope="default" type="STRING"/>
                                <property expression="//code" name="code" scope="default" type="STRING"/>
                                <log level="custom">
                                    <property expression="fn:concat('parmams:Code: ' ,$ctx:code, ' ;Qty: ',$ctx:qty)" name="info"/>
                                </log>
                                <call blocking="true">
                                    <endpoint key="StockAdjustmentEp"/>
                                </call>
                            </sequence>
                        </target>
                    </iterate>
                </then>
                <else/>
            </filter>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence>

        </faultSequence>
    </target>
    <parameter name="transport.jms.Destination">MySQLStockAdjustment</parameter>
    <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
</proxy> 

所以当我通过 Postman 发送数据消息时,我得到以下信息:

WARN {org.apache.axis2.transport.jms.JMSUtils} - 无法确定 JMS 消息的大小;不支持的消息类型:org.apache.activemq.command.ActiveMQObjectMessage {org.apache.axis2.transport.jms.JMSUtils} 错误 {org.apache.axis2.transport.base.BaseUtils} - 不支持的 JMS 消息类型 org.apache.activemq.command.ActiveMQObjectMessage {org.apache.axis2.transport.base.BaseUtils} 错误 {org.apache.axis2.transport.jms.JMSMessageReceiver} - 未知错误处理消息 {org.apache.axis2.transport.jms.JMSMessageReceiver}

消息是

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <StockAdjRequest>
            <source>MySQL</source>
            <request><qty>2</qty><code>PR2</code></request>
            <request><qty>2</qty><code>PR2</code></request>
            <request><qty>2</qty><code>PR2</code></request>
            </StockAdjRequest>
            </soapenv:Body>
            </soapenv:Envelope>

我看到该消息在队列中结束,但我无法通过 ActiveMQ Web 控制台读取它...

我的文档我发现我可能需要“...如果您在使用消息存储时使用 ActiveMQ 5.12.2 及更高版本,您需要在服务器启动时为 JMS 设置以下系统属性ESB 配置文件的消息存储按预期工作。

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*" ...."

但是我不知道该怎么做...有人可以帮助我吗?

【问题讨论】:

  • 到目前为止,我发现错误在于 ActiveMQ 和消息存储关系。当我通过代理将消息直接放入队列时,它可以工作,但使用消息存储并使用 API 放置消息时没有 ...

标签: wso2 activemq wso2esb


【解决方案1】:

当您将消息存储在定义 messageStore 并使用存储中介的 JMS 队列中时,您不仅存储来自消息的“文本”有效负载,而且整个 java MessageContext 对象被序列化并作为二进制消息存储在队列。

要读取这样的消息,您需要使用消息处理器,您无法使用简单的 JMS 代理甚至 jms 入站端点来读取它。

而且你不能用 ActiveMQ 控制台读取它,因为它不能反序列化它

【讨论】:

  • 我的问题是,如果我直接使用 Endpoints 保存存储消息,并且我指向代理以使用该消息,那么它可以工作。但是当我按顺序存储消息时,只需简单地输入消息存储的名称,消息被存储,但在它之后我的代理无法读取消息..它给了我错误'无法确定 JMS 消息的大小;不支持的消息类型:org.apache.activemq.command.ActiveMQObjectMessage '
  • 是的,这是因为当您使用端点存储消息时,您会存储“文本”有效负载。但是使用存储中介,您存储了一个需要反序列化 MessageProcessor 的序列化 java 对象:您无法使用代理读取此类消息...
  • 它看起来会是那么好的一个..让我今晚检查一下
  • 错误 {org.apache.synapse.message.store.impl.jms.JmsConsumer} - [SalesOrder-C-1] 无法接收来自商店的消息。错误:无法从内容构建正文。代理无法使用可序列化的类。原因:java.lang.ClassNotFoundException:禁止类 org.apache.synapse.message.store.impl.commons.StorableMessage!不信任此类被序列化为 ObjectMessage 有效负载。请查看activemq.apache.org/objectmessage.html,了解有关如何配置受信任类的更多信息。 {org.apache.synapse.message.store.impl.jms.JmsConsumer}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
相关资源
最近更新 更多