2015-09-11 32 views
0

我正在維護一個現有的應用程序,它接收來自ActiveMQ的請求並通過ActiveMQ主題將響應發回給發件人。目前有其通過簡單的使用DefaultMessageListenerContainer接收消息的單個消息的消費階層:基於對象類型的Spring JMS消息切換

@Component 
public class RequestConsumer { 

    @Autowired 
    CustomerService customerService; 

    @Autowired 
    JmsSenderService jmsSenderService; 

    public void handleMessage(Message message) { 

     if (message instanceof CustomerRequest) { 

      CustomerRequest customerRequest = (CustomerRequest) message; 

      Customer customer = customerService.getCustomerById(customerRequest.getId()); 

      CustomerResponse customerResponse = new CustomerResponse(); 
      customerResponse.addCustomer(customer); 

      jmsSenderService.sendCustomerResponse(customerResponse); 
     } 
    } 
} 

我需要擴展應用程序來處理多個不同的請求(例如OrderRequest,InvoiceRequest,InventoryRequest,AddressRequest等)和發送適當的回覆給發件人。我的第一個想法是將功能添加到現有類中,如下所示:

public void handleMessage(Message message) { 

    if (message instanceof CustomerRequest) { 

     // deal with CustomerRequest 

    } else if (message instanceof InvoiceRequest) { 

     // deal with InvoiceRequest 

    } else if (message instanceof InventoryRequest) { 

     // deal with InventoryRequest 
    } 
} 

但是,這會使類很大。我也考慮過爲每個請求類型實現一個隊列(例如,customer.request.queue,invoice.request.queue)並實現多個DefaultMessageListenerContainer,每個隊列一個,但是這看起來不是一個好主意,要麼是因爲多個樣板類我需要創建。

我覺得必須有一種方法來實現基於傳入對象類型的某種路由並將其映射到特定於對象的實現來處理請求,但我不確定這是否是某種東西/ JMS已經提供。

有沒有人做過這樣的事情,如果有的話,是否有一種「春天」的方式來做到這一點?

回答

0

如果你願意投資一些時間(如該解決方案提供了初始時間投資),那麼絕對是一個春天,符合解決方案:

Spring集成

這個庫(一良好的JMS示例here)針對您可能面臨的所有常見消息傳遞問題(包括剛剛在上面描述的問題(message-type based routing))提供了預構建和經過充分測試的解決方案。

+0

謝謝你的指針,看起來像Spring Integration將滿足我的需求。 –