2016-04-09 23 views
1

私が働いている会社のエラーキュー監視ツールに取り組んでいます。私は、Spring Bootを使用して注釈を使用して設定したすべてのBeanを(このxmlを使用する代わりに)実行しています。このツールは、私たちのエラーキュー(IBMのMQシリーズ)では、JMSリスナーが独自のものとして取り上げる新しい行がいくつかのxmlメッセージに含まれているという点を除いて、意図したとおりに機能します。実際、メッセージ全体ではなく、行ごとにXMLメッセージを排他的に処理しているように見えます(ただしHL7メッセージはすべて正常に処理されます)。この機能は私の知るところではありませんが、それ自体の質問です.-Spring JMSリスナーは、ペイロードが空のメッセージをどのように処理する必要がありますか?

私のJMSリスナーは、この改行文字を取得すると、メッセージのペイロードを空にすることはできず、インデックスゼロのものについてラブラブしているという例外を投げます。それはロールバックを開始し、私のJMSErrorhandlerを呼び出します、問題は、このループ(永遠に...)にとどまりますが、です。デバッガからは、この例外は、私のブレークポイントに決して到達しないので、私のprocessOrder()メソッドに入る前のSpringコードのどこかで発生します。私は作業現場にいないので、コードやスタックトレースにアクセスすることはできません(うまくいけばエラーの説明は十分です)が、リスナーはSpringのサイトから直接モデル化されていると言えます:

@Component 
public class MyService { 

    @JmsListener(destination = "myDestination") 
    public void processOrder(String data) { ... } 
} 

私はアクセスできるものがあります。改行文字がピックアップされるようなものがあれば、ロールバックの発生を防ぐことができますか?また、一般的なステートメントと同様に、改行文字は、これらのメッセージをキューに入れる別のアプリケーションによって引き起こされる可能性がありますが、私はすべての基盤をカバーして知識を得る必要があります。

EDIT:リスナーがメッセージを処理する前に、Springコードのどこかに例外がスローされていることを明確にする。私はこれを得る:

Caused by: org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String, message=GenericMessage [payload= 
    JMSMessage class: jms_none 
    JMSType:   null 
    JMSDeliveryMode: 2 
    JMSExpiration: 0 
    JMSPriority:  5 
    JMSMessageID:  ID:414d5120514d5f4445565f595731202056d7ea6b28797f6b 
    JMSTimestamp:  1460469585820 
    JMSCorrelationID: null 
    JMSDestination: null 
    JMSReplyTo:  null 
    JMSRedelivered: false 
    JMSXAppID: perl       
    JMSXDeliveryCount: 1 
    JMSXUserID: cisadm  
    JMS_IBM_Character_Set: ISO-8859-1 
    JMS_IBM_Encoding: 273 
    JMS_IBM_Format: MQSTR 
    JMS_IBM_MsgType: 8 
    JMS_IBM_PutApplType: 6 
    JMS_IBM_PutDate: 20160412 
    JMS_IBM_PutTime: 13594582, headers={JMS_IBM_Character_Set=ISO-8859-1, JMS_IBM_MsgType=8, JMSXUserID=cisadm  , jms_priority=5, JMS_IBM_Encoding=273, jms_timestamp=1460469585820, JMSXAppID=perl      , JMS_IBM_PutApplType=6, JMS_IBM_Format=MQSTR , jms_redelivered=false, JMS_IBM_PutDate=20160412, jms_deliveryMode=2, JMSXDeliveryCount=1, JMS_IBM_PutTime=13594582, id=1dfefda3-49cb-dfcc-1a31-b8087e3d6ebd, jms_expiration=0, jms_messageId=ID:414d5120514d5f4445565f595731202056d7ea6b28797f6b, timestamp=1460469638210}] 
    at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:118) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:139) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:108) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:90) ~[spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    ... 10 more 

これを解決する方法がわからない。提案?

+0

リスナーを空のメッセージで書き直してください:それを受け入れて、そうしたことを示す信号を送ります。ここには魔法はありません。リスナーはあなたのものです:あなたの要件に合うように書きます。 – duffymo

+0

@duffymoあなたは私のconfigクラス(私は現時点ではアクセスしていない..)のようなもので初期設定を指していますか?私のリスナー内のコードは実際に呼び出されないので。 Springは、メッセージの処理が必要な場所(つまりリスナー)を認識してから、エラーに遭遇します。 –

答えて

0

この回答を投稿するのに十分なビューがあります。私は基本的にこの記事でより直接的な方法でこの質問を再質問しました:Spring JMSListener - How should it handle empty payloads?、結論に至りました。コメントから誰かの提案を受け取り、単にパラメータタイプをStringからjavax.jms.Messageに変更しました。これにより、空のペイロード(空文字列、改行文字など)を含むメッセージは、リスナーのフローに影響を与えず、処理されます。

あなたがしなければならないことは、入ってくるMessageから文字列を抽出することだけです。その内容を確認して、それをどうするかを決めることができます。

@JmsListener 
public void processOrder(Message message) throws JMSException { 
    String convertedMessage = ((TextMessage) message).getText(); 
    : 
    : 
} 

duffymoが起こって魔法が存在しないという点で正しかった(私が何をしたか、少なくともまたは):だからリスナーはこのように見てしまいます。そして、あなたが他の投稿で見ることができるように、このようなソリューションを使用したくない場合は、独自のメッセージコンバータを実装して、メッセージで必要なことを行うことができます。

関連する問題