java - 根据消息类型选择消息实现

标签 java spring spring-boot spring-integration

我正在尝试构建一个消息系统,该系统使用 spring 集成接受文件格式的消息。根据文件的内容,我需要调用不同的服务激活器。我正在调用一个 header 丰富器来分析内容并设置消息类型 header 。现在,根据 header 中的消息类型,我需要路由到不同的服务激活器。我可以使用基于 header 的路由器来完成此操作,但问题是消息类型的数量不是有限的列表。我需要处理各种各样的消息,但我不想创建这么多不同的 channel 。

基本上,我正在寻找一种解决方案,在该解决方案中,我需要根据 header 值在运行时选择不同的实现类来处理该消息。有没有比利用 spring 集成框架使用 switch 语句或 if/else 语句更好的方法来做到这一点?

最佳答案

也许你可以使用org.springframework.beans.factory.config.ServiceLocatorFactoryBean,定义一个MessageProcessorService:

public interface MessageProcessorService {
    void process(Message message);
}

然后是服务工厂的接口(interface):

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,您可以为每种不同的消息类型获得不同的处理器实现。

希望对你有帮助

关于java - 根据消息类型选择消息实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52419970/

相关文章:

java - 没有任何实现和变量的抽象类是有效的接口(interface)吗?

java - 除了使用 swt 绘图之外,还有更好的选择吗?

java - 在没有用户 session 计数限制的情况下使用 sessionRegistry?

java - 在 Spring Boot 测试中正确使用 TestPropertyValues

java - openjfx-11压缩包如何在Intellij IDEA中使用?

java - 并非所有内容类型都支持 Spring REST Controller 内容/类型

spring - 使用 GORM 6.1.x 在 Grails 3.3 中确定 Springs bean 实例化顺序

java - Spring SimpleFormController - 浏览器后退按钮不起作用

java - 如何从Spring云流kafka中的ErrorMessage中的有效负载获取failedMessage?

spring - 可怕的 “Unable to start EmbeddedWebApplicationContext”错误