サービスバス購読からのメッセージを受信できますが、リスナーで例外が発生した場合、最終的に状態= undeliverableHere = trueがサービスバスに送信されます。サービスバス用のdocsは、amqp Modified処理をサポートしていないと言います。Spring JMSとqpidを使用してAzure Service Busメッセージを消費するときにDeferredとしてマークされたメッセージ
メッセージは、サービスバスのDeferred状態になり、メッセージをどのようにしてアクティビティに振りかざすのかわかりません。
JMS設定:
@Bean
public ConnectionFactory jmsConnectionFactory(MessageStoreProperties properties) throws UnsupportedEncodingException {
JmsConnectionFactory connectionFactory = new JmsConnectionFactory(properties.getUrlString());
connectionFactory.setClientID(clientId);
connectionFactory.setUsername(properties.getUsername());
connectionFactory.setPassword(properties.getPassword());
connectionFactory.setRedeliveryPolicy(redeliveryPolicy());
return new CachingConnectionFactory(connectionFactory);
}
@Bean
public JmsDefaultRedeliveryPolicy redeliveryPolicy() {
JmsDefaultRedeliveryPolicy policy = new JmsDefaultRedeliveryPolicy();
policy.setMaxRedeliveries(50);
return policy;
}
@Bean
public JmsListenerContainerFactory topicContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
リスナー:
@JmsListener(destination = "crm-customer-event/subscriptions/test-sub", containerFactory = "topicContainerFactory")
public void receiveCustomerEvent(@Payload ExecutionContextDTO dto) {
logger.debug("Got payload: " + dto);
throw new RuntimeException("Oops");
}
ここで私は、ログで見ているものです:
メッセージ転送が
[299309872:1] <- Transfer{handle=0, deliveryId=0, deliveryTag=\x97\x1c\x87\x04\xb7\xea\[email protected]\xb3n\xbd\x9fg\x81\x00\x11, messageFormat=0, settled=null, more=false, rcvSettleMode=null, state=null, resume=false, aborted=false, batchable=true} (16695) "\x00Sp\xc0\x0a\[email protected]@p.........
例外がスローされますを開始、次にJMS rそれは
[299309872:1] -> Disposition{role=RECEIVER, first=0, last=0, settled=true, state=Modified{deliveryFailed=true, undeliverableHere=true, messageAnnotations=null}, batchable=false}
メッセージ私が見るローカルに50回(なぜそれがこれを行うのですか?)
次のAMQPプロトコルフレームをあるedeliversた後、この最後の処分フレームがメッセージを入射させるように私には見えます遅延状態。メッセージにはまだロックトークンがあります。 TTLが経過しても、メッセージは依然としてサブスクリプションに滞っており、REST APIを介してメッセージを突き止めることはできません。私は(PUTで)それをロック解除し、削除(DELETEで)を削除しようとしました。私はまた、REST API(PeekLockと受信と削除の両方の種類)で受信しようとしましたが、それはそこにないように見えます。私は期限切れの後にデッド・レター・キューにメッセージを自動的に移動するサブスクリプションにオプションが設定されており、決して移動されません。
ackが発生するコードはhereです。ライブラリのこの部分は拡張されていないようですが、そうでない場合は別のackを返す独自の実装を作成しているようです。
どのように私は
- にqpid /のJMSを得るのですか、これらの繰延メッセージを
- ACK FAILEDの代わりMODIFIED_FAILED_UNDELIVERABLEアッククリアを使用してください。
ありがとうございます!そして、私はマイクロソフトが彼らの行動を一緒にするように指示します。) – UrLicht