【问题标题】:Using @JmsListener with logging将 @JmsListener 与日志记录一起使用
【发布时间】:2016-01-25 20:06:01
【问题描述】:

我正在遵循有关在方法级别使用 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 来选择要发送电子邮件的电子邮件地址列表。如果没有找到,则不发送电子邮件。现在我在本地进行测试,我没有启动和运行电子邮件服务器,但我想验证对 DAO 的调用是否正常。如果是,那么我可以继续提交代码并让 QA 测试电子邮件流程。

我之所以这样做,是因为我发现一个博客确实消除了与 JMS 打交道的大部分工作。如您所见,我需要做的就是用 JmsListener 注释 receiveEmailData 方法,并提供一个已经在 Producer 类中设置的目的地:

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

有什么想法吗?我可以在有效的生产者类的行中放置一个断点,但是一旦 jmsTemplate 触发 convertAndSend 方法,消费者类中就没有断点,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

【问题讨论】:

  • 打开org.springframework.jms 的调试日志以查看消费者的活动。如果你的 pojo 没有被调用,这意味着容器没有运行或者它正在监听错误的队列。

标签: java spring spring-jms


【解决方案1】:

感谢加里的轻推!我的 log4j 属性中有 org.springframework 的一组设置,但是 jms 日志记录直到我为 org.springframework.jms 添加它才出现。我对有无代码进行了一些分析,发现控制台和文件输出保持不变。

所以最后,我错过了该博客的作者没有解释的是我需要将 @EnableJms 注释添加到我的 JMSConfiguration 类中,并且我需要将以下内容添加到同一个类中:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-06-03
    • 2021-05-09
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多