使用 Spring 集成将域对象路由到适当的方法

Using Spring Integration to route domain objects to the appropriate method

由于 ,我最近开始研究 Spring 集成,并且对基于对象类型的路由有疑问。

我正在维护的应用程序需要处理来自传入 ActiveMQ 队列 (request.queue) 的请求,并针对某个主题 (response.topic) 将响应发送回调用方。目前请求结构如下:

public abstract class Request {

    // base class
}

public abstract class CustomerRequest extends Request {

    // base class for customer-specific requests
}

public class FindCustomerByIdRequest extends CustomerRequest {

    private int id;
}

public class FindAllCustomersRequest extends CustomerRequest {

    private boolean includeArchivedCustomers;
}

public class AddCustomerRequest extends CustomerRequest {

    private String name;
    private Date signupDate;
    private Address address;
}

我为每个高级域对象提供了一项服务,它提供了为这些传入请求提供服务的功能:

@Service
public class CustomerService {

    public CustomerResponse findCustomerById(FindCustomerByIdRequest request) {

        // code snipped

        return customerResponse;
    }

    public AddCustomerResponse addCustomer(AddCustomerRequest request) {

        // code snipped

        return addCustomerResponse;
    }
}

我需要通过 @ServiceActivator 将每个特定请求路由到 CustomerService 中的适当方法,据我所知,可以通过为每个请求创建一个单独的通道并实现 PayloadTypeRouter根据类型将请求放在正确的频道上。

随着时间的推移,请求类型列表会越来越多,我想知道每个请求一个通道的设置是否 efficient/practical/scalable。例如,如果将来有 100 种不同的请求类型,则将有 100 种不同的渠道。

如果我可以将超类 CustomerRequest 的高级请求路由到 CustomerService 并让 Spring 计算出适当的方法以通过注释或一些其他机制。有谁知道这是否可行,或者对多渠道方法有任何意见?

您的请求类型似乎是特定于应用功能的。这表明您为所有可能的应用程序功能准备了一个队列。这是个可怕的想法。每个功能至少应该有单独的队列。

我建议重新考虑您应用的设计。

如果没有歧义,使用<service-activator ... reg="fooBean" />(没有method),框架会根据payload选择目标方法。

如果有歧义(同一类型有多个方法),就会失败。

但是,一个 class 具有 100 多个方法的设计可能不是一个好的设计。