[JAVA] Memorandum zur Spring-Integration ~ Grundlegendes zur Spring-Integration Beispiel 2. JMS-Gateway ~

Zweck

Um die Spring-Integration zu lernen, habe ich das vom Spring-Projekt bereitgestellte Beispiel verstanden und neu implementiert + arrangiert. Dieser Artikel ist ein Memorandum. Ich denke, es gibt verschiedene Fehler, aber ich würde es begrüßen, wenn Sie auf diesen Punkt hinweisen könnten. Das Beispiel ist im folgenden Git registriert. spring-integration-sample

Diesmal über _ ** Gateway ** _, das eines der grundlegenden jms ist. Die Version von Spring Integration ist übrigens "4.3.10.RELEASE".

Überblick

In JMS sind drei Funktionen implementiert, und wenn die Hauptklasse ausgeführt wird, entscheidet sie interaktiv, welcher Modus von 1 bis 3 versucht werden soll. Dieses Mal haben wir nur Gateway 1 implementiert.

  1. Gateway
  2. Channel Adapter
  3. Aggrigation

Es gibt viele Dinge, die ich überhaupt nicht verstehe, und es ist schwer zu verstehen, selbst wenn es auf einer Seite implementiert ist. Anstatt es im selben Format zu implementieren, werde ich es einzeln implementieren und verstehen.

Implementierung

Gateway

Gesamtbild

Der Gesamtfluss ist wahrscheinlich wie folgt. (Bitte weisen Sie darauf hin, wenn Sie einen Fehler machen) Standardeingabe(stdin) -> stdintojmsoutchannel -> requestqueue -> serviceactivator -> requestchannel -> replyqueue -> replychannel ->Standardausgabe(stdout)

