【问题标题】:How to get the SOAP request from an ActiveMQ queue and implement it in the webservice如何从 ActiveMQ 队列中获取 SOAP 请求并在 web 服务中实现
【发布时间】:2014-10-02 21:45:47
【问题描述】:

我在 Mule 中有一个要求,我需要公开一个 SOAP Web 服务.. 现在我在 2 个流程中实现它:-

<flow name="ServiceFlow" doc:name="ServiceFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP" />
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData" doc:name="SOAP" />
        <object-to-string-transformer doc:name="Object to String"/>
<jms:outbound-endpoint queue="NewQueue" connector-ref="Active_MQ" doc:name="JMS"/>
</flow>


<flow name="Flow2" doc:name="Flow2" >
<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:NewQueue" doc:name="JMS" exchange-pattern="request-response"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl" >
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>
<logger level="INFO" message="payload :-#[message.payload]" doc:name="Logger"/>
</flow>

在第一个流 (ServiceFlow) 中,我尝试在 ActiveMQ 队列和第二个流 (Flow2) 中发送 SOAP 请求......我试图在 MainDataImpl 类中使用请求......但是我在使用请求时遇到了异常:-

Exception stack is:
1. "Message with id "ID:ANIRBAN-PC-49419-1407595657591-1:1:6:1:1" has been redelivered 1 times on endpoint "jms://tcp:NewQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage (org.mule.transport.jms.redelivery.MessageRedeliveredException)
  org.mule.transport.jms.redelivery.JmsXRedeliveryHandler:81 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transport/jms/redelivery/MessageRedeliveredException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.transport.jms.redelivery.MessageRedeliveredException: "Message with id "ID:ANIRBAN-PC-49419-1407595657591-1:1:6:1:1" has been redelivered 1 times on endpoint "jms://tcp:NewQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage
    at org.mule.transport.jms.redelivery.JmsXRedeliveryHandler.handleRedelivery(JmsXRedeliveryHandler.java:81)
    at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$JmsWorker.preProcessMessage(MultiConsumerJmsMessageReceiver.java:512)
    at org.mule.transport.AbstractReceiverWorker$1$1.process(AbstractReceiverWorker.java:117)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

现在我想知道如何解决这个问题,因为我猜 MainDataImpl 期望消息为对象类型 .. 但无法将 String 消息转换为 Object ... 任何解决上述问题???请帮忙

向 XML 添加对象后更新:-

<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>

<flow name="ServiceFlow" doc:name="ServiceFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP" />
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData" doc:name="SOAP" />
        <mulexml:object-to-xml-transformer doc:name="Object to XML"/>

<!-- <vm:outbound-endpoint exchange-pattern="request-response" path="Flow1-WT-Main" doc:name="VM"/> -->

   <jms:outbound-endpoint queue="NewQueue" connector-ref="Active_MQ" doc:name="JMS"/>
</flow>


<flow name="Flow2" doc:name="Flow2" >
<!-- <vm:inbound-endpoint exchange-pattern="request-response" path="Flow1-WT-Main" doc:name="VM"/> -->

<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:NewQueue" doc:name="JMS" exchange-pattern="request-response"/>
        <mulexml:xml-to-object-transformer doc:name="XML to Object"/>
        <async doc:name="Async">
            <logger message="Payload :-#[message.payload]" level="INFO" doc:name="Logger"/>
        </async>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl" >
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>

</component>

<logger level="INFO" message="ccccccc :-#[message.payload]" doc:name="Logger"/>
    </flow>

现在例外是:-

INFO  2014-08-09 21:10:33,426 [ActiveMQ Session Task-1] org.mule.api.processor.LoggerMessageProcessor: ccccccc :-com.test.services.schema.maindata.v1.DataResponse@1ca5a88a
INFO  2014-08-09 21:10:33,426 [[Dummysimpleclientwebservice].Flow2.1.02] org.mule.api.processor.LoggerMessageProcessor: Payload :-com.test.services.schema.maindata.v1.DataRequest@3fdc0ab7
ERROR 2014-08-09 21:10:33,433 [ActiveMQ Session Task-1] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DataResponse (javax.jms.JMSException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DataResponse(JMS Code: null) (javax.jms.JMSException)
  org.mule.transport.jms.JmsMessageUtils:144 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/JMSException.html)
2. Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DataResponse (javax.jms.JMSException) (org.mule.api.transformer.TransformerException)
  org.mule.transport.jms.transformers.AbstractJmsTransformer:79 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
javax.jms.JMSException: Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DataResponse
    at org.mule.transport.jms.JmsMessageUtils.toMessage(JmsMessageUtils.java:144)
    at org.mule.transport.jms.transformers.AbstractJmsTransformer.transformToMessage(AbstractJmsTransformer.java:66)
    at org.mule.transport.jms.transformers.ObjectToJMSMessage.transformMessage(ObjectToJMSMessage.java:54)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

ERROR 2014-08-09 21:10:34,488 [ActiveMQ Session Task-2] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : "Message with id "ID:ANIRBAN-PC-49768-1407598818233-1:1:6:1:1" has been redelivered 1 times on endpoint "jms://tcp:NewQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. "Message with id "ID:ANIRBAN-PC-49768-1407598818233-1:1:6:1:1" has been redelivered 1 times on endpoint "jms://tcp:NewQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage (org.mule.transport.jms.redelivery.MessageRedeliveredException)
  org.mule.transport.jms.redelivery.JmsXRedeliveryHandler:81 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transport/jms/redelivery/MessageRedeliveredException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.transport.jms.redelivery.MessageRedeliveredException: "Message with id "ID:ANIRBAN-PC-49768-1407598818233-1:1:6:1:1" has been redelivered 1 times on endpoint "jms://tcp:NewQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage
    at org.mule.transport.jms.redelivery.JmsXRedeliveryHandler.handleRedelivery(JmsXRedeliveryHandler.java:81)
    at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$JmsWorker.preProcessMessage(MultiConsumerJmsMessageReceiver.java:512)
    at org.mule.transport.AbstractReceiverWorker$1$1.process(AbstractReceiverWorker.java:117)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

【问题讨论】:

  • 我认为您显示了错误的错误:超过重新传递错误可能是Flow2 无法成功使用 JMS 消息的结果。你能显示实际的错误吗?
  • 嗨大卫..请检查更新的错误消息

标签: mule activemq mule-studio


【解决方案1】:

如您所料,问题在于您使用object-to-string-transformer 将入站消息对象序列化为字符串,并通过JMS 队列尝试将其提供给MainDataImpl 对象,该对象将对象作为输入参数它的不同操作。

解决方案是将入站对象简单地序列化为 XML,通过 JMS 发送,然后将其反序列化回对象。

为此,将object-to-string-transformer 替换为object-to-xml-transformer,并在jms:inbound-endpoint 之后添加xml-to-object-transformer

编辑 我没有意识到您在request-response 时尚中使用NewQueue,因为您实际上不一致地声明它。在jms:outbound-endpoint 上,您没有提供exchange-pattern,默认情况下它是one-way;而在jms:inbound-endpoint 上,您将exchange-pattern 设置为request-response,这会触发Flow2 响应阶段的执行。

所以:保持一致,在两个 JMS 端点上使用相同的 exchange-pattern,或者更好的是,使用正确的 exchange-pattern 声明一个全局 JMS 端点并从 jms:inbound 引用它和出站端点。

如果您决定继续使用request-response,那么您需要对响应执行相同的操作,即。将调用MainDataImplDataResponse 对象)的结果序列化回 XML,并在ServiceFlow 中将其反序列化回对象。

【讨论】:

  • 嗨大卫..我已经尝试过你建议的相同..但仍然面临异常..请在问题中找到修改...我在添加对象到 XML 标记后更新更新..
【解决方案2】:

因此,可行的解决方案是(根据大卫的建议)
1.需要在JMS出站前加&lt;mulexml:object-to-xml-transformer doc:name="Object to XML"/&gt;,在JMS入站后加&lt;mulexml:xml-to-object-transformer doc:name="XML to Object"/&gt;
2.需要在两个JMS端点上使用相同的exchange-pattern

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2015-03-24
    • 2014-06-28
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多