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 :)
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);
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:
Derzeit gibt es zwei Methoden, die ich mir ausgedacht habe.
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.
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?
Als Memo, weil diese Funktion für das Projekt benötigt wurde, an dem ich derzeit beteiligt bin.
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