2014-09-10 2 views
2

J'essaie de configurer un écouteur Spring Batch pour envoyer un message à un événement Spring Integration Gateway for StepExecution.Comment configurer StepExecutionListener avec Spring Integration DSL

Le lien suivant explique comment configurer cela avec XML

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

Comment cela peut-il être configuré via DSL Spring Integration? Je n'ai trouvé aucun moyen de configurer une passerelle avec une interface de service utilisant DSL.

Au moment où j'ai travaillé autour de cela en implémentant un StepExecutionListener réel, j'ai ensuite appelé une interface qui est annotée avec @MessagingGateway (appelant la méthode @Gateway correspondante) afin d'obtenir un message à un canal. Et je configure ensuite un flux DSL d'intégration pour ce canal.

Existe-t-il un moyen plus simple d'utiliser DSL, en évitant cette solution de contournement? Existe-t-il un moyen de connecter directement un écouteur Batch à une passerelle, comme on peut utiliser la config XML?

Cheers, Menno

Répondre

0

tout d'abord DSL SI est juste une extension existante du SI Java et configuration d'annotation, de sorte qu'il peut être utilisé conjointement avec toute autre configuration Java. Bien sûr, un XML @Import est également possible.

Il n'y a pas de configuration de passerelle dans le DSL, car ses méthodes ne peuvent pas être câblées avec IntegrationFlow linéaire. Il est nécessaire de fournir des flux en aval pour chaque méthode.

Ainsi, @MessagingGateway est une bonne façon d'aller de l'avant:

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

De l'autre côté @MessagingGateway l'analyse syntaxique ainsi que <gateway> termine l'analyse syntaxique tag avec GatewayProxyFactoryBean définition. Donc, vous ne pouvez déclarer que le haricot, si vous ne voulez pas d'introduire une nouvelle classe:

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

Après la dernière Milestone 3 j'ai une idée d'introduire nested flows, quand nous pourrions être en mesure d'introduire Gateway soutien les flux. Quelque chose comme ceci:

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

Cependant, je ne suis pas sûr que cela va simplifier la vie, dans la mesure où tout Lambda imbriquée ajoute un peu plus de bruit et pourrait briser loosely coupling principe.

+0

Salut Artem, merci pour votre réponse détaillée. Est-il impossible d'ajouter un moyen de spécifier une interface de service sur GatewayEndpointSpec, de sorte que la méthode EIP .gateway() récemment ajoutée puisse être utilisée pour configurer la passerelle et l'interface de service correspondante? – Menno

+0

Non, car '.gateway()' joue le même rôle que '' dans '' et il s'agit d'un milieu de flux. Lorsque '@ MessagingGateway' est un pont POJI entre votre code et le flux d'intégration de Spring en utilisant seulement l'appel de méthode et DI. Ne mélangez pas les préoccupations. Quoi qu'il en soit, vous avez besoin d'une invocation de méthode depuis l'écouteur de l'étape Batch. Par conséquent, toute modification de '.gateway()' ne vous aidera pas, car votre travail batch démarre exactement la méthode d'invocation de flux sur l'interface. –

+0

Oui, je vois ce que vous voulez dire. Merci d'avoir éclairci ça. – Menno

Questions connexes