Spring Integration Datatype channel

Nell’articolo precedente abbiamo presentato i Messaging Template, i Message Channel ed il Direct Channel.

Il Datatype Channel può essere utile nel caso in cui si abbia la necessità di processare solo un determinato tipo di payload, dunque di applicare una sorta di filtro.

In realtà questo scopo può essere raggiuntu utilizzando diversi trucchetti, ma quello di utilizzare un Datatype Channel è sicuramente il più semplice e pulito. Inoltre, se ne possono includere di diversi, per diversificare  i tipi di Payload.

La sua configurazione è semplicissima, basta fornire il nome della classe nell’attributo datatype:


<int:channel id="numberChannel" 
    datatype="java.lang.Number" />

Questo canale accetterà tutti gli oggetti di tipo Number, ma anche le istanze di tutte le classi figlie quali: java.lang.Integer, java.lang.Double, ecc.

L’attributo datatype permette anche l’inserimento di più valori, separati da virgole:


<int:channelid="stringOrNumberChannel" 
    datatype="java.lang.String,java.lang.Number" />

Nel caso in cui il tipo non rispetti il datatype impostato viene lanciata un’eccezione, ammenochè non sia stato definito un bean chiamato integrationConversionService che è un’istanza del Conversion Service di Spring (maggiori info qui: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/validation.html#core-convert-ConversionService-API). Tale bean sarà utilizzato per tentare di convertire il payload in un tipo accettato, è anche possibile definire dei converter personalizzati.

Immaginiamo di inviare un messaggio contenente una stringa al numberChannel definito sopra:


MessageChannel inChannel = context.getBean(  "numberChannel", MessageChannel.class); 
inChannel.send(new GenericMessage<String>("5"));

Sebbene si tratti di un’operazione tipica, comporterà il lancio di un’eccezione in quanto il tipo del payload non corrisponde a quelli accettati:


Exception in thread"main" 
    org.springframework.integration.MessageDeliveryException: 
    Channel'numberChannel' expected one of the following datataypes 
    [class java.lang.Number], but received [class java.lang.String]…

Dunque, per ovviare questo problema implementiamo un converter:


publicstaticclass StringToIntegerConverterimplements Converter<String, Integer> {
     public Integer convert(String source) {
          return Integer.parseInt(source);
     }
}

E, ovviamente, registrarlo:

<int:converter ref="strToInt"/>
<bean id="strToInt" 
    class="org.springframework.integration.util.Demo.StringToIntegerConverter"/>

Vedi anche:

Leave a Reply