【发布时间】: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 放置消息时没有 ...