文章目錄
Spring 集成 JMS 連接 ActiveMQ
-
ConnectionFactory:用於管理連接的連接工廠
由於 JmsTemplate 每次發送消息都會重新創建連接、會話和 productor,比較消耗性能,因此,Spring 提供了 SingleConnectionFactory 和 CachingConnectionFactory 兩種連接池。 -
JmsTemplate:用於發送和接收消息的模板類
JmsTemplate 由 Spring 提供,只需向 Spring 容器註冊便可使用,線程安全。 -
MessageListener:消息監聽器
只要實現 onMessage 方法,便可處理消息。
1. 隊列模式
1.1 spring 配置文件
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<!-- ActiveMQ 提供的 ConnectionFactory -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616"/>
</bean>
<!-- Spring JMS 提供的連接池 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!-- 一個隊列目的地,點對點 -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue"/>
</bean>
<!-- 配置 JmsTemplate,用於發送消息 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<bean class="com.chen.jms.spring.queue.producer.QueueProducerServiceImpl"></bean>
<!-- 配置消息監聽器 -->
<bean id="queueConsumerMessageListener" class="com.chen.jms.spring.queue.consumer.QueueConsumerMessageListener"></bean>
<!-- 配置消息容器 -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="queueDestination"/>
<property name="messageListener" ref="queueConsumerMessageListener"/>
</bean>
</beans>
1.2 生產者接口
package com.chen.jms.spring.queue.producer;
/**
* 隊列模式:生產者接口
*
* @Author LeifChen
* @Date 2018-11-16
*/
public interface QueueProducerService {
/**
* 發送消息
*
* @param message
*/
void sendMessage(String message);
}
1.3 生產者實現類
package com.chen.jms.spring.queue.producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import javax.annotation.Resource;
import javax.jms.Destination;
/**
* 隊列模式:生產者實現
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class QueueProducerServiceImpl implements QueueProducerService {
@Autowired
JmsTemplate jmsTemplate;
@Resource(name = "queueDestination")
Destination destination;
@Override
public void sendMessage(String message) {
jmsTemplate.send(destination, session -> session.createTextMessage(message));
System.out.println("發送消息:" + message);
}
}
1.4 生產者
package com.chen.jms.spring.queue.producer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 隊列模式:生產者
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class QueueProducer {
private static final int COUNT = 100;
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("producer-queue.xml");
QueueProducerService service = context.getBean(QueueProducerService.class);
for (int i = 0; i < COUNT; i++) {
service.sendMessage("test" + i);
}
context.close();
}
}
1.5 消費者消息監聽器
package com.chen.jms.spring.queue.consumer;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 隊列模式:消費者消息監聽器
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class QueueConsumerMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("接收消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
1.6 消費者
package com.chen.jms.spring.queue.consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 隊列模式:消費者
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class QueueConsumer {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("consumer-queue.xml");
}
}
2. 主題模式
2.1 spring 配置文件
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<!-- ActiveMQ 提供的 ConnectionFactory -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616"/>
</bean>
<!-- Spring JMS 提供的連接池 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!-- 一個主題目的地,發佈訂閱模式 -->
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="topic"/>
</bean>
<!-- 配置 JmsTemplate,用於發送消息 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<bean class="com.chen.jms.spring.topic.producer.TopicProducerServiceImpl"></bean>
<!-- 配置消息監聽器 -->
<bean id="topicConsumerMessageListener" class="com.chen.jms.spring.topic.consumer.TopicConsumerMessageListener"></bean>
<!-- 配置消息容器 -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="topicDestination"/>
<property name="messageListener" ref="topicConsumerMessageListener"/>
</bean>
</beans>
2.2 發佈者接口
package com.chen.jms.spring.topic.producer;
/**
* 主題模式:發佈者接口
*
* @Author LeifChen
* @Date 2018-11-16
*/
public interface TopicProducerService {
/**
* 發送消息
*
* @param message
*/
void sendMessage(String message);
}
2.3 發佈者實現類
package com.chen.jms.spring.topic.producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import javax.annotation.Resource;
import javax.jms.Destination;
/**
* 主題模式:發佈者實現
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class TopicProducerServiceImpl implements TopicProducerService {
@Autowired
JmsTemplate jmsTemplate;
@Resource(name = "topicDestination")
Destination destination;
@Override
public void sendMessage(String message) {
jmsTemplate.send(destination, session -> session.createTextMessage(message));
System.out.println("發送消息:" + message);
}
}
2.4 發佈者
package com.chen.jms.spring.topic.producer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 主題模式:發佈者
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class TopicProducer {
private static final int COUNT = 100;
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("producer-topic.xml");
TopicProducerService service = context.getBean(TopicProducerService.class);
for (int i = 0; i < COUNT; i++) {
service.sendMessage("test" + i);
}
context.close();
}
}
2.5 訂閱者消息監聽器
package com.chen.jms.spring.topic.consumer;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 主題模式:訂閱者消息監聽器
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class TopicConsumerMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("接收消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
2.6 訂閱者
package com.chen.jms.spring.topic.consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 主題模式:訂閱者
*
* @Author LeifChen
* @Date 2018-11-16
*/
public class TopicConsumer {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("consumer-topic.xml");
}
}