MyProjectJmsListenerContainerFactory class:
@Configuration
public class MyProjectJmsListenerContainerFactory {
@Bean
public JmsListenerContainerFactory<?> myFactory(
ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer,
MyProjectJmsGlobalErrorHandler errorHandler) {
ActiveMQConnectionFactory activeMQConnectionFactory =
(ActiveMQConnectionFactory)connectionFactory;
RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
redeliveryPolicy.setMaximumRedeliveries(1);
activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setErrorHandler(errorHandler);
configurer.configure(factory, activeMQConnectionFactory);
return factory;
}
}
MyProjectJmsGlobalErrorHandler class:
@Component
public class MyProjectJmsGlobalErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable throwable) {
System.out.println("JMS EXCEPTION HANDLER CAUGHT THE EXCEPTION !!");
}
}
JMSTextMessageConverter class:
@Configuration
public class JMSTextMessageConverter {
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter mappingJackson2MessageConverter =
new MappingJackson2MessageConverter();
mappingJackson2MessageConverter.setTargetType(MessageType.TEXT);
mappingJackson2MessageConverter.setTypeIdPropertyName("_type");
return mappingJackson2MessageConverter;
}
}
JMSMessagePublisher class:
@Component
public class JMSMessagePublisher {
private JmsTemplate jmsTemplate;
private MessageConverter messageConverter;
@Autowired
public JMSMessagePublisher(JmsTemplate jmsTemplate,
MessageConverter messageConverter) {
this.jmsTemplate = jmsTemplate;
this.messageConverter = messageConverter;
}
public void publishMessage() {
jmsTemplate.setMessageConverter(messageConverter);
jmsTemplate.convertAndSend("test.q1", "Hello World");
}
}
JMSListener class:
@Component
public class JMSListener {
@JmsListener(destination = "test.q1")
public void subscribe(String message) throws Exception {
System.out.println(" message received ::::::::"+message);
throw new Exception("Exception from message listener ");
}
}
I am throwing an exception from subscribe method above but could not get notified to to ErrorHandler and I could notice the below warning in the logs.
WARN 1993 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer :
Execution of JMS message listener failed, and no ErrorHandler has been set.
What is the issue with my JMS configuration i.e., how do I set up the ErrorHandler
such that all exceptions are globally caught/notified inside handleError(Throwable throwable)
method.
I publish the messages using publishMessage()
method from JMSMessagePublisher
class (given above).