Spring中Active MQ的基本使用

目录

1. JMS(JAVA消息服务)

2. Active MQ

3. 参考链接


1. JMS(JAVA消息服务)

1.1. JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

1.2. 消息模型点对点和发布订阅模型

1.3. 涉及到的概念 

消息队列(Queue)

发送者(Sender)

接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

1.4. JMS编程模型重点

(1) ConnectionFactory

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。

(2) Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

(3) Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。

(4) Session

Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。

(5) 消息的生产者

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

(6) 消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

(7) MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

 

2. Active MQ

2.1. ActiveMQ是一个易于使用的消息中间件。下载地址:http://activemq.apache.org/ 

2.2. ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find “61616”  监控ActiveMQ的应用网址:http://127.0.0.1:8161

2.3. Active MQ简单实例

2.3.1. 开发时候,要将apache-activemq-5.11.1-bin.zip解压缩后里面的activemq-all-5.11.1.jar包加入到classpath下面,这个包包含了所有jms接口api的实现

2.3.2. 点对点消息模型示例

建立java项目,编写生产者和消费者

生产者代码:

package com.tgb.activemq; 
import javax.jms.Connection;
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; 
/** * 消息的生产者(发送者)* */
public class JMSProducer {
//连接工厂 
ConnectionFactory connectionFactory; 
//连接 
Connection connection = null; 
//会话 接受或者发送消息的线程 
Session session; 
//消息的目的地 
Destination destination; 
//消息生产者 
MessageProducer messageProducer;
 //实例化连接工厂 
connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME,  	JMSProducer.PASSWORD, JMSProducer.BROKEURL);
try { 
//通过连接工厂获取连接 
connection = connectionFactory.createConnection(); 
//启动连接 
connection.start(); 
//创建
session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
 //创建一个名称为HelloWorld的消息队列 
destination = session.createQueue("HelloWorld"); 
//创建消息生产者 
messageProducer = session.createProducer(destination); 
//发送消息 
sendMessage(session, messageProducer); session.commit(); 
} catch (Exception e) { 
e.printStackTrace(); 
}finally{
 if(connection != null){ 
try { connection.close(); 
} catch (JMSException e) {
 e.printStackTrace(); 
}
 } 
  }
 }

/** * 发送消息 * @param session * @param messageProducer 消息生产者 * @throws Exception */
public static void sendMessage(Session session,MessageProducer messageProducer) throws Exception{ 
for (int i = 0; i < JMSProducer.SENDNUM; i++) { 
//创建一条文本消息 
TextMessage message = session.createTextMessage("ActiveMQ 发送消息" +i); 	System.out.println("发送消息:Activemq 发送消息" + i); 
//通过消息生产者发出消息 
messageProducer.send(message); 
}
  }
 }

 消费者代码:

package com.tgb.activemq; 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; 
import javax.jms.TextMessage; 
import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory;
 /** * 消息的消费者(接受者) ** */
public class JMSConsumer { 
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默认连接用户名 
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默认连接密码 
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
//默认连接地址 
public static void main(String[] args) { 
ConnectionFactory connectionFactory;//连接工厂 
Connection connection = null;//连接 
Session session;//会话 接受或者发送消息的线程 
Destination destination;//消息的目的地 
MessageConsumer messageConsumer;//消息的消费者 
//实例化连接工厂 
connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, 		JMSConsumer.PASSWORD, JMSConsumer.BROKEURL); 
try {
 //通过连接工厂获取连接 
connection = connectionFactory.createConnection(); 
//启动连接 
connection.start(); 
//创建session 
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
//创建一个连接HelloWorld的消息队列 
destination = session.createQueue("HelloWorld"); 
//创建消息消费者 
messageConsumer = session.createConsumer(destination); 
while (true) { 
TextMessage textMessage = 	(TextMessage)messageConsumer.receive(100000); 
if(textMessage != null){ 
System.out.println("收到的消息:" + textMessage.getText()); 
}else { 
break; 
} 
} 
} catch (JMSException e) { 
e.printStackTrace(); 
} } }

2.4. Active MQ和Spring整合

配置activeMQ.xml步骤:配置ConnectionFactory—>配置生产者—>配置消费者

 

配置ConnectionFactory:

<!-- ActiveMQ 连接工厂 -->

 <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->

<!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码--> <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://192.168.3.3:61616" userName="admin" password="admin" />

<!-- Spring Caching连接工厂 -->

<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->

<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">

<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory --> <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>

<!-- 同上,同理 -->

<!-- <constructor-arg ref="amqConnectionFactory" /> -->

<!-- Session缓存数量 -->

<property name="sessionCacheSize" value="100" />

</bean>

 

配置生产者(用Spring为我们提供的JmsTemplate类来实现的,所以配置生产者其实最核心的就是配置消息发送的JmsTemplate):

<!-- Spring JmsTemplate 的消息生产者 start-->

<!-- 定义JmsTemplate的Queue类型 -->

<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">

<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->

<constructor-arg ref="connectionFactory" />

<!-- 非pub/sub模型(发布/订阅),即队列模式 -->

<property name="pubSubDomain" value="false" />

</bean>

 

<!-- 定义JmsTemplate的Topic类型 -->0

<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">

<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->

<constructor-arg ref="connectionFactory" />

<!-- pub/sub模型(发布/订阅) -->

<property name="pubSubDomain" value="true" />

</bean>

<!--Spring JmsTemplate 的消息生产者 end-->

 

 

配置消费者(每个消费者对应每个目的地都需要有对应的MessageListenerContainer):

<!-- 定义Queue监听器 -->

<jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">

<jms:listener destination="test.queue" ref="queueReceiver1"/>

<jms:listener destination="test.queue" ref="queueReceiver2"/>

</jms:listener-container>

<!-- 定义Topic监听器 -->

<jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory" acknowledge="auto">

<jms:listener destination="test.topic" ref="topicReceiver1"/>

<jms:listener destination="test.topic" ref="topicReceiver2"/>

</jms:listener-container>

<!-- 消息消费者 end -->

 

3. 参考链接

http://blog.csdn.net/jiuqiyuliang/article/details/46701559

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章