2017-09-26 4 views
0

j'ai simple usine de connexion TCP mis en œuvre Spring Integration:têtes d'intégration de printemps sur les événements de message

@Bean 
@ServiceActivator(inputChannel = "toTcpChannel") 
public TcpSendingMessageHandler tcpOutClient() throws Exception { 
    TcpSendingMessageHandler sender = new TcpSendingMessageHandler(); 
    sender.setConnectionFactory(clientFactory()); 
    sender.setClientMode(false); 
    sender.afterPropertiesSet(); 
    return sender; 
} 

@Bean 
public AbstractClientConnectionFactory clientFactory() { 
    final TcpNioClientConnectionFactory factory = new TcpNioClientConnectionFactory(tcpHost, tcpPort); 
    factory.setSingleUse(true); 
    return factory; 
} 

@EventListener 
public void handleTcpConnectionOpenEvent(TcpConnectionOpenEvent event) throws Exception {   
LOGGER.info("TCP connection OPEN event: {}", event.getConnectionId()); 
// HERE I would like to have "myCustomID" header here. 
} 

Je cherche obtenir l'ID personnalisé que je fournis via la passerelle dans le produit TcpConnectionOpenEvent (ou similaire via intercepteurs)

@Gateway(requestChannel="toTcpChannel") 
public void sendToTcp(@Payload String message, @Header("myCustomID") Long myCustomID); 

Je sais que c'est un événement à ne pas un message mais je ne sais comment obtenir l'ID de connexion que je vais recevoir dans le canal d'entrée de toute autre manière.

Je crée un type de carte de hachage de my custom id – connection id. Je ne peux pas utiliser une corrélation personnalisée via l'agrégateur car le message de réponse ne contiendra aucune information sur le message envoyé précédemment. Toutes les suggestions seront les bienvenues.

+0

Désolé, ce qui est une question? Le 'TcpConnectionOpenEvent' est certainement sur le point de commencer la connexion et c'est vrai qu'il n'y a aucun message ici pour traiter. Cependant, sur cet événement, vous pouvez vraiment stocker 'connectionId' pour votre futur usage. –

+0

je besoin d'un Interceptor dans le moment que je l'ai déjà un identifiant de connexion et je suis encore avoir l'envoi des en-têtes de canal. Ma première approche consiste à remplacer le TcpSendingMessageHandler. – crm86

Répondre

0

Oh! Je vois. Je ne sais pas ce que vous allez faire de votre commande TcpSendingMessageHandler, mais aussi loin que ApplicationEventPublisher est mono-thread, vous pouvez stocker la connectionId dans la variable ThreadLocal et obtenir à partir de là envoyer après l'opération.