azure-sdk-for-java
azure-sdk-for-java copied to clipboard
[QUERY] Max delivery count configured in the portal is not honoured by JMS APIs for Azure Service Bus Topic.retrying it forever.
Description
Max delivery configured in Azure portal as 5 Even after 5 redeliveries it is retrying again and again untill jvm is killed. code is written as follows
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
<version>4.3.0</version>
</dependency>
@JmsListener(destination = "${topic-name}", containerFactory = "testTopicJmsListenerContainerFactory", subscription = "${subscription-name}")
public void receiveMessage(JmsTextMessage message) throws Exception {
String event = message.getBody(String.class);
try {
log.info("Received event: {}", event);
log.info("Received message: {}", message);
Enumeration e = message.getAllPropertyNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
System.out.println(name + ":" + message.getStringProperty(name));
}
log.info("JMSRedelivered: {}", message.getJMSRedelivered());
TimeUnit.SECONDS.sleep(5);
throwException();
message.acknowledge();
} catch (Exception e) {
log.error("Exception while processing re-source event: " + event, e);
throw e;
}
}
@Bean("testTopicJmsListenerContainerFactory")
public JmsListenerContainerFactory<?> orderReSourceTopicJmsListenerContainerFactory(
DefaultJmsListenerContainerFactoryConfigurer configurer,
@Qualifier("testJmsConnectionFactory") ConnectionFactory connectionFactory,ErrorHandler myErrorHandler) {
final DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
configurer.configure(jmsListenerContainerFactory, connectionFactory);
jmsListenerContainerFactory.setPubSubDomain(Boolean.FALSE);
jmsListenerContainerFactory.setSessionTransacted(Boolean.FALSE);
jmsListenerContainerFactory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
jmsListenerContainerFactory.setSubscriptionDurable(Boolean.TRUE);
jmsListenerContainerFactory.setErrorHandler(myErrorHandler);
return jmsListenerContainerFactory;
}
@Bean
public ErrorHandler myErrorHandler() {
return t -> {
System.out.println("In error handler"+t.getMessage());
};
}
Exception or Stack Trace
2022-09-07 16:39:38.121 INFO [order-re-source,24afd2757dd19875,2b28fdc1577f6cec] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@fa5be72 }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:17
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:38.121 INFO [order-re-source,24afd2757dd19875,2b28fdc1577f6cec] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:39.126 INFO [order-re-source,591494cc68e88d40,edb1c68b0df84d2c] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:39.126 INFO [order-re-source,591494cc68e88d40,edb1c68b0df84d2c] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@1764480e }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:18
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:39.126 INFO [order-re-source,591494cc68e88d40,edb1c68b0df84d2c] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:40.129 INFO [order-re-source,aa8ecd739be5e3aa,5db0da30054f6b34] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:40.129 INFO [order-re-source,aa8ecd739be5e3aa,5db0da30054f6b34] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@cf9da1e }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:19
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:40.129 INFO [order-re-source,aa8ecd739be5e3aa,5db0da30054f6b34] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:41.135 INFO [order-re-source,e7084e15229daec4,882980737b98bf4d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:41.135 INFO [order-re-source,e7084e15229daec4,882980737b98bf4d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@5883505f }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:20
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:41.135 INFO [order-re-source,e7084e15229daec4,882980737b98bf4d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:42.139 INFO [order-re-source,c403130462a65f64,7a59da8a779685f6] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:42.139 INFO [order-re-source,c403130462a65f64,7a59da8a779685f6] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@360360bd }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:21
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:42.139 INFO [order-re-source,c403130462a65f64,7a59da8a779685f6] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:43.142 INFO [order-re-source,08b8c404fad99d74,575d322867a0a73f] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:43.142 INFO [order-re-source,08b8c404fad99d74,575d322867a0a73f] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@65c86743 }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:22
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:43.142 INFO [order-re-source,08b8c404fad99d74,575d322867a0a73f] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:44.147 INFO [order-re-source,e8aca7440fd045ae,3977a71a5d4f8ce3] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:44.147 INFO [order-re-source,e8aca7440fd045ae,3977a71a5d4f8ce3] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@10905993 }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:23
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:44.147 INFO [order-re-source,e8aca7440fd045ae,3977a71a5d4f8ce3] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:45.152 INFO [order-re-source,e472794bed6898f9,855942b25eb89083] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:45.152 INFO [order-re-source,e472794bed6898f9,855942b25eb89083] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@4f6460ac }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:24
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:45.152 INFO [order-re-source,e472794bed6898f9,855942b25eb89083] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:46.156 INFO [order-re-source,af9b674a39db82eb,4bfc513ed1ee6949] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:46.156 INFO [order-re-source,af9b674a39db82eb,4bfc513ed1ee6949] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@3e7282cc }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:25
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:46.156 INFO [order-re-source,af9b674a39db82eb,4bfc513ed1ee6949] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:47.160 INFO [order-re-source,58b73fb63371a9e7,35b95438832f736a] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:47.160 INFO [order-re-source,58b73fb63371a9e7,35b95438832f736a] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@3ca41bcd }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:26
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:47.160 INFO [order-re-source,58b73fb63371a9e7,35b95438832f736a] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:48.164 INFO [order-re-source,b65f07432b2c13a2,0e4a97650b650ff0] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:48.164 INFO [order-re-source,b65f07432b2c13a2,0e4a97650b650ff0] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@5a4aba2c }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
JMSXDeliveryCount:27
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:48.164 INFO [order-re-source,b65f07432b2c13a2,0e4a97650b650ff0] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
In error handlerListener method 'public void com.example.springazureservicebusjmsconsumer.subscriber.TopicSubscribeController.receiveMessage(org.apache.qpid.jms.message.JmsTextMessage) throws java.lang.Exception' threw exception; nested exception is java.lang.RuntimeException: User Exception
2022-09-07 16:39:49.169 INFO [order-re-source,bddddc614c1717ac,43bec036d3b7a85d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received event: {
"babu": "babu"
}
2022-09-07 16:39:49.169 INFO [order-re-source,bddddc614c1717ac,43bec036d3b7a85d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : Received message: JmsTextMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsTextMessageFacade@5d9dcac0 }
DeadLetterErrorDescription:Message could not be consumed after 5 delivery attempts.
**JMSXDeliveryCount:28**
DeadLetterReason:MaxDeliveryCountExceeded
2022-09-07 16:39:49.169 INFO [order-re-source,bddddc614c1717ac,43bec036d3b7a85d] 12524 --- [ntContainer#0-1] c.e.s.s.TopicSubscribeController : JMSRedelivered: true
To Reproduce code is in the description to reproduce
Code Snippet Add the code snippet that causes the issue.
Expected behavior it should stop delivering message after 5 redelivery attempts
Screenshots

Setup (please complete the following information):
- OS: windows
- IDE: STS
- Java version: 8
@yiliuTo could you please follow up with @skbaji6 on this github issue?
@yiliuTo any update please.
@skbaji6 sorry for the late response, occupied by other issues before. I reproduced this error and find that the failed messages are not get abandoned or released to Service Bus service, which causes the delivery count in service side is not increased. One workaround is that you can explicitly abandon the message when errors are encountered, like below:
@JmsListener(destination = TOPIC_NAME, containerFactory = "testTopicJmsListenerContainerFactory",
subscription = SUBSCRIPTION_NAME)
public void receiveMessage(JmsTextMessage message) throws Exception {
String event = message.getBody(String.class);
try {
logger.info("Received event: {}", event);
logger.info("Received message: {}", message);
Enumeration e = message.getAllPropertyNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
System.out.println(name + ":" + message.getStringProperty(name));
}
logger.info("JMSRedelivered: {}", message.getJMSRedelivered());
TimeUnit.SECONDS.sleep(5);
throwException();
message.acknowledge();
} catch (Exception e) {
logger.error("Exception while processing re-source event: " + event, e);
JmsAcknowledgeCallback acknowledgeCallback = message.getAcknowledgeCallback();
// explicitly abandon the message.
acknowledgeCallback.setAckType(MODIFIED_FAILED);
message.setAcknowledgeCallback(acknowledgeCallback);
message.acknowledge();
throw e;
}
}
I will keep investigating the error for the root cause.
Hi @skbaji6 , for the client_ack mode, when exceptions encountered during message consuming, the JMS consumer will recover back to the status where that message with exceptions hasn't been dequeued to consume, which causes the message being enqueued to the local message buffer again. Then every time the JMS consumer pulls for messages, it doesn't truly pull messages from Service Bus, but pulls that local message buffer and in the end pulls the error-handling message. Then things happen repeatedly. That's why you always receive the same message.
The solution mentioned in the last comment, can solve this case because it manually abandons the message to Service Bus, and during the call of acknowledge(), it also removes the error-handing message locally since it has been acked. Then when JMS consumer tries to recover to the status where the error-handling message hasn't been consumed, it failed to enqueue that message back to the local message buffer since that message has been removed in the acknowledge() call. Thus solves the issue.
Hi, we're sending this friendly reminder because we haven't heard back from you in a while. We need more information about this issue to help address it. Please be sure to give us your input within the next 7 days. If we don't hear back from you within 14 days of this comment the issue will be automatically closed. Thank you!
Hi, we're sending this friendly reminder because we haven't heard back from you in a while. We need more information about this issue to help address it. Please be sure to give us your input within the next 7 days. If we don't hear back from you within 14 days of this comment the issue will be automatically closed. Thank you!