Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据消息类型选择消息实现_Java_Spring_Spring Boot_Spring Integration - Fatal编程技术网

Java 根据消息类型选择消息实现

Java 根据消息类型选择消息实现,java,spring,spring-boot,spring-integration,Java,Spring,Spring Boot,Spring Integration,我正在尝试构建一个消息传递系统,该系统使用SpringIntegration接受文件格式的消息。根据文件的内容,我需要调用不同的服务激活器。我正在调用一个标头充实器,它分析内容并设置消息类型标头。现在,根据消息头中的消息类型,我需要路由到不同的服务激活器。我可以使用基于报头的路由器来实现,但问题是消息类型的数量不是一个有限的列表。我需要处理各种各样的消息,我不想创建这么多不同的通道 基本上,我正在寻找一种解决方案,在该解决方案中,基于头值,我需要在运行时选择不同的实现类来处理该消息。通过利用sp

我正在尝试构建一个消息传递系统,该系统使用SpringIntegration接受文件格式的消息。根据文件的内容,我需要调用不同的服务激活器。我正在调用一个标头充实器,它分析内容并设置消息类型标头。现在,根据消息头中的消息类型,我需要路由到不同的服务激活器。我可以使用基于报头的路由器来实现,但问题是消息类型的数量不是一个有限的列表。我需要处理各种各样的消息,我不想创建这么多不同的通道


基本上,我正在寻找一种解决方案,在该解决方案中,基于头值,我需要在运行时选择不同的实现类来处理该消息。通过利用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();
    }
}
让我们成为您接收信息的服务:

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


希望对您有所帮助

也许您可以使用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();
    }
}
让我们成为您接收信息的服务:

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


希望能有所帮助

谢谢。。看起来很优雅!!谢谢看起来很优雅!!