使用 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 多个方法的设计可能不是一个好的设计。
由于
我正在维护的应用程序需要处理来自传入 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 多个方法的设计可能不是一个好的设计。