Spring 基于对象类型的 JMS 消息切换
Spring JMS message switching based on type of object
我正在维护一个现有应用程序,该应用程序从 ActiveMQ 接收请求并通过 ActiveMQ 主题将响应发送回发件人。目前只有一个消息消费者 class 通过简单的 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 等)并将适当的响应发送回发件人。我的第一个想法是将功能添加到现有 class 中,如下所示:
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
}
}
然而,这会使 class 变得相当大。我还考虑过为每个请求类型实现一个队列(例如 customer.request.queue、invoice.request.queue)并实现多个 DefaultMessageListenerContainer,每个队列一个,但这似乎不是一个好主意,因为多个样板 classes 我需要创建。
我觉得一定有一种方法可以根据传入对象的类型实现某种路由,并将其映射到特定于对象的实现来处理请求,但我不确定这是否可行Spring/JMS已经提供了。
以前有没有人做过类似的事情,如果有,有没有 "Springy" 的方法?
如果您愿意投入一些时间(因为此解决方案伴随着初始时间投入),那么绝对有一个 Spring 符合的解决方案:
Spring 整合
这个库(一个很好的 JMS 示例 here) has prebuilt and well-tested solutions for all common messaging issues you might face, including the problem you just described above (message-type based routing)。
我正在维护一个现有应用程序,该应用程序从 ActiveMQ 接收请求并通过 ActiveMQ 主题将响应发送回发件人。目前只有一个消息消费者 class 通过简单的 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 等)并将适当的响应发送回发件人。我的第一个想法是将功能添加到现有 class 中,如下所示:
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
}
}
然而,这会使 class 变得相当大。我还考虑过为每个请求类型实现一个队列(例如 customer.request.queue、invoice.request.queue)并实现多个 DefaultMessageListenerContainer,每个队列一个,但这似乎不是一个好主意,因为多个样板 classes 我需要创建。
我觉得一定有一种方法可以根据传入对象的类型实现某种路由,并将其映射到特定于对象的实现来处理请求,但我不确定这是否可行Spring/JMS已经提供了。
以前有没有人做过类似的事情,如果有,有没有 "Springy" 的方法?
如果您愿意投入一些时间(因为此解决方案伴随着初始时间投入),那么绝对有一个 Spring 符合的解决方案:
Spring 整合
这个库(一个很好的 JMS 示例 here) has prebuilt and well-tested solutions for all common messaging issues you might face, including the problem you just described above (message-type based routing)。