0

Je souhaite utiliser un canal exécuteur au lieu d'un canal direct, mais je suis confronté à un problème que je ne comprends pas.Spring-Integration: Modification des résultats DirectChannel à ExecutorChannel en ClassCastException

de travail Config:

<int:channel id="newByteArrayChannel" datatype="java.lang.Byte[]" /> 

<int:service-activator 
    id="myEncryptionServiceActivator" 
    ref="encryptionServiceConnector" 
    method="encrypt" 
    input-channel="newByteArrayChannel" 
    output-channel="encryptedByteArrayChannel" 
    requires-reply="true" 
    send-timeout="1000" 
/> 

changé à (ne fonctionne pas):

<int:channel id="newByteArrayChannel" datatype="java.lang.Byte[]"> 
    <int:dispatcher task-executor="myExecutor" /> 
</int:channel> 
<task:executor id="myExecutor" pool-size="4" queue-capacity="10" keep-alive="10000"/> 

<int:service-activator 
    id="myEncryptionServiceActivator" 
    ref="myServiceConnector" 
    method="encrypt" 
    input-channel="newByteArrayChannel" 
    output-channel="encryptedByteArrayChannel" 
    requires-reply="true" 
    send-timeout="1000" 
/> 

erreur:

Exception in thread "main" org.springframework.messaging.MessageDeliveryException: Channel 'newByteArrayChannel' expected one of the following datataypes [class [Ljava.lang.Byte;], but received [class [B] 

Merci à avance :-)

Répondre

1

C'est un bug - j'ai ouvert un JIRA Issue. En guise de solution, vous pouvez passer un canal direct au canal exécuteur ou changer newByteArrayChannel en un canal d'abonnement de publication - (avec un seul abonné, ou cours).

<int:publish-subscribe-channel id="newByteArrayChannel" 
     datatype="java.lang.Byte[]" task-executor="myExecutor" /> 

Ou vous pouvez injecter explicitement un haricot DefaultDatatypeChannelMessageConverter dans le canal.

+0

Ajout d'un travail autour. –

+0

Merci de créer Jira-Issue et pour le travail, ce qui fonctionne bien. :-) –

0

Aussi bien la solution de Gery Russels fonctionne, j'ai fini avec une solution différente que je veux aussi partager. J'ai fait le canal entrant comme canal de file d'attente, et l'interroger à partir de l'activateur de service à l'aide d'un exécuteur de tâches:

<int:channel id="newByteArrayChannel" datatype="java.lang.Byte[]"> 
    <int:queue capacity="1000"/> 
</int:channel> 

<int:service-activator 
    id="myEncryptionServiceActivator" 
    ref="myServiceConnector" 
    method="encrypt" 
    input-channel="newByteArrayChannel" 
    output-channel="encryptedByteArrayChannel" 
    requires-reply="true" 
    send-timeout="1000" 
> 
    <int:poller fixed-delay="100" task-executor="myExecutor"/> 
</int:service-activator> 
<task:executor id="myExecutor" pool-size="4-32" queue-capacity="10000" keep-alive="10000"/>