pom.xml:
<!-- --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.3.7.RELEASE</version></dependency> <!-- --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>5.9.0</version></dependency>
spring-jms. xml :
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core http://www.springframework.org/schema/jms http://www.springframework.org/schema/beans "><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/> </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory" ref="connectionFactory"/> <property name="maxConnections" value="10"/> </bean> <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="pooledConnectionFactory"/> </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <property name="connectionFactory" ref="cachingConnectionFactory"/> </bean> <!--这个是队列目的地,点对点的--> <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="spring-queue"/> </bean> </beans>
ConnectionFactory wird zum Generieren von Links zum JMS-Server verwendet. Spring stellt uns mehrere ConnectionFactory zur Verfügung, einschließlich SingleConnectionFactory und CachingConnectionFactory. SingleConnectionFactory gibt bei Anforderungen zum Herstellen einer JMS-Server-Verbindung immer denselben Link zurück und ignoriert den Aufruf der Connection-Methode zum Schließen. CachingConnectionFactory erbt SingleConnectionFactory, verfügt also über alle Funktionen von SingleConnectionFactory und fügt außerdem eine neue Caching-Funktion hinzu, mit der Session, MessageProducer und MessageConsumer zwischengespeichert werden können. Hier verwenden wir CachingConnectionFactory als Beispiel.
Nachrichtenproduzent:
= ClassPathXmlApplicationContext("spring-jms.xml"=(JmsTemplate) context.getBean("jmsTemplate"=(Destination) context.getBean("queueDestination" Message createMessage(Session session) session.createTextMessage("Hello spring JMS"
Verbraucher:
package com.jalja.org.jms.spring;import javax.jms.Destination;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.jms.core.JmsTemplate;public class SpringJmsReceive {public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml"); JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate"); Destination queueDestination=(Destination) context.getBean("queueDestination"); String msg=(String) jmsTemplate.receiveAndConvert(queueDestination); System.out.println(msg); } }
Wir konfigurieren den Listener direkt für den asynchronen Empfang von Nachrichten im Frühjahr, was der Konfiguration des Verbrauchers im Frühjahr entspricht, und es ist nicht erforderlich, den Verbraucher beim Empfang von Nachrichten zu starten.
spring-jms.xml:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core http://www.springframework.org/schema/jms http://www.springframework.org/schema/beans "><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/> </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory" ref="connectionFactory"/> <property name="maxConnections" value="10"/> </bean> <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="pooledConnectionFactory"/> </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <property name="connectionFactory" ref="cachingConnectionFactory"/> </bean> <!--这个是队列目的地,点对点的--> <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="spring-queue"/> </bean> <!-- 消息监听器 --> <bean id="myMessageListener" class="com.jalja.org.jms.spring.yb.MyMessageListener"/> <!-- 消息监听容器 --> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="cachingConnectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="myMessageListener" /> </bean> </beans>
Nachdem der Produzent eine Nachricht an das angegebene Ziel gesendet hat, besteht der nächste Schritt darin, dass der Verbraucher die Nachricht verarbeitet am angegebenen Zielort verbraucht. Woher weiß der Verbraucher, dass ein Produzent eine Nachricht an das angegebene Ziel gesendet hat? Dies wird durch den Nachrichtenüberwachungscontainer MessageListenerContainer erreicht, den Spring für uns kapselt. Er ist dafür verantwortlich, Informationen zu empfangen und die empfangenen Informationen zur Verarbeitung an den echten MessageListener zu verteilen. Jeder Verbraucher benötigt für jedes Ziel einen entsprechenden MessageListenerContainer. Für den Nachrichten-Abhörcontainer muss er nicht nur wissen, welches Ziel er abhören soll, sondern auch, wo er abhören soll. Das heißt, er muss auch wissen, auf welchen JMS-Server er abhören soll. Dies geschieht durch die Injektion einer MessageConnectionFactory es bei der Konfiguration der MessageConnectionFactory zu erreichen. Wenn wir also einen MessageListenerContainer konfigurieren, müssen wir drei Attribute angeben, die angeben, wo abgehört werden soll, und das andere ist der MessageListener, der die Nachricht nach dem Empfang verarbeitet Nachricht. Spring stellt uns zwei Arten von MessageListenerContainer zur Verfügung: SimpleMessageListenerContainer und DefaultMessageListenerContainer.
SimpleMessageListenerContainer: SimpleMessageListenerContainer erstellt zu Beginn eine Sitzung und einen Verbraucher und verwendet die standardmäßige JMS-Methode MessageConsumer.setMessageListener(), um den Listener zu registrieren und den JMS-Anbieter die Rückruffunktion des Listeners aufrufen zu lassen. Es passt sich nicht dynamisch an die Laufzeitanforderungen an und beteiligt sich nicht an der externen Transaktionsverwaltung. In Bezug auf die Kompatibilität kommt es der eigenständigen JMS-Spezifikation sehr nahe, ist jedoch im Allgemeinen nicht mit den JMS-Einschränkungen von Java EE kompatibel.
DefaultMessageListenerContainer: In den meisten Fällen verwenden wir immer noch DefaultMessageListenerContainer. Im Vergleich zu SimpleMessageListenerContainer passt sich DefaultMessageListenerContainer dynamisch an die Laufzeitanforderungen an und kann an der externen Transaktionsverwaltung teilnehmen. Es ist eine gute Balance zwischen geringen Anforderungen an JMS-Anbieter, erweiterten Funktionen wie Transaktionsbeteiligung und Kompatibilität mit Java EE-Umgebungen.
Nachrichtenproduzent:
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml"); JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate"); Destination queueDestination=(Destination) context.getBean("queueDestination"); System.out.println("异步调用执行开始"); jmsTemplate.send(queueDestination, new MessageCreator(){ @Overridepublic Message createMessage(Session session) throws JMSException {return session.createTextMessage("Hello spring JMS"); } }); System.out.println("异步调用执行结束"); }
Nachrichtenlistener: MyMessageListener
public class MyMessageListener implements MessageListener{ @Overridepublic void onMessage(Message message) { TextMessage msg= (TextMessage) message;try { System.out.println("你好:"+msg.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
Starten Sie das Abhören des Nachrichtenproduzenten. Das Ausführungsergebnis des Prozessors ist:
异步调用执行开始 异步调用执行结束 你好:Hello spring JMS
spring-jms.xml:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jms="http://www.springframework.org/schema/jms"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://activemq.apache.org/schema/core http://www.springframework.org/schema/jms http://www.springframework.org/schema/beans "><!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 --><bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" > <property name="brokerURL" value="tcp://192.168.0.224:61616"/> </bean><!-- 创建连接池 --><bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory" ref="connectionFactory"/> <property name="maxConnections" value="10"/> </bean> <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory --><bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="pooledConnectionFactory"/> </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <property name="connectionFactory" ref="cachingConnectionFactory"/> </bean> <!--这个是队列目的地,发布订阅--> <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="spring-Topic"/> </bean> </beans>
Produzent:
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml"); JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate"); Destination topicDestination=(Destination) context.getBean("topicDestination"); jmsTemplate.send(topicDestination, new MessageCreator(){ @Overridepublic Message createMessage(Session session) throws JMSException {return session.createTextMessage("Hello spring JMS topicDestination"); } }); }
Verbraucher:
public class SpringJmsSubscriber {public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml"); JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate"); Destination topicDestination=(Destination) context.getBean("topicDestination"); String msg=(String) jmsTemplate.receiveAndConvert(topicDestination); System.out.println(msg); } }
Das obige ist der detaillierte Inhalt vonEine kurze Analyse der Frühlingsintegration von JMS Active MQ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!