java - 根据消息类型选择消息实现
问题描述
我正在尝试构建一个使用弹簧集成接受文件格式消息的消息传递系统。根据文件的内容,我需要调用不同的服务激活器。我正在调用一个标题丰富器,它分析内容并设置消息类型标题。现在根据标头中的消息类型,我需要路由到不同的服务激活器。我可以使用基于标头的路由器来做到这一点,但问题是消息类型的数量不是有限列表。我需要处理各种各样的消息,我不想创建这么多不同的渠道。
基本上我正在寻找一种解决方案,在该解决方案中,我需要在运行时选择不同的实现类以处理该消息。有没有更好的方法来做到这一点,而不是通过利用 spring 集成框架使用 switch 语句或 if/else 语句?
解决方案
或许你可以使用org.springframework.beans.factory.config.ServiceLocatorFactoryBean,定义一个MessageProcessorService:
public interface MessageProcessorService {
void process(Message message);
}
然后是您的服务工厂的接口:
public interface MessageProcessorServiceFactory {
MessageProcessorService getMessageProcessorService(String messageType);
}
在您的配置类中,您可以创建服务工厂并实现不同的消息处理器:
@Configuration()
public class Config {
@Bean
public ServiceLocatorFactoryBean serviceLocatorFactoryBean() {
ServiceLocatorFactoryBean serviceLocatorFactoryBean = new ServiceLocatorFactoryBean();
serviceLocatorFactoryBean
.setServiceLocatorInterface(MessageProcessorServiceFactory.class);
return serviceLocatorFactoryBean;
}
@Bean("typeB")
public MessageProcessorService typeBProcessorService() {
return new MessageProcessorService() {
@Override
public void process(Message message) {
System.out.println("Processing a B type message");
}
};
}
@Bean("typeA")
public MessageProcessorService typeAProcessorService() {
return new MessageProcessorService() {
@Override
public void process(Message message) {
System.out.println("Processing an A type message");
}
};
}
@Bean
public SomeService someService(){
return new SomeService();
}
}
让 SomeService 成为您接收消息的服务:
@Service
public class SomeService {
@Autowired
private MessageProcessorServiceFactory factory;
public void doSomething(Message message) {
String messageType = message.getType();//Type must be typeA or typeB, matching processor beans names
MessageProcessorService messageProcessorService = factory.getMessageProcessorService(messageType);
messageProcessorService.process(message);
}
}
因此,通过使用 MessageProcessorServiceFactory,您可以为每种不同的消息类型获得不同的处理器实现。
希望能帮助到你
推荐阅读
- kotlin - 为什么杰克逊不能反序列化这个 JSON?
- javascript - Shopify - Slick Slider / Carousel - 响应设置不起作用
- angular - 使用 esnext 模块升级 Angular 9 后,Typescript 文件停止转换
- python - python模块未找到错误没有模块命名
- matlab - 您将如何在 MATLAB 中进行此矩阵运算?
- python - Sympy:Exp(-iHt):错误 Mutabledensematrix
- r - 如何用 R 计算子组内的出现次数?
- javascript - JavaScript:如何防止 dblclick(双击)也触发单击事件
- c# - 使用片段嵌套选项卡移动选项卡
- python - 有谁知道pytesseract的image_to_data,image_to_osd方法输出的含义?