【发布时间】:2015-12-08 09:13:15
【问题描述】:
我正在维护一个现有的应用程序,它接收来自 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,每个队列一个,但这似乎也不是一个好主意,因为有多个样板类我需要创建。
我觉得必须有一种方法可以根据传入对象的类型来实现某种路由,并将其映射到特定于对象的实现来处理请求,但我不确定这是否是 Spring/ JMS 已经提供。
以前有没有人做过这样的事情,如果有,有没有“弹性”的方法来做?
【问题讨论】: