2017-10-05 2 views
1

Actuellement, nous utilisons Spring Integration 2.1.0 Release dans notre application. flux d'application est comme ci-dessous:Recevoir l'accusé de réception du serveur TCP à notre application en utilisant le printemps Intégration

  1. Certaines opération est réalisée en application et nous avons eu la chaîne de sortie dans la chaîne via Active MQ.
  2. J'ai utilisé l'adaptateur de canal piloté par message et l'activateur de service pour lire les données de la file d'attente.
  3. Ces données sont affichées avec succès sur le serveur (l'application fonctionne en tant que client) en utilisant tcp-outbound-gateway.
  4. Le problème est lors de l'obtention de l'accusé de réception du serveur.
  5. Création d'un nouveau canal et entrée dans le canal de réponse dans la passerelle tcp-outbound
  6. Passage du même canal dans l'activateur de service en tant que canal d'entrée.
  7. Il montre ci-dessous erreur:

    [task-scheduler-5] 2017-10-05 18:32:20,732 ERROR org.springframework.integration.handler.LoggingHandler - org.springframework.integration.MessageDeliveryException: Dispatcher has no subscribers. 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:108) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:101) 
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128) 
    at org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288) 
    at org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149) 
    
code

est comme ci-dessous

<context:property-placeholder /> 

<!-- Gateway and connection factory setting --> 
<int:channel id="telnetLandingChannel" /> 

<int:channel id="telnetReplyChannel" /> 

<beans:bean id="clientCustomSerializer" 
    class="com.telnet.core.serializer.CustomSerializer"> 
    <beans:property name="terminatingChar" value="10" /> 
    <beans:property name="maxLength" value="65535" /> 
</beans:bean> 

<int:gateway id="gw" default-reply-channel="telnetReplyChannel" default-reply-timeout="100000" 
    service-interface="com.telnet.core.integration.connection.ParseTcpConfiguration$SimpleGateway" 
    default-request-channel="telnetLandingChannel"/> 

<ip:tcp-connection-factory id="clientFactory" 
    type="client" host="localhost" port="7777" single-use="false" using-nio="false" 
    serializer="${client.serializer}" deserializer="${client.serializer}" /> 

<ip:tcp-outbound-gateway id="clientInGw" 
    request-channel="telnetLandingChannel" 
    connection-factory="clientFactory" 
    reply-channel="telnetReplyChannel" 
    reply-timeout="100000"/> 

<!-- To send the messege over server via JMS and serviceActivator --> 
<int:channel id="incidentDispatchMessageChannel" /> 

<int:channel id="jmsChannel" /> 

<beans:bean id="customClientServiceActivator" 
    class= "com.telnet.core.integration.CustomClientServiceActivator"> 
</beans:bean> 


<int-jms:message-driven-channel-adapter id="incidentDispatchMessageChannelAdapter" error-channel="errorChannel" 
    connection-factory="mqConnectionFactory" 
    destination-name="${incident.processing.messaging.dispatch.queues}" 
    channel="incidentDispatchMessageChannel"/> 

<int:service-activator id="incidentMessageActivator" 
    input-channel="incidentDispatchMessageChannel" 
    output-channel="jmsChannel" 
    ref="customClientServiceActivator" method="getOutboundMessage"> 
</int:service-activator> 

<int:object-to-string-transformer id="clientBytes2String" 
    input-channel="jmsChannel" 
    output-channel="telnetLandingChannel"/> 

<!-- To receive the acknowledgement message on server via serviceActivator -->  
<int:service-activator id="incidentAck" 
    input-channel="telnetReplyChannel" 
    ref="customClientServiceActivator" method="getAck"> 
</int:service-activator> 

J'ai étudié divers article sur stackverFlow mais pas en mesure d'obtenir une solution

Répondre

0

Oui ... Ce n'est pas clair par l'erreur quel canal est coupable. D'autre part, vous utilisez vraiment la très ancienne version Spring Integration. Serait grand à considérer pour mettre à jour à la dernière: http://projects.spring.io/spring-integration/.

Cependant, je pense que ce problème est en quelque sorte exactement celui reply-channel, que vous utilisez non seulement pour le <service-activator> mais aussi pour le <int:gateway>.

Je vous suggère de supprimer default-reply-channel="telnetReplyChannel" de la définition de la passerelle, supprimer reply-channel="telnetReplyChannel" de la définition <ip:tcp-outbound-gateway>. Et laissez-les communiquer via replyChannel en-tête peuplé par la passerelle lors de la demande.

En ce qui concerne votre flux <int-jms:message-driven-channel-adapter> ce qui conduit à la même <ip:tcp-outbound-gateway>, je suggère de rester encore avec l'en-tête replyChannel mais ici le remplir par <header-enricher> avant d'envoyer un message à l'telnetLandingChannel. Ce replyChannel via <header-enricher> serait exactement un input-channel pour le <int:service-activator> suivant pour gérer ack à partir du <ip:tcp-outbound-gateway>.

+0

J'ai supprimé telnetReplyChannel du canal de réponse par défaut (de passerelle) et du canal de réponse (de ). –

+0

Je suis capable de voir le message d'accusé de réception (comme byteArray) dans la charge utile dans AbstractReplyProducingMessageHandler.sendReplyMessage (Message replyMessage, final Object replyChannelHeaderValue) mais replyChannelHeaderValue est null. S'il vous plaît aider .. –

+0

S'il vous plaît, partagez votre code via un EDIT dans votre question –

0

J'ai la solution de ce problème, il y a plusieurs xml dans notre code mais j'ai ajouté le code en un pour montrer le flux dans stackOverflow. Problème était que j'avais défini dans un fichier XML qui a seulement une partie de configuration comme Outbound adaptateur connexion usine où il devrait être défini dans un autre xml où j'utilise l'activateur de service. Changé la place de la définition de canal et cela a fonctionné.

Je veux déconnecter le TCP (en tant que serveur) au moment où j'ai reçu le message de réponse. A partir de maintenant, j'utilise so-timeout, donc mon serveur TCP sera temporisé après l'heure donnée dans so-timeout, mais l'exigence est de déconnecter la connexion au moment où TCP imprime/affiche l'acquittement. S'il vous plaît suggérer comment puis-je implémenter ceci.

+0

S'il vous plaît partager quelques pointeurs sur la façon de déconnecter le serverconnect après l'affichage de la réponse sur le serveur, sans attendre le temps de si-timeout. –