将@JmsListener 与日志记录一起使用

Using @JmsListener with logging

我正在遵循有关在方法级别使用 JmsListener 注释使用 Spring JMS 的指南。我认为它正在工作,但由于我无法调试我在该方法中设置的断点,或者 log4j 日志记录不起作用,或者甚至不是简单的 System.out.println(),我不能 100% 确定目标是否命中.

@Component
public class JmsEmailServiceConsumer {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    private final JmsEmailService jmsEmailService;

    @Autowired
    public JmsEmailServiceConsumer(JmsEmailService jmsEmailService){
        this.jmsEmailService = jmsEmailService;
    }

    @JmsListener(destination = "simple.queue")
    public void receiveEmailData(EmailData emailData) {
        jmsEmailService.sendEmail(emailData);
    }
}

非常简单的任务。我想要做的就是创建一个 JMS 队列来处理电子邮件的生成。此过程调用服务 jmsEmailService,该服务通过调用 DAO 确定 select 电子邮件地址列表以发送电子邮件。如果找到 none,则不会发送电子邮件。现在我正在本地测试,我没有电子邮件服务器,运行 但我想验证对 DAO 的调用是否正常。如果是,那么我可以继续提交代码并获得 QA 来测试电子邮件流程。

我这样做是因为我发现一个博客确实消除了处理 JMS 的大量工作。如您所见,我需要做的就是用 JmsListener 注释 receiveEmailData 方法并提供一个已经在 Producer class 中设置为:

的目的地
private static final String SIMPLE_QUEUE = "simple.queue";

@Autowired
public JmsEmailProducerImpl(JmsTemplate jmsTemplate) {
    this.jmsTemplate = jmsTemplate;
}

@Override
public void sendEmail(EmailData emailData) {
    //EmailData emailData = new EmailData(userId, person, company, roleKind, isRemoved);
    jmsTemplate.convertAndSend(SIMPLE_QUEUE, emailData);
} 

很简单吧?那正是我所想。作为参考,这是我正在查看的网站:

http://xpadro.blogspot.com/2015/04/configure-spring-jms-application-with.html

有什么想法吗?我可以在生产者 class 行中放置断点,但一旦 jmsTemplate 触发 convertAndSend 方法,消费者 class、System.out.println() 或 log4j 日志记录中就没有断点作品。我确实在我的经纪人日志记录中看到了这一点:

2015-10-26 00:02:34,804 DEBUG   org.apache.activemq.broker.region.Queue::expireMessages:905    queue://simple.queue expiring messages ..
2015-10-26 00:02:34,804 DEBUG org.apache.activemq.broker.region.Queue::expireMessages:911   queue://simple.queue expiring messages done.
2015-10-26 00:02:34,804 DEBUG org.apache.activemq.broker.region.Queue::doPageInForDispatch:1874   queue://simple.queue, subscriptions=0, memory=0%, size=2, pending=0 toPageIn: 0, Inflight: 0, pagedInMessages.size 2, pagedInPendingDispatch.size 2, enqueueCount: 2, dequeueCount: 0, memUsage:48394

感谢加里的鼓励!我在我的 log4j 属性中有一个 org.springframework 的设置块,但是在我为 org.springframework.jms 添加它之前,jms 日志记录没有出现。我对使用和不使用我的代码进行了一些分析,发现控制台和文件输出保持不变。

所以最后,我缺少的是该博客的作者没有解释的是我需要将 @EnableJms 注释添加到我的 JMSConfiguration class 并且我需要将以下内容添加到相同 class:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory =
            new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    return factory;
}

我假设 Spring Boot 会自动向您的配置 class 添加必要的管道,而这是我没有做的一件事。一旦我这样做了,断点工作正常。

有趣的是,在 Spring 中有这么多方法可以给猫蒙皮,我本可以很容易地坚持使用 MessageListeners 并覆盖 onMessage 方法,但我想尝试使用 JmsListener 注释,因为它是更干净的代码。如果我想添加一个新的 JMS 队列,我需要做的就是创建一个 POJO 并将 @JmsListener 注释添加到将从生产者接收消息的方法中。