gpt4 book ai didi

java - 使用 @JmsListener 进行日志记录

转载 作者:行者123 更新时间:2023-11-30 07:50:57 35 4
gpt4 key购买 nike

我正在遵循在方法级别使用 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

最佳答案

感谢加里的鼓励!我的 log4j 属性中有一个 org.springframework 的设置 block ,但是直到我为 org.springframework.jms 添加它之后,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 注解添加到将从生产者那里接收消息的方法。

关于java - 使用 @JmsListener 进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33350579/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com