2014-09-10 2 views
2

Я пытаюсь настроить прослушиватель Spring Batch для отправки сообщения в Spring Integration Gateway для событий StepExecution.Как настроить StepExecutionListener с интеграцией с Spring DSL

Следующая ссылка объясняет, как настроить это с XML

http://docs.spring.io/spring-batch/trunk/reference/html/springBatchIntegration.html#providing-feedback-with-informational-messages

Как это может быть настроено с помощью Spring Integration DSL? Я не нашел способа настроить шлюз с сервисным интерфейсом с помощью DSL.

На данный момент я работал над этим, реализуя фактический StepExecutionListener и получая это, а затем вызывающий интерфейс, который аннотируется с помощью @MessagingGateway (вызывающий соответствующий метод @Gateway), чтобы получить сообщение на канал. И затем я устанавливаю поток DSL Integration для этого канала.

Есть ли более простой способ использования DSL, избегая этого обходного пути? Есть ли способ подключить прослушиватель пакетов непосредственно к шлюзу, например, можно использовать конфигурацию XML?

Приветствия, Менно

ответ

0

Прежде всего SI DSL является просто расширением существующих SI Java и настройки аннотаций, поэтому он может быть использован совместно с любой другой Java конфигурации. Разумеется, возможен и XML @Import.

В DSL нет конфигурации шлюза, поскольку его методы не могут быть подключены линейным IntegrationFlow. Необходимо обеспечить потоки ниже по потоку для каждого метода.

Итак, @MessagingGateway правильный путь, чтобы идти вперед:

@MessagingGateway(name = "notificationExecutionsListener", defaultRequestChannel = "stepExecutionsChannel") 
public interface MyStepExecutionListener extends StepExecutionListener {} 

С другой стороны @MessagingGateway разбора, а также <gateway> тег разбора заканчивается GatewayProxyFactoryBean определения. Таким образом, вы можете просто заявить, что боб, если вы не хотите, чтобы ввести новый класс:

@Bean 
public GatewayProxyFactoryBean notificationExecutionsListener(MessageChannel stepExecutionsChannel) { 
    GatewayProxyFactoryBean gateway = new GatewayProxyFactoryBean(StepExecutionListener.class); 
    gateway.setDefaultRequestChannel(stepExecutionsChannel); 
    return gateway; 
} 

После последнего Milestone 3 у меня есть представление о том, чтобы представить nested flows, когда мы сможем ввести поддержку Gateway для потоки. Что-то вроде этого:

@Bean 
public IntegrationFlow gatewayFlow() { 
     return IntegrationFlows 
       .from(MyGateway.class, g -> 
             g.method("save", f -> f.transform(...) 
                   .filter(...)) 
              .method("delete", f -> f.handle(...))) 
       .handle(...) 
       .get();        
} 

Однако я не уверен, что это упростит жизнь, насколько любая вложенная Lambda просто добавляет больше шума и может нарушить loosely coupling принцип.

+0

Привет, Артем, спасибо за подробный ответ. Невозможно ли добавить способ указания интерфейса службы на GatewayEndpointSpec, так что недавно добавленный метод eGateway() EIP можно было бы использовать для настройки шлюза и соответствующего сервисного интерфейса? – Menno

+0

Нет, потому что '.gateway()' играет ту же роль, что и '' внутри '', и это середина потока. Когда '@ MessagingGateway' является мостом POJI из вашего кода в поток интеграции Spring, используя только метод invocation и DI. Не смешивайте проблемы. В любом случае вам понадобится «вызов метода» из прослушивателя шагов партии. Поэтому любые изменения в '.gateway()' вам не помогут, так как именно ваше пакетное задание запускает метод вызова потока на интерфейсе. –

+0

Да, я вижу вашу точку зрения. Спасибо, что поняли это. – Menno

 Смежные вопросы

  • Нет связанных вопросов^_^