为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2021-09-29 15:31:39
我正在尝试构建一个消息系统,该系统使用 spring 集成接受文件格式的消息。根据文件的内容,我需要调用不同的服务激活器。我正在调用一个标头丰富器来分析内容并设置一个消息类型标头。现在根据标头中的消息类型,我需要路由到不同的服务激活器。我可以使用基于标头的路由器来做到这一点,但问题是消息类型的数量不是有限列表。我需要处理各种各样的消息,我不想创建这么多不同的频道。基本上,我正在寻找一种解决方案,其中基于标头值,我需要在运行时选择不同的实现类以处理该消息。有没有比使用 switch 语句或 if/else 语句更好的方法来利用 spring 集成框架来做到这一点?
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

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


希望能帮助到你


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信