Выберите реализацию сообщения на основе типа сообщения - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать систему обмена сообщениями, которая принимает сообщения в формате файлов с использованием Spring интеграции.Исходя из содержимого файла, мне нужно вызвать различные активаторы службы.Я вызываю обогащатель заголовка, который анализирует содержимое и устанавливает заголовок типа сообщения.Теперь, основываясь на типе сообщения в заголовке, мне нужно направить к различным активаторам службы.Я могу сделать это с помощью маршрутизатора на основе заголовков, но проблема в том, что количество типов сообщений не является конечным списком.Существует большое разнообразие сообщений, которые мне нужно обработать, и я не хочу, чтобы было создано так много разных каналов.

В основном я ищу решение, в котором на основе значения заголовка янужно выбрать различные классы реализации во время выполнения для обработки этого сообщения.Есть ли лучший способ сделать это вместо использования оператора switch или оператора if / else путем использования инфраструктуры интеграции Spring?

1 Ответ

0 голосов
/ 20 сентября 2018

Может быть, вы можете использовать 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, вы можете получить разные реализации процессора для каждого типа сообщений.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...