[JAVA] Mémorandum de l'étude sur l'intégration de Spring ~ Comprendre l'exemple d'intégration de Spring 2. Passerelle JMS ~

Objectif

Afin d'apprendre Spring Integration, j'ai compris l'exemple fourni par Spring Project et je l'ai réimplémenté + arrangé. Cet article est un mémorandum. Je pense donc qu'il y a plusieurs erreurs, mais je vous serais reconnaissant de bien vouloir souligner ce point. L'exemple est enregistré dans le Git suivant. spring-integration-sample

Cette fois à propos de _ ** Gateway ** _ qui est l'un des jms de base. À propos, la version de Spring Integration est `` 4.3.10.RELEASE ''.

Aperçu

Trois fonctions sont implémentées dans JMS, et lorsque la classe Main est exécutée, elle décide de manière interactive quel mode de 1 à 3 essayer. Cette fois, nous n'avons implémenté que la passerelle 1.

  1. Gateway
  2. Channel Adapter
  3. Aggrigation

Il y a tellement de choses que je ne comprends pas encore, et c'est difficile à comprendre même si je l'implémente d'un côté, donc au lieu de l'implémenter dans le même format, je vais l'implémenter individuellement et le comprendre.

la mise en oeuvre

Gateway

Vue d'ensemble

Le flux global est probablement le suivant. (Veuillez préciser si vous faites une erreur) Entrée standard(stdin) -> stdintojmsoutchannel -> requestqueue -> serviceactivator -> requestchannel -> replyqueue -> replychannel ->Sortie standard(stdout)

Outbound-gateway emballe la valeur entrée depuis la console dans la file d'attente (RequestQueue```) via stdin-channel-adapter```. Ensuite, ```inbound-gateway``` obtient la valeur de RequestQueue``` et la traite avec `ServiceActivator``` et l'envoie à` RequestChannel```. De plus, ```outbound-gateway``` l'obtient de `` ReplyQueue cette fois, le relaie vers` `` `ReplyChannel, et fait enfin la sortie standard.

Outbound-gateway dans Reference Manual Dans l'explication, ReplyQueue '' (attribut reply-destination '') ne peut pas être spécifié, sinon TemporaryQueue '' sera utilisé. Comme il n'est pas spécifié dans cet exemple, il semble que la valeur soit envoyée de TemporaryQueue '' à `` ReplyChannel ''.

fichier de définition de bean

Cet exemple se compose de 3 configurations: common.xml, outboundGateway.xml et inboundGateway.xml. Celui que j'ai implémenté est une réutilisation de l'exemple de projet de base, mais j'ai omis toutes les descriptions qui semblent inutiles pour la compréhension.

Ici, les paramètres requis pour l'agrégation, channelAdapter et d'autres fonctions sont définis comme des paramètres communs, mais cette fois, seuls les paramètres requis pour la passerelle sont conservés.

Les paramètres suivants sont requis pour l'application Gateway. La `connectionFactory` '' de 1 est requise en interne par la classe` `JmsOutboundGateway '' pour créer une connexion. 2 semble être nécessaire pour stdin-channel-adapter '' pour interroger l'entrée standard. Et puisque `` requestQueue '' est utilisé à la fois par outboundGateway et inboundGateway, il doit être défini. Ici, la file d'attente OSS ActiveMQ est spécifiée comme classe d'implémentation.

D'autres paramètres semblaient inutiles cette fois, je les ai donc supprimés.

    <!-- 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"/>

Seuls les paramètres minimaux nécessaires sont également conservés ici. Il y avait aussi un paramètre d'informations de profil pour le test, mais je l'ai supprimé car il est d'abord inutile. Ici, la classe JmsOutboundGateway '' joue un rôle de relais de divers flux de traitement comme son nom l'indique, donc les paramètres requis pour le relais sont décrits. Où 1 et 3 définissent les entrées et les sorties vers la console. 2 transmet les informations d'entrée obtenues à partir de l'attribut request-channel '' à la méthode send``` de la` `requestQueue (MessageChannel)` `. La valeur de retour va dans le TemporaryQueue '' qui est omis cette fois, il semble donc qu'il est configuré pour le transmettre en interne à l'objet avec l'attribut `` reply-channel ''

     <!-- 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"/>

À la fin, il s'agira d'un paramètre entrant, mais à l'origine il y avait un paramètre de `` ServiceActivator```, mais il a également été implémenté dans l'article de Hello World J'ai donc décidé de l'implémenter avec des annotations. En utilisant des annotations, il est devenu plus facile de comprendre ce que vous voulez faire avec xml. (Puisque Spring Integration a tendance à être compliqué en xml, j'ai pensé un instant qu'il serait préférable de l'implémenter principalement avec JavaConfig ou des annotations, mais à mesure que l'échelle de l'application grandit, je pense que le code source devient soudainement difficile à suivre. . Il semble être plus difficile d'ajuster la cuillère que le système Web.)

Revenant au sujet principal, 1 effectue un balayage des composants. Cela élimine le besoin de définition de bean pour les classes qui implémentent ServiceActivator ''. Ensuite, 2 définit le flux de traitement interne avec la balise ```inbound-gateway```. Contrairement à outbound, la valeur est acquise à partir de l'attribut request-destination '' et propagée à l'attribut `` request-channel ''.

    <!-- 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

Comme mentionné ci-dessus, ServiceActivator '' utilisait des annotations. À cette fin, l'annotation (1) @ EnableIntegration '' et (2) l'annotation @ MessageEndpoint '' sont utilisées. Si vous utilisez @ ServiceActivator '' sans utiliser (1), vous obtiendrez une erreur comme la destination d'expédition est introuvable. Je viens de faire une simple reconnaissance qu'il est nécessaire d'ajouter des annotations ensemble pour utiliser des annotations dans des objets de type Endpoint. J'aimerais voir le contenu un peu plus tard, mais pour l'instant je vais le supporter et continuer.

(2) est une annotation destinée simplement à être une cible d'analyse de composant. C'est la même chose que @ Controller '' ou @ Service '' sur le Web.

(3) vient de remplacer la définition du bean.

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

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

Classe principale

Le code de la classe Main est le suivant. Définissez simplement xml comme un tableau et chargez-le en tant qu'instance d'ApplicationContext. Avec cela seul, l'interaction entre la console et l'application peut être réalisée.

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

finalement

Cette fois, j'ai traité de la passerelle entrante et de la passerelle sortante, mais je pensais que ce serait assez facile à utiliser car ils font de bons échanges entrants et sortants à l'arrière. Après cela, personnellement, je ne peux pas lire de manière sensuelle xml, j'ai donc eu l'impression que je l'oublierais plus tard même si je l'implémentais moi-même, à moins que je ne réfléchisse à comment améliorer la lisibilité.

Cliquez-ici pour le code. Exemple Jms modifié

Recommended Posts

Mémorandum de l'étude sur l'intégration de Spring ~ Comprendre l'exemple d'intégration de Spring 2. Passerelle JMS ~
Mémorandum d'étude sur l'intégration de Spring ~ Comprendre l'exemple d'intégration de Spring 3. Enricher ~
Mémorandum d'étude sur l'intégration de Spring ~ Comprendre l'exemple d'intégration de Spring 1. Hello World ~
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Mémorandum d'étude Java
Spring Boot Rappelez-vous
Mémorandum (Spring Web)