2014-11-18 3 views
0

Я сделал простую прокси-службу, которая прослушивает XML-сообщение из очереди JMS (на основе ActiveMQ) и выполняет некоторые преобразования на нем. Я хочу реализовать свойство возврата транзакции JMS, поэтому, если во время преобразования возникнет какая-либо ошибка или исключение, сообщение будет RollBack.Свойство переноса транзакций JMS не работает в WSO2 4.8.1 ESB

Проблема:

Я следовал official инструкции, но он не работает. Когда происходит какое-либо исключение, сообщение не откатывается. Исключение записывается, но сообщение теряется.

Proxy Service SourceCode:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="JMSGateway" 
     transports="jms" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <property name="OUT_ONLY" value="true"/> 
     <log level="full"/> 
     <xslt key="conf:/xslt/ConvertToCDM.xslt"> 
      <resource location="conf:xslt/ConvertToCDM.xslt" key="ConvertToCDM"/> 
     </xslt> 
     <log level="full"/> 
     <log/> 

     </inSequence> 
     <outSequence/> 
     <faultSequence> 
     <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/> 
     <log level="custom"> 
      <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/> 
      <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/> 
      <property name="ERROR_DETAIL" expression="get-property('ERROR_DETAIL')"/> 
      <property name="ERROR_EXCEPTION" expression="get-property('ERROR_EXCEPTION')"/> 
      <property name="File_Name" expression="get-property('Received.File.Name')"/> 
      <property name="Transaction Action" value="Rollbacked"/> 
     </log> 

     </faultSequence> 
    </target> 
    <parameter name="transport.jms.ContentType"> 
     <rules> 
     <jmsProperty>contentType</jmsProperty> 
     <default>application/xml</default> 
     </rules> 
    </parameter> 
    <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter> 
    <parameter name="transport.jms.DestinationType">queue</parameter> 
    <parameter name="transport.jms.Destination">CDMRequest</parameter> 
    <description/> 
</proxy> 

ответ

1

Вы должны добавить thoses параметры прокси-сервера DEF:

<parameter name="transport.jms.SessionAcknowledgement">CLIENT_ACKNOWLEDGE</parameter> 
<parameter name="transport.jms.SessionTransacted">true</parameter> 

Если вы можете увидеть свой журнал ошибок больше, чем один раз, то сообщение имеет был обновлен ActiveMQ, и вы знаете, что ваш ESB conf верен (откат с SET_ROLLBACK_ONLY = true действует)

Через несколько раз, в зависимости от ActiveMQ conf, сообщение должно быть удалено из очереди и переместиться в очередь мертвых букв.

Если сообщение потеряно, вы должны взглянуть на конфигурацию ActiveMQ (см http://activemq.apache.org/message-redelivery-and-dlq-handling.html)

Вы можете сосредоточиться на том, что, не сохранялось сообщение не отправляется на DLQ но удален. Если вы хотите изменить это поведение, изменение ActiveMQ конф:

<broker...> 
    <destinationPolicy> 
    <policyMap> 
    <policyEntries> 
     <!-- Set the following policy on all queues using the '>' wildcard --> 
     <policyEntry queue=">"> 
     <!-- 
      Tell the dead letter strategy to also place non-persisted messages 
      onto the dead-letter queue if they can't be delivered. 
     --> 
     <deadLetterStrategy> 
      <sharedDeadLetterStrategy processNonPersistent="true" /> 
     </deadLetterStrategy> 
     </policyEntry> 
    </policyEntries> 
    </policyMap> 
    </destinationPolicy> 
... 
</broker> 
+0

я попробовал это, но до сих пор никаких действий ... –

+0

, когда вы попробуете, вы не имеете исключение внутри inSequence посредничества и вы можете увидеть журнал «Сделку Действие = Откат "из faultSequence? И ваше сообщение потеряно: нет сообщения в очереди CDMRequest, нет сообщения в ActiveMQ.DLQ? –

+0

Служба переходит в последовательность сбоев, и да, я вижу тег «Транзакция Action = Откат», но сообщение потеряно. –

Смежные вопросы