Der von der Konsole eingegebene Wert wird über den `stdin-channel-adapter``` von outbound-gateway in die Warteschlange (`` `RequestQueue) gepackt. Als nächstes erhält das `Inbound-Gateway``` den Wert von der` `RequestQueue``` und verarbeitet ihn mit dem ServiceActivator und sendet ihn an den `` RequestChannel. Diesmal erhält es auch "Outbound-Gateway" von "ReplyQueue", leitet es an "ReplyChannel" weiter und gibt schließlich die Standardausgabe aus.

Outbound-gateway in Referenzhandbuch In der Erklärung kann `ReplyQueue``` (` reply-destination-Attribut) nicht angegeben werden, andernfalls wird `` `TemporaryQueue verwendet. Da es in diesem Beispiel nicht angegeben ist, scheint der Wert von "TemporaryQueue" an "ReplyChannel" gesendet zu werden.

Bean-Definitionsdatei

Dieses Beispiel besteht aus 3 Konfigurationen: common.xml, outboundGateway.xml und inboundGateway.xml. Die von mir implementierte ist eine Wiederverwendung des grundlegenden Beispielprojekts, aber ich habe alle Beschreibungen weggelassen, die für das Verständnis unnötig erscheinen.

Hier werden die für Aggregation, channelAdapter und andere Funktionen erforderlichen Einstellungen als allgemeine Einstellungen definiert. Diesmal bleiben jedoch nur die für das Gateway erforderlichen Einstellungen übrig.

Die folgenden Einstellungen sind für die Gateway-App erforderlich. Die `connectionFactory von 1 wird intern von der JmsOutboundGateway``` Klasse benötigt, um eine Verbindung herzustellen. 2 scheint benötigt zu werden, damit stdin-channel-adapter``` die Standardeingabe abfragt. Und da `` requestQueue sowohl von _outboundGateway_ als auch von _inboundGateway_ verwendet wird, muss es definiert werden. Hier wird die OSS `` `ActiveMQ Queue als Implementierungsklasse angegeben.

Andere Einstellungen schienen diesmal unnötig, deshalb habe ich sie gelöscht.

    <!-- 1 -->
	<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
		<property name="targetConnectionFactory">
			<bean class="org.apache.activemq.ActiveMQConnectionFactory">
				<property name="brokerURL" value="vm://localhost"/>
			</bean>
		</property>
		<property name="sessionCacheSize" value="10"/>
	</bean>

    <!-- 2 -->
	<bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg value="queue.demo"/>
	</bean>

    <!-- 3 -->
	<integration:poller id="poller" default="true" fixed-delay="1000"/>

Auch hier bleiben nur die minimal notwendigen Einstellungen übrig. Es gab auch eine Einstellung von Profilinformationen für den Test, aber ich habe sie gelöscht, da sie zuerst nicht erforderlich sind. Hier spielt die Klasse `JmsOutboundGateway``` eine Rolle beim Weiterleiten verschiedener Verarbeitungsabläufe, wie der Name schon sagt, sodass die für das Weiterleiten erforderlichen Einstellungen beschrieben werden. Dabei definieren 1 und 3 die Ein- und Ausgänge für die Konsole. 2 übergibt die vom Attribut request-channel``` erhaltenen Eingabeinformationen an die send``` -Methode der requestQueue (MessageChannel) . Der Rückgabewert geht in das `` TemporaryQueue, das diesmal weggelassen wird, so dass es so eingestellt ist, dass es intern an das Objekt mit dem Attribut` `` reply-channel übergeben wird.

     <!-- 1 -->
	<stream:stdin-channel-adapter id="stdin" channel="stdinToJmsoutChannel"/>
	<channel id="stdinToJmsoutChannel"/>

    <!-- 2 -->
	<jms:outbound-gateway request-channel="stdinToJmsoutChannel"
						  request-destination="requestQueue"
						  reply-channel="jmsReplyChannel"/>
						  
    <!-- 3 -->
	<channel id="jmsReplyChannel" />	
	<stream:stdout-channel-adapter channel="jmsReplyChannel" append-newline="true"/>

Am Ende wird es eine eingehende Einstellung sein, aber ursprünglich gab es eine Einstellung von "ServiceActivator", die jedoch auch im Artikel von Hello World implementiert wurde. Also habe ich beschlossen, es mit Anmerkungen zu implementieren. Durch die Verwendung von Anmerkungen wurde es einfacher zu verstehen, was Sie mit XML tun möchten. (Da Spring Integration in XML eher kompliziert ist, dachte ich für einen Moment, dass es besser wäre, es hauptsächlich mit JavaConfig oder Anmerkungen zu implementieren, aber mit zunehmender Größe der Anwendung denke ich, dass es plötzlich schwierig wird, dem Quellcode zu folgen. Es scheint schwieriger zu sein, den Löffel einzustellen als das Websystem.)

Zurück zum Hauptmotiv: 1 führt einen Komponentenscan durch. Dadurch entfällt die Notwendigkeit einer Bean-Definition für Klassen, die "ServiceActivator" implementieren. Als nächstes definiert 2 den internen Verarbeitungsablauf mit dem Tag "Inbound-Gateway". Im Gegensatz zu ausgehend wird der Wert vom Attribut "Anforderungsziel" erfasst und an das Attribut "Anforderungskanal" weitergegeben.

    <!-- 1 -->
	<context:component-scan base-package="org.ek.sample.jms.gateway"/>

    <!-- 2 -->
	<jms:inbound-gateway id="jmsin"
	                     request-destination="requestQueue"
	                     request-channel="requestChannel"/>

	<channel id="requestChannel"/>

ServiceActivator

Wie oben erwähnt, hat `ServiceActivator``` Anmerkungen verwendet. Zu diesem Zweck werden (1) @ EnableIntegration``` Annotation und (2) @ MessageEndpoint``` Annotation verwendet. Wenn Sie `` @ ServiceActivator``` ohne Verwendung von (1) verwenden, wird eine Fehlermeldung angezeigt, dass das Versandziel nicht gefunden werden kann. Ich habe gerade einfach erkannt, dass es notwendig ist, Anmerkungen zusammenzufügen, um Anmerkungen in Objekten vom Typ Endpoint zu verwenden. Ich würde den Inhalt gerne etwas später sehen, aber jetzt werde ich es ertragen und weitermachen.

(2) ist eine Anmerkung, die lediglich ein Komponentenscanziel sein soll. Es ist dasselbe wie "@ Controller" oder "@ Service" im Web.

(3) hat gerade die Bean-Definition ersetzt.

@EnableIntegration // (1)
@MessageEndpoint // (2)
public class GatewayEndpoint {

    // (3)
	@ServiceActivator(inputChannel="requestChannel")
	public String upperCase(String input) {
		return "JMS response: " + input.toUpperCase();
	}
}

Hauptklasse

Der Code für die Main-Klasse lautet wie folgt. Definieren Sie einfach XML als Array und laden Sie es als Instanz von ApplicationContext. Allein damit kann die Interaktion zwischen Konsole und App realisiert werden.

	private final static String[] configFilesGatewayDemo = {
			"/META-INF/spring/integration/common/common.xml",
			"/META-INF/spring/integration/gateway/inboundGateway.xml",
			"/META-INF/spring/integration/gateway/outboundGateway.xml"
		};
	
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		new ClassPathXmlApplicationContext(configFilesGatewayDemo,GatewayMain.class);
	}

Schließlich

Dieses Mal habe ich mich mit Inbound-Gateway und Outbound-Gateway befasst, aber ich dachte, es wäre ziemlich einfach zu bedienen, da sie auf der Rückseite einen guten In- und Out-Austausch ermöglichen. Danach kann ich persönlich XML nicht mehr sinnlich lesen, so dass ich den Eindruck hatte, dass ich es später vergessen würde, selbst wenn ich es selbst implementiert hätte, es sei denn, ich hätte darüber nachgedacht, wie ich die Lesbarkeit dort verbessern könnte.

Klicken Sie hier für den Code. Optimiertes Jms-Beispiel

Recommended Posts

Memorandum zur Spring-Integration ~ Grundlegendes zur Spring-Integration Beispiel 2. JMS-Gateway ~
Memorandum zur Spring-Integration ~ Grundlegendes zur Spring-Integration Beispiel 3. Enricher ~
Memorandum zur Spring-Integrationsstudie ~ Beispiel für Spring-Integration verstehen 1. Hallo Welt ~
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
WebMvcConfigurer-Memorandum von Spring Boot 2.0 (Spring 5)
Java-Studienmemorandum
Spring Boot Denken Sie daran
Memorandum (Spring Web)