ActiveMQ からのメッセージを消費するように WSO2 を構成し、処理中にエラーが発生した場合 (通常はリモート Web サービスの呼び出しが失敗した場合) に再キューイングしようとしています。
<proxy name="SimpleStockQuoteService" transports="jms" startOnLoad="true">
<target>
<inSequence onError="JSMErrorHandling">
<log level="full"/>
<send>
<endpoint>
<address uri="http://localhost/testapp"/>
</endpoint>
</send>
<log level="full"/>
<log level="custom">
<property name="Custom log" value="End In Sequence"/>
</log>
</inSequence>
<outSequence>
...
</outSequence>
</target>
</proxy>
<sequence name="JSMErrorHandling">
<log level="custom">
<property name="Error" value="Error executing sequence"/>
</log>
<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
<drop/>
</sequence>
Activemq は、プロパティ transport.jms.SessionTransacted を true に設定して、axis2.xml で構成されます。
JMS ロールバック/再配信/[デッド レターへのリダイレクト] 機能は、リモート URL の形式が無効な場合 (たとえば、間違ったプロトコルを使用している場合) に期待どおりに動作します。ただし、リモート Web サーバーを停止するか、無効なサーバー名を使用すると、エラーは JMSErrorHandling シーケンスによって処理されますが、メッセージは再キューイングされません。
これはログからの抜粋です
[2013-06-04 12:17:47,810] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: ID:GCHESNEL764-57101-1370344525419-9:1:1:1:1, Direction: request, Envelope: <?xml ver
[2013-06-04 12:17:47,813] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: ID:GCHESNEL764-57101-1370344525419-9:1:1:1:1, Direction: request, Envelope: <?xml ver
[2013-06-04 12:17:47,814] INFO - LogMediator Custom log = End In Sequence
[2013-06-04 12:17:48,818] WARN - ConnectCallback Connection refused or failed for : localhost/127.0.0.1:80
[2013-06-04 12:17:48,821] WARN - EndpointContext Endpoint : endpoint_413907dd1d4e2370ea0ae277fbfebcaf6504f196a11459bb will be marked SUSPENDED as it failed
[2013-06-04 12:17:48,823] WARN - EndpointContext Suspending endpoint : endpoint_413907dd1d4e2370ea0ae277fbfebcaf6504f196a11459bb - current suspend duration is : 30000ms - Next retry after : Tue J
[2013-06-04 12:17:48,824] INFO - LogMediator Error = Error executing sequence
WSO2 が非同期で HTTP 呼び出しを行っているようで、要求が失敗する前に JMS トランザクションがコミットされます。この動作は構成できますか?
さらに処理が必要な場合 (リモート サービス呼び出しのチェーンなど)、JMS トランザクションが順番どおりに開いたままになっていることを確認し、後の段階でエラーが発生した場合にロールバックできるようにするにはどうすればよいですか?
最後に、処理中に WSO2 サービスがシャットダウンされた場合、メッセージは再キューイングされません。ここで提案されている構成に代わるものはありますか: http://docs.wso2.org/wiki/display/ESB460/JMS+FAQ#JMSFAQ-Howtopreventmessagelossduetounavailabilityofadatasource
ギヨーム