我正在维护一个现有的应用程序,它接收来自ActiveMQ的请求,并通过ActiveMQ主题将响应发送回发送方。目前有一个消息使用者类,它通过一个简单的DefaultMessageListenerContainer接收消息:
@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,每个队列一个,但这似乎不是一个好主意,因为多个boilerplated类我需要创建。
我觉得必须有一种方法可以根据传入对象的类型实现某种路由,并将其映射到特定于对象的实现来处理请求,但我不确定这是否是Spring / JMS已经提供。
之前有没有人做过这样的事情,如果有的话,有“弹性”的方法吗?
答案 0 :(得分:0)
如果您愿意投入一些时间(因为此解决方案需要初始时间投入),那么有一个绝对符合Spring的解决方案:
Spring Integration
这个库(一个很好的JMS示例here)具有针对您可能遇到的所有常见消息传递问题的预构建且经过良好测试的解决方案,包括您刚才描述的问题(message-type based routing)。