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)。