2015-10-26 20 views
0

我正在按照方法级别使用JmsListener注释来使用Spring JMS。我认为它正在工作,但因为我不能调试我在该方法中设置的断点或log4j日志记录不起作用,甚至没有一个简单的System.out.println(),我不是100%确定目标是击中。在日志中使用@JmsListener

@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方法,并提供业已建立在生产者类为目的地:

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

打开'org.springframework.jms'的调试日志记录以查看使用者中的活动。如果你的pojo没有被调用,这意味着容器没有运行,或者它听错了队列。 –

回答

0

感谢您的加里!我在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注释添加到将从生产者接收消息的方法中。