[JAVA] So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden

Einführung

Ich sehe einige Artikel über Spring Framework, aber ich kann keine Artikel über Spring Integration finden, wahrscheinlich weil sie in Japan nicht besonders wichtig sind. Deshalb möchte ich sie unregelmäßig veröffentlichen. (Ich sage nicht, dass ich posten werde: Sonnenbrille :)

Entwicklungsumgebung

Wo wird überhaupt eine Nachricht über TCP-Kommunikation gesendet?

Die handleRequestMessage des TcpOutboundGateway. Bei dieser Methode senden wir eine Nachricht mit "TcpConnection" von "ClientConnectionFactory" an den Server.

TcpOutboundGateway Nachrichtensender (teilweise weggelassen)

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);

Grund für das Senden des Schecks

Normalerweise ist es nicht erforderlich, dies beim Senden zu überprüfen. Je nach Fall kann jedoch eine Anforderung wie "Überwachen des Status einer Komponente und Senden einer Nachricht je nach Status" erforderlich sein. Das ist der Deal, an dem ich gerade arbeite: v:

So überprüfen Sie die Übertragung

Derzeit gibt es zwei Methoden, die ich mir ausgedacht habe.

Erweitern Sie TcpOutbound Gateway

Nun, es ist eine einfache Idee ... Erweitern Sie "TcpOutboundGateway", um "handleRequestMessage" zu überschreiben. Die Sendeverarbeitung wird nur ausgeführt, wenn der Rückgabewert von "getStatus" "true" ist.

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");
    }
  }

Der Rückgabewert der ursprünglichen "handleRequestMessage" ist vom Typ "Object", aber im Fall eines normalen Systems wird die empfangene Nachricht zurückgegeben, sodass ein geeignetes "Message" -Objekt zurückgegeben wird. Dies hängt von Ihren Anforderungen ab.

Nutzen Sie Interceptor

Sie können die oben beschriebene Methode verwenden. Wenn Sie die Framework-Klassen jedoch nicht zu stark erweitern möchten, gibt es eine Möglichkeit, "Interceptor" zu verwenden. Das Verfahren ist wie folgt.

Erweitern Sie zunächst "TcpConnectionInterceptor" und fügen Sie beim Senden einer Nachricht einen Überprüfungsprozess ein.

TcpConnectionInterceptor.java


public class TcpConnectionInterceptor extends TcpConnectionInterceptorSupport {

  @Override
  public void send(Message<?> message) throws Exception {
    if (getStatus()) {
      super.send(message);
    }
  }
 //Abkürzung

Senden Sie eine Nachricht mit dem Wert "getStatus ()". Da TcpConnectionInterceptorSupport mehrere Methoden für die Verbindung hat, ist es möglich, die Verarbeitung zu anderen Zeiten als vor dem Senden wie folgt einzufügen: hugging :.

Erstellen Sie als Nächstes eine Klasse, die die TcpConnectionInterceptorFactory implementiert, die den gerade erstellten TcpConnectionInterceptor zurückgibt. Die Implementierung ist angemessen.

CustomizedTcpConnectionInterceptorFactory.java


public class CustomizedTcpConnectionInterceptorFactory implements TcpConnectionInterceptorFactory {

  private final TcpConnectionInterceptorSupport interceptor;

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

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

Übergeben Sie dies anschließend an "TcpConnectionInterceptorFactoryChain" und setzen Sie es auf "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" />

Die ClientConnectionFactory-Einstellungen sind angemessen. : Stirnrunzeln2:

Diese Methode ist etwas kompliziert, aber ist es ein Vorteil, dass Sie sich nicht mit dem ursprünglichen "Gateway" anlegen?

Wie bist du dazu gekommen, diesen Artikel zu posten?

Als Memo, weil diese Funktion für das Projekt benötigt wurde, an dem ich derzeit beteiligt bin.

schließlich

Selbst wenn Sie mit dem Klassennamen Spring Integration googeln, gibt es viele Fälle, in denen japanische Websites nicht betroffen sind. Versuchen Sie es daher auch mit Spring Integration. : kissing_heart:

Recommended Posts

So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
So machen Sie einen Screenshot mit dem Android Studio-Emulator
Überprüfen Sie, wie Sie das Zeitlimit festlegen, wenn Sie eine Verbindung zu Spring + HikariCP + MySQL herstellen und SQL ausführen
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
So teilen Sie eine Spring Boot-Nachrichtendatei
So wenden Sie Thymeleaf-Änderungen sofort mit #Spring Boot + maven auf den Browser an
Ich habe den Ablauf der TCP-Kommunikation mit Spring Integration (Server Edition) untersucht.
Senden Sie nach eindeutiger Authentifizierung mit Spring Cloud Gateway eine Anfrage an das Backend
So überprüfen Sie das Protokoll im Docker-Container
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Verwendung des eingebauten h2db mit Federstiefel
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
So stellen Sie ein mit Java erstelltes System (Wicket-Spring-Boot) auf dem Campus-Server bereit
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC
Erstellen Sie einen Web-API-Server mit Spring Boot
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
So überprüfen Sie Rails-Befehle im Terminal
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
So löschen Sie untergeordnete Elemente, die gleichzeitig einem übergeordneten Element zugeordnet sind
So ändern Sie die Aktion mit mehreren Senden-Schaltflächen
So führen Sie die SpringBoot-App als Dienst aus
So wenden Sie HandlerInterceptor auf das http-Inbound-Gateway von Spring Integration an
So schreiben Sie einen Komponententest für Spring Boot 2
[Java] So lassen Sie die Federkonstruktorinjektion mit Lombok weg
[Spring] Lesen Sie mit MessageSource eine Nachricht aus einer YAML-Datei
So löschen Sie ein mit Rails erstelltes new_record-Objekt
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
So generieren Sie manuell ein JWT mit Knock in Rails
Organisierte schrittweise Interaktion mit dem JDK
[So fügen Sie ein Video mit Rails in haml ein]
HTTPS-Verbindung mit Java zum selbstsignierten Zertifikatsserver
Booten nach Umgebung mit Spring Boot of Maven
Wie erstelle ich einen MOD für Slay the Spire?
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
[Schienen] Was tun, wenn die Ansicht zusammenbricht, wenn eine Nachricht mit der Fehlermethode angezeigt wird?
So fordern Sie mit jMeter eine CSV-Datei als JSON an
SDWebImage: So löschen Sie den Cache für eine bestimmte UIImageView
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
Die erste WEB-Anwendung mit Spring Boot-Making a Pomodoro Timer-
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Überprüfen Sie die Funktion von zwei Rollen mit einer Chat-Anwendung