我遵循在方法级别使用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
答案 0 :(得分:1)
感谢加里!我在log4j属性中有一个org.springframework设置块,但是在我为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注释添加到将从生产者接收消息的方法中。