【问题标题】:Spring JMS message switching based on type of object基于对象类型的 Spring JMS 消息切换
【发布时间】: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 已经提供。

以前有没有人做过这样的事情,如果有,有没有“弹性”的方法来做?

【问题讨论】:

    标签: java spring jms


    【解决方案1】:

    如果您愿意投入一些时间(因为此解决方案带有初始时间投入),那么绝对有一个符合 Spring 的解决方案:

    春季集成

    这个库(一个很好的 JMS 示例 here)为您可能面临的所有常见消息传递问题提供了预构建和经过充分测试的解决方案,包括您刚才描述的问题 (message-type based routing)。

    【讨论】:

    • 感谢您的指点,看来 Spring Integration 会满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2011-02-16
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多