JMS探讨二 ActiveMq

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/han_yankun2009/article/details/50879673

上篇简单介绍了JMS,这篇咱们对针对一个具体的JMS提供者进行实战

ActiveMq是apache 出品,是一个完成支持JMS1.1和J2EE1.4规范的JMSProvider实现。提供客户端支持跨语言和协议。

ActiveMQ安装这里就不再演示

1、下载ActiveMQ,下载地址:http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.8.0/apache-activemq-5.8.0-bin.zip

2、 解压apache-activemq-5.8.0.zip即可完成ActiveMQ的安装

3、 解压后目录结构如下

+bin(windows下面的bat和unix/linux下面的sh) 启动ActiveMQ的启动服务就在这里

+conf(activeMQ配置目录,包含最基本的activeMQ配置文件)

+data (默认是空的)

+docs(index,replease版本里面没有文档)

+example (几个例子)

+lib(activeMQ使用到的lib)

+webapps (系统管理员控制台代码)

+webapps-demo(系统示例代码)

-activemq-all-5.8.0.jar(ActiveMQ的binary)

-user-guide.html(部署指引)

-LICENSE.txt

-NOTICE.txt

-README.txt

你可以进入bin目录,使用activemq.bat双击启动(windows用户可以选择系统位数,如果你是linux的话,就用命令行的发送去启动),如果一切顺利,你就会看见类似下面的信息:

 

启动成功就可以访问管理员界面:http://localhost:8161/admin,默认用户名和密码admin/admin。如果你想修改用户名和密码的话,在conf/jetty-realm.properties中修改即可。

 

ActiveMq消息发送流程

(1)、创建连接使用的工厂类JMS ConnectionFactory

(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动

(3)、使用连接Connection 建立会话Session

(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender/消费者MessageReceiver

(5)、使用消息生产者MessageSender发送消息/接收者MessageReceiver接受消息

消息实例

  为订阅发布模式,一个生产者,对应多个订阅者

首先创建消息生产者

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 JMSProduce {
	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;

	private static final int SENDNUM = 10;// 发送数量

	public static void main(String[] args) throws JMSException {

		ConnectionFactory connectionFactory;// 创建链接工厂

		Connection connection = null; // 连接

		Session session; // 连接会话 fasong 或接受消息的线程

		Destination destination; // 消息目的

		MessageProducer messageProducer;// 消息生产者

		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD,
				BROKEURL);

		try {
			// 连接工厂获取连接;
			connection = connectionFactory.createConnection();

			connection.start();// 启动连接
			
			session = connection.createSession(Boolean.TRUE,
					Session.AUTO_ACKNOWLEDGE);// 创建session ,参数第一个为是否启动事务

			destination = session.createTopic("top1");;// 创建消息主题 session创建// (目的地址)
															

			messageProducer = session.createProducer(destination);// 消息生产者// session创建
			
			sedMessage(session,messageProducer); //发送消息
			session.commit();

		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally
		{
			
			if(connection!=null){
				connection.close();
			}
		}
	}

	/**
	 * 发送消息
	 * 
	 * @param session
	 * @param messageProducer
	 * @throws JMSException
	 */
	public static void sedMessage(Session session,
			MessageProducer messageProducer) throws JMSException {

		for (int i = 0; i < JMSProduce.SENDNUM; i++) {

			TextMessage message = session.createTextMessage("activemq 发送的消息"
					+ i + "");
			System.out.println("发送消息" + "activemq 发送的消息" + i);

			messageProducer.send(message); // 发送消息,使用messageproduce

		}
	}


}


 

消息监听机制

消息接收者监听机制 ,消费者不用一直处于接受状态

public class ConsumerListener  implements MessageListener{

	public void onMessage(Message arg0) {
		
		try {
			System.out.println("订阅 者1订阅的消息"+((TextMessage)arg0).getText());
		} catch (JMSException e) {
		
			e.printStackTrace();
		}
	}

	
}

消息消费者

public class JMSConsummer1 {

	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;

	// private static final int SENDNUM = 10;// 发送数量

	public static void main(String[] args) throws JMSException {

		ConnectionFactory connectionFactory; // Lianjie

		Connection connection = null; // 连接

		Session session; // 连接会话 fasong 或接受消息的线程

		Destination destination; // 消息目的

		MessageConsumer messageConsumer;// 消息生产者

		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD,
				BROKEURL);

		try {
			// 连接工厂获取连接;
			connection = connectionFactory.createConnection();

			connection.start();// 启动连接
			// 消费者不需要添加事务
			session = connection.createSession(Boolean.FALSE,
					Session.AUTO_ACKNOWLEDGE);// 创建session

			destination = session.createTopic("top1");//  发布订阅模式创建消息
															// (目的地址)

			messageConsumer = session.createConsumer(destination);// 消息消费者//
																	// session创建
			messageConsumer.setMessageListener(new ConsumerListener()); //注册消息监听

		} catch (JMSException e) {
			
			e.printStackTrace();
		} finally {

			if (connection != null) {
				connection.close();
			}
		}
	}

}

运行时要先将消费者 进行注册,订阅主题。 当消息发布者发布消息时就会将消息推送到订阅者哪里,等待订阅者接收消息。

效果图

 

小结:

消息机制可以应用于 推送订阅, 邮件发送。支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。

猜你喜欢

转载自blog.csdn.net/han_yankun2009/article/details/50879673