2015-08-12 1 views
1

У меня есть метод, который нужно выполнить несколько задач async'ly .. Мне удалось добиться того, что с помощью следующих IntegrationFlow:Spring Integration Java DSL - динамически назначает получателей RecepientListRouter?

@Bean 
public IntegrationFlow startJobTask() { 
    return IntegrationFlows.from("TaskRoutingChannel") 
      .handle("jobService", "executeTasks") 
      .routeToRecipients(r -> r 
       .recipient("testTaskChannel") 
       .recipient("test2TaskChannel")) 
      .get(); 
} 

@Bean ExecutorChannel testTaskChannel(){ 
    return new ExecutorChannel(this.getAsyncExecutor()); 
} 

@Bean ExecutorChannel test2TaskChannel(){ 
    return new ExecutorChannel(this.getAsyncExecutor()); 
} 

@Bean 
public Executor getAsyncExecutor() { 
    SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor(); 
    return executor; 
} 

@Bean 
public IntegrationFlow testTaskFlow() { 
    return IntegrationFlows.from("testTaskChannel") 
      .handle("testTaskService", "executeAsync") 
      .get(); 
} 

@Bean 
public IntegrationFlow test2TaskFlow() { 
    return IntegrationFlows.from("test2TaskChannel") 
      .handle("test2TaskService", "executeAsync") 
      .get(); 
} 

выше потока в основном следующим образом:

TaskRoutingChannel звонки метод ServiceActivator executeTasks

executeTasks возвращает что-то вроде Message<List<myTask>>

это Message направляется на каналы testTaskChannel и test2TaskChannel , который называет их собственные методы async serviceActivator.

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

Есть ли способ установить каналы получателей динамически?

ответ

1

Извините за задержку в первую очередь.

Собственно регулярное .route() может сделать это для вас, потому что это именно имеет этот вариант:

protected abstract Collection<MessageChannel> determineTargetChannels(Message<?> message); 

Таким образом, если извлечение заголовка возвращает список каналов, HeaderValueRouter сможет послание все они.

+0

Вау! это действительно опрятный трюк. Не знал об этом. Ура! – Ocelot