2017-08-27 1 views
1

configuration Xml avec prise en charge d'espace de noms permet l'imbrication des gestionnaires dans la balise de chaîne de gestionnaire comme ci-dessous:Est-il possible de configurer une intégration de printemps 'MessageHandlerChain' en utilisant uniquement des annotations Java?

<int:chain input-channel="input"> 
    <int-xml:marshalling-transformer marshaller="marshaller" result-type="StringResult" /> 
    <int:service-activator ref="someService" method="someMethod"/> 
    <int:header-enricher> 
     <int:header name="foo" value="bar"/> 
    </int:header-enricher> 
    <int:logging-channel-adapter level="INFO" log-full-message="true"/> 
</int:chain> 

Mais je ne vois pas comment cela peut être réalisé dans une configuration à base d'annotation. La documentation de référence d'intégration de Spring ne montre aucun exemple de configuration d'annotation dans la section MessageHandlerChain (https://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html#chain). Donc, je me demande si c'est possible ou si oui, s'il vous plaît montrez-moi un exemple de configuration.

Répondre

0

Voir Programming Tips and Tricks.

Si vous connaissez la configuration XML Spring Integration déjà, en commençant par la version 4.3, nous fournissons les éléments XSD définitions de la description avec le pointeur qui cible les classes sont utilisées pour produire des fèves pour l'adaptateur ou la passerelle.

Dans ce cas:

<xsd:annotation> 
    <xsd:documentation> 
     Defines a Consumer Endpoint for the 'org.springframework.integration.handler.MessageHandlerChain' 
     composed of a chain of Message Handlers. 
    </xsd:documentation> 
</xsd:annotation> 

Le MessageHandlerChain@Bean obtient une liste de MessageHandler s.

Vous pouvez également envisager d'utiliser le Java DSL à la place

@Bean 
public IntegrationFlow flow() { 
    return f -> f.handle(...) 
     .handle(...) 
     .transform(...) 
     .handle(...); 
} 

EDIT

Il est pas si facile à utiliser Java DSL pour les services POJO; vous pouvez câbler en réel MessageHandler s directement, mais pour les services POJO, vous avez besoin de deux @Bean s pour chacun. Voici un exemple ...

@SpringBootApplication 
public class So45910254Application { 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(So45910254Application.class, args); 
     context.getBean("input", MessageChannel.class).send(new GenericMessage<>("bar")); 
     context.close(); 
    } 

    @ServiceActivator(inputChannel = "input") 
    @Bean 
    public MessageHandler chain() { 
     MessageHandlerChain chain = new MessageHandlerChain(); 
     chain.setHandlers(Arrays.asList(myPOJOMessageHandler(), logger())); 
     return chain; 
    } 

    @Bean 
    public MessageHandler myPOJOMessageHandler() { 
     return new ServiceActivatingHandler(processor()); 
    } 

    @Bean 
    public MethodInvokingMessageProcessor<?> processor() { 
     return new MethodInvokingMessageProcessor<>(foo(), "upCase"); 
    } 

    @Bean 
    public Foo foo() { 
     return new Foo(); 
    } 

    @Bean 
    public LoggingHandler logger() { 
     return new LoggingHandler(Level.INFO); 
    } 

    public static class Foo { 

     public String upCase(String in) { 
      return in.toUpperCase(); 
     } 

    } 

} 
+0

J'ai vu des descriptions XSD mais il semble toujours impossible de configurer une chaîne de gestionnaire en utilisant uniquement des annotations. Par exemple, l'annotation pour configurer un activateur de service est '@ServiceActivator (inputChannel =" hotDrinkBarista ", outputChannel =" preparedDrinks ") public Boire prepareHotDrink (OrderItem orderItem) {...}' Ce style de configuration ne donne pas moi une référence au bean 'MessageHandler' et donc il ne peut pas être ajouté à une chaîne. Les configs DSL sont cependant une bonne alternative. – hummingV

+0

Non; vous n'utilisez pas '@ ServiceActivator'. Voir ma modification ce n'est pas très pratique pour invoquer les services POJO, mais cela peut être fait. Le DSL est préféré. –

+0

Gotcha. Merci beaucoup. – hummingV