Представление пула потоков в Spring Integration, а не в ExecutorService

В настоящее время в одном из наших приложений существует код, подобный следующему:

@Component
public class ProcessRequestImpl {

   private ExecutorService executorService;

   public processRequest(...) {
      // code to pre-process request

      executorService.execute(new Runnable() {
         public void run() {
            ProcessRequestImpl.this.doWork(...);
         }
      }
   }

   private void doWork(...) {
      // register in external file that request is being processed
      // call external service to handle request
   } 

}

Целью этого является создание очереди запросов к внешней службе. Внешней службе может потребоваться некоторое время для обработки каждого входящего запроса. После обработки каждого из них он обновит внешний файл, чтобы зарегистрировать, что конкретный запрос был обработан.

ProcessRequestImpl сам по себе не имеет состояния, поскольку все состояние задается в конструкторе, и нет внешнего доступа к этому состоянию. Метод process() вызывается другим компонентом приложения.

Если бы это было реализовано в приложении Spring Integration, какой из следующих двух подходов был бы лучше всего рекомендован:

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

Вот некоторые из причин, по которым мы смотрим на Spring Integration:

  1. Чтобы удалить логику рабочего процесса из самого кода, чтобы рабочий процесс и цепочка обработки были очевидны на более высоком уровне.
  2. Чтобы упростить каждый класс, улучшив читаемость и тестируемость.
  3. Чтобы избежать многопоточности кода, если это возможно, и определить это на более высоком уровне абстракции в конфигурации.

Учитывая пример кода, можно ли достичь этих целей с помощью Spring Integration. Также, что было бы примером DSL для достижения этого.

Спасибо


person user1052610    schedule 09.03.2018    source источник


Ответы (1)


Что-то типа

@Bean 
public IntegrationFlow flow() {
    return IntegrationFlows.from(SomeGatewayInterface.class)
          .handle("someBean", "preProcess")
          .channel(MessageChannels.executor(someTaskExecutorBean())
          .handle("someBean", "doWork")
          .get();

Аргумент, переданный методу шлюза, становится полезной нагрузкой метода preprocess, который возвращает некоторый объект, который становится полезной нагрузкой сообщения, который становится параметром, переданным в doWork.

person Gary Russell    schedule 09.03.2018