【发布时间】:2018-04-18 17:24:36
【问题描述】:
MyProjectJmsListenerContainerFactory 类:
@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 类:
@Component
public class MyProjectJmsGlobalErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable throwable) {
System.out.println("JMS EXCEPTION HANDLER CAUGHT THE EXCEPTION !!");
}
}
JMSTextMessageConverter 类:
@Configuration
public class JMSTextMessageConverter {
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter mappingJackson2MessageConverter =
new MappingJackson2MessageConverter();
mappingJackson2MessageConverter.setTargetType(MessageType.TEXT);
mappingJackson2MessageConverter.setTypeIdPropertyName("_type");
return mappingJackson2MessageConverter;
}
}
JMSMessagePublisher 类:
@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 类:
@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 ");
}
}
我从上面的 subscribe 方法中抛出了一个异常,但无法通知到 ErrorHandler,我可以在日志中注意到以下警告。
WARN 1993 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer :
Execution of JMS message listener failed, and no ErrorHandler has been set.
我的 JMS 配置有什么问题,即如何设置 ErrorHandler 以便在 handleError(Throwable throwable) 方法中全局捕获/通知所有异常。
我使用JMSMessagePublisher 类中的publishMessage() 方法发布消息(如上所示)。
【问题讨论】:
标签: java spring jms spring-jms