2015-10-26 75 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註釋添加到將從生產者接收消息的方法中。