私が働いている会社のエラーキュー監視ツールに取り組んでいます。私は、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
これを解決する方法がわからない。提案?
リスナーを空のメッセージで書き直してください:それを受け入れて、そうしたことを示す信号を送ります。ここには魔法はありません。リスナーはあなたのものです:あなたの要件に合うように書きます。 – duffymo
@duffymoあなたは私のconfigクラス(私は現時点ではアクセスしていない..)のようなもので初期設定を指していますか?私のリスナー内のコードは実際に呼び出されないので。 Springは、メッセージの処理が必要な場所(つまりリスナー)を認識してから、エラーに遭遇します。 –