[JAVA] Comment vérifier avant d'envoyer un message au serveur avec Spring Integration

introduction

Je vois pas mal d'articles sur Spring Framework, mais je ne trouve aucun article sur Spring Integration, probablement parce que ce n'est pas un article majeur au Japon, donc j'aimerais le publier de manière irrégulière. (Je ne dis pas que je posterai: lunettes de soleil :)

Environnement de développement

Où est le processus d'envoi d'un message via la communication TCP en premier lieu?

Le «handleRequestMessage» du «TcpOutboundGateway». Dans cette méthode, le message est envoyé au serveur en utilisant le "TcpConnection" obtenu à partir de "ClientConnectionFactory".

↓ Émetteur de message TcpOutboundGateway (partiellement omis)

TcpOutboundGateway.java


protected Object handleRequestMessage(Message<?> requestMessage) {
	TcpConnection connection = null;
	String connectionId = null;
	try {
			connection = this.connectionFactory.getConnection();
			AsyncReply reply = new AsyncReply(this.remoteTimeoutExpression.getValue(this.evaluationContext,
					requestMessage, Long.class));
			connectionId = connection.getConnectionId();
			this.pendingReplies.put(connectionId, reply);
			if (logger.isDebugEnabled()) {
				logger.debug("Added pending reply " + connectionId);
			}
			connection.send(requestMessage);

Raison de l'envoi du chèque

Normalement, il n'est pas nécessaire de vérifier lors de l'envoi, mais selon le cas, il peut y avoir une exigence telle que «surveiller l'état d'un composant et ne pas envoyer de message en fonction de l'état». C'est l'accord sur lequel je travaille en ce moment: v:

Comment vérifier la transmission

Pour le moment, il y a deux méthodes que j'ai proposées.

Étendre la passerelle TcpOutbound

Eh bien, c'est une idée simple ... Étendez TcpOutboundGateway pour remplacer handleRequestMessage. Le traitement d'envoi est effectué uniquement lorsque la valeur de retour de getStatus est true.

CustomizedTcpOutboundGateway.java


public class CustomizedTcpOutboundGateway extends TcpOutboundGateway {

  @Override
  public Object handleRequestMessage(Message<?> message) {
    if (getStatus()) {
      return super.handleRequestMessage(message);
    } else {
      return new GenericMessage<String>("can not send");
    }
  }

La valeur de retour de l'original handleRequestMessage est de type ʻObject, mais dans le cas d'un système normal, le message reçu est retourné, donc un objet Message` approprié est renvoyé. Cela dépend de vos besoins.

Profitez d'Interceptor

Vous pouvez utiliser la méthode ci-dessus, mais si vous ne voulez pas trop étendre les classes du framework, il existe un moyen d'utiliser ʻInterceptor`. La procédure est la suivante.

Tout d'abord, étendez TcpConnectionInterceptor et insérez un processus de vérification lors de l'envoi d'un message.

TcpConnectionInterceptor.java


public class TcpConnectionInterceptor extends TcpConnectionInterceptorSupport {

  @Override
  public void send(Message<?> message) throws Exception {
    if (getStatus()) {
      super.send(message);
    }
  }
 //Abréviation

Envoyez un message avec la valeur de getStatus (). Puisque TcpConnectionInterceptorSupport a plusieurs méthodes autour de la connexion, il est possible d'insérer le traitement à des moments autres qu'avant l'envoi comme cette fois: hugging:.

Ensuite, créez une classe qui implémente le TcpConnectionInterceptorFactory qui renvoie le TcpConnectionInterceptor que vous venez de créer. La mise en œuvre est appropriée.

CustomizedTcpConnectionInterceptorFactory.java


public class CustomizedTcpConnectionInterceptorFactory implements TcpConnectionInterceptorFactory {

  private final TcpConnectionInterceptorSupport interceptor;

  public CustomizedTcpConnectionInterceptorFactory(TcpConnectionInterceptorSupport interceptor) {
    this.interceptor = interceptor;
  }

  @Override
  public TcpConnectionInterceptorSupport getInterceptor() {
    return interceptor;
  }
}

Après cela, transmettez-le à TcpConnectionInterceptorFactoryChain et définissez-le sur ClientConnectionFactory.

  <int-ip:tcp-connection-factory type="client" host="localhost" port="56789"
    deserializer="deserializer" serializer="serializer" interceptor-factory-chain="interceptorFactoryChain" />

  <bean id="interceptorFactoryChain"
    class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
    <property name="interceptors">
      <array>
        <bean
          class="com.neriudon.sample.interceptor.CustomizedTcpConnectionInterceptorFactory"
          c:interceptor-ref="tcpConnectionInterceptor" />
      </array>
    </property>
  </bean>

  <bean id="tcpConnectionInterceptor"
    class="com.neriudon.sample.interceptor.TcpConnectionInterceptor" />

Les paramètres ClientConnectionFactory sont appropriés. : froncer les sourcils2:

Cette méthode est un peu compliquée, mais est-ce un avantage de ne pas jouer avec la passerelle d'origine?

Comment en êtes-vous venu à publier cet article?

En mémoire car cette fonction était nécessaire pour le projet dans lequel je suis actuellement impliqué.

à la fin

Même si vous recherchez sur Google avec le nom de classe Spring Integration, il existe de nombreux cas où les sites japonais ne sont pas accessibles, alors essayez également Spring Integration. : kissing_heart:

Recommended Posts

Comment vérifier avant d'envoyer un message au serveur avec Spring Integration
Comment interagir avec un serveur qui ne plante pas l'application
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Comment faire une capture d'écran avec l'émulateur Android Studio
Vérifiez comment définir le délai d'expiration lors de la connexion avec Spring + HikariCP + MySQL et de l'exécution de SQL
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Comment diviser un fichier de message Spring Boot
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
J'ai examiné le flux de communication TCP avec Spring Integration (édition serveur)
Envoyez une demande au backend après une authentification unique avec Spring Cloud Gateway
Comment vérifier le journal dans le conteneur Docker
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment utiliser h2db intégré avec Spring Boot
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
Comment déployer un système réalisé avec Java (démarrage Wicket-Spring) sur le serveur du campus
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
Créer un serveur API Web avec Spring Boot
[Spring Boot] Comment se référer au fichier de propriétés
Comment vérifier les commandes Rails dans le terminal
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Comment supprimer des éléments enfants associés à un élément parent en même temps
Comment changer l'action avec plusieurs boutons d'envoi
Comment exécuter l'application SpringBoot en tant que service
Comment appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration
Comment écrire un test unitaire pour Spring Boot 2
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
[Spring] Lire un message à partir d'un fichier YAML avec MessageSource
Comment supprimer un objet new_record construit avec Rails
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
Comment générer manuellement un JWT avec Knock in Rails
Organisé comment interagir avec le JDK par étapes
[Comment insérer une vidéo dans un hameau avec Rails]
Connexion HTTPS avec Java au serveur de certificats auto-signé
Comment démarrer par environnement avec Spring Boot de Maven
Comment faire un MOD pour Slay the Spire
[Java] Comment rompre une ligne avec StringBuilder
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
[Rails] Que faire lorsque la vue se réduit lorsqu'un message est affiché avec la méthode des erreurs
Comment demander un fichier CSV au format JSON avec jMeter
SDWebImage: Comment vider le cache pour une UIImageView particulière
Comment créer un formulaire pour sélectionner une date dans le calendrier
La première application WEB avec Spring Boot-Making a Pomodoro timer-
Une histoire remplie des bases de Spring Boot (résolu)
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Vérifier le fonctionnement de deux rôles avec une application de chat