[JAVA] Es wurde das Problem behoben, dass der Name der Verbindungsfactory von TcpConnectionOpenEvent, der von TcpConnection ausgegeben wurde und den Interceptor festlegte, unbekannt wurde.

Bestätigungsumgebung

Was ist das Problem?

Grober TCP / IP-Kommunikationsmechanismus

"Spring Integration" unterstützt die TCP / IP-Kommunikation, und "TcpIn / OutboundGateway" und "In / OutboundChannelAdapter" werden als Kommunikationsfenster vorbereitet und jeweils mit "ConnectionFactory" verknüpft. Wenn eine Kommunikation erforderlich ist, erstellt der Kontakt "Gateway" oder "Adapter" eine "TcpConnection" -Instanz aus der "ConnectionFactory" und kommuniziert.

Was ist ein Abfangjäger?

Wenn Sie bei der Kommunikation eine Verarbeitung wie die Protokollausgabe einfügen möchten, geben Sie die Klasse "TcpConnectionInterceptorFactory" an, die eine Instanz der Klasse zurückgibt, die "TcpConnectionInterceptorSupport" in der Eigenschaft "InterceptorFactoryChain" von "ConnectionFactory" erbt. Das Folgende ist ein Implementierungsbeispiel.

Klasse, die TcpConnectionInterceptorSupport erbt


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorSupport;
import org.springframework.messaging.Message;

public class SimpleInterceptor extends TcpConnectionInterceptorSupport {

	private static final Logger logger = LoggerFactory.getLogger(SimpleInterceptor.class);
	
	public SimpleInterceptor(ApplicationEventPublisher publisher) {
		super(publisher);
	}

	@Override
	public void send(Message<?> message) throws Exception {
		//Fügen Sie die Protokollausgabeverarbeitung ein, bevor Sie eine Nachricht senden
		logger.debug("send message via interceptor");
		super.send(message);
	}
}

Gibt eine Instanz einer Klasse zurück, die TcpConnectionInterceptorSupport TcpConnectionInterceptorFactory erbt


import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactory;
import org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorSupport;

public class SimpleInterceptorFactory extends ApplicationObjectSupport implements TcpConnectionInterceptorFactory {

	public SimpleInterceptorFactory() {
	}

	@Override
	public TcpConnectionInterceptorSupport getInterceptor() {
		return new SimpleInterceptor(getApplicationContext());
	}
}

Bean-Definitionsdatei


<int-ip:tcp-connection-factory id="client1"
	type="client" host="localhost" port="${availableServerSocket1}"
	single-use="true" interceptor-factory-chain="interceptorFactoryChain" />
<bean id="interceptorFactoryChain"
	class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
	<property name="interceptors">
		<array>
			<bean
				class="com.neriudon.example.tcp.interceptor.SimpleInterceptorFactory" />
		</array>
	</property>
</bean>

Was ist das Problem?

"TcpConnectionOpenEvent" wird ausgegeben, wenn "ConnectionFactory" "TcpConnection" generiert und die Verbindung auf der Ebene "Socket" hergestellt wird. Wenn der Interceptor jedoch in "ConnectionFactory" festgelegt ist, wird die Eigenschaft "connectionfactoryname" zunächst festgelegt. Es bleibt der Wert "unbekannt". Das Folgende ist ein Vergleich der Ergebnisse der Protokollausgabe, wenn der Interceptor gesetzt ist und wenn er nicht gesetzt ist.

Wenn ein Abfangjäger eingestellt ist
11:58:32.397 [main] DEBUG com.neriudon.example.tcp.listener.TcpConnectionEventsListener - ★OPEN★ TcpConnectionOpenEvent [source=SimpleInterceptor:null], [factory=unknown, connectionId=localhost:50001:58459:aa1f25b0-570e-4631-8477-33a19f1bb6ba] **OPENED**
Wenn kein Abfangjäger eingestellt ist
11:58:32.434 [main] DEBUG com.neriudon.example.tcp.listener.TcpConnectionEventsListener - ★OPEN★ TcpConnectionOpenEvent [source=TcpNetConnection:localhost:50002:58460:a92051dd-9003-4563-be59-3675dee3112d], [factory=client2, connectionId=localhost:50002:58460:a92051dd-9003-4563-be59-3675dee3112d] **OPENED**

Warum dieses Problem auftritt und was dagegen zu tun ist

Dies liegt daran, dass es keinen Prozess gibt, um "ConnectionFactoryName" in der Klasse "TcpConnectionInterceptorSupport" festzulegen. Da jedoch die Informationen von "ConnectionFactory" von "TcpConnection" besessen sind, die tatsächlich kommunizieren, gibt "TcpConnectionInterceptorSupport" "ConnectionFactoryName" von "TcpConnection" zurück, wenn "ConnectionFactoryName" zurückgegeben wird: ok_hand :. Weitere Informationen finden Sie unter dem folgenden PR-Link. Übrigens sind andere "TcpConnectionEvent" kein Problem, da sie ursprünglich so konzipiert wurden, dass "TcpConnectionInterceptorSupport" die Verarbeitung von "TcpConnection" aufruft.

Welche Auswirkungen hat dieses Problem?

Fast keine: stecken_out_tongue_winking_eye :. TcpConnectionInterceptorSupport wurde im März 2016 in master integriert, und seitdem wurden keine Fehler gemeldet, und TcpConnectionOpenEvent selbst ist die [Dokumentation] von Spring Integration (https://docs.spring.io). /spring-integration/docs/4.3.13.RELEASE/reference/html/ip.html#tcp-events) ist ebenfalls flach geschrieben, sodass dieses Problem keine ernsthaften Auswirkungen auf das Projekt haben sollte.

Wann wird es behoben?

Ich weiß nicht, wann es veröffentlicht wird, aber soweit ich in JIRA sehen kann, wird es in den folgenden Abschnitten 5.0.1, 4.3.14 behoben. Ab dem 15. Januar 2018 wurde PR veröffentlicht und wird in Kürze zusammengeführt.

Wie bist du dazu gekommen, diesen Artikel zu posten?

Das liegt daran, dass ich in stackoverflow danach gefragt habe: stecken_out_tongue_closed_eyes :. Im "Spring Integration" -Projekt ist es eine Regel, Fragen zur Verwendung und zu den Spezifikationen durch Stapelüberlauf mit dem "Spring-Integration" -Tag zu stellen. Ich konnte nicht sagen, ob es sich um einen Fehler oder eine Spezifikation handelte, also habe ich eine Beispiel-App erstellt und die Bedingungen und Protokolle dargestellt, die auftreten würden. Antwortete, dass es ein Fehler war. Es tut mir jedoch leid, dass ich den Fehler nicht zum ersten Mal bei OSS melden konnte, da die Person im Inneren während des Wartens eine Abstimmung bei JIRA eingereicht hatte: verwirrt :.

1/30 Nachtrag: Einbindung dieses Fixes 4.3.14.RELEASE und 5.0.1.RELEASE : //github.com/spring-projects/spring-integration/releases/tag/v5.0.1.RELEASE) wurde veröffentlicht: v :.

Recommended Posts

Es wurde das Problem behoben, dass der Name der Verbindungsfactory von TcpConnectionOpenEvent, der von TcpConnection ausgegeben wurde und den Interceptor festlegte, unbekannt wurde.
Das Problem, dass das Attribut des Benutzermodells in ActionMailer gleich Null wird