2015-09-11 34 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将满足我的需求。 –