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

时间:2015-10-26 16:16:38

标签: java spring spring-jms

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

1 个答案:

答案 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注释添加到将从生产者接收消息的方法中。