`
villasy1989
  • 浏览: 75348 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

Apache ActiveMQ入门

阅读更多
   同事在项目中使用了JMS,产生了兴趣,于是便进行相关知识的学习,google下JMS,JMS全称是Java Message Service,而Apache ActiveMQ是实现JMS1.1的open source,因此主要就Apache ActiveMesageQueue进行研究。
下面通过讲解一个简单的Demo进行讲解
(1)首先从apache上下载了Apache ActiveMQ的源码包:apache-activemq-5.2.0-bin.tar.gz
(2)在ubuntu下解压缩缩:tar -xzvf apache-activemq-5.2.0-bin.tar.gz
(3)进入到解压缩的文件夹下:
$cd bin
$./activemq 启动ActiveMQ,可以在浏览器中查看:http://localhost:8161/admin通过ActiveMQ的Web Console查看,验证已启动。
(4)准备jar包:
jms-1.1.jar,activemq-core-5.4.2.jar两个核心包,其他必备的包有commons-logging等。
(5)  首先介绍一下ActiveMQ的原理:
代码的结构是HelloWorld.java中包含三个class,其中HelloWorld类声明为public,另两个:Producer和Consumer不能声明为public,使用默认类型。在主类中HelloWorld中使用thread函数跑两个线程,一个是Producer,另一个是Consumer,这个Demo主要演示消息队列Queue的原理:启动的ActiveMQ监控61616端口,Producer将消息发送到ActiveMQ在61616中监控的消息队列(指定队列,在程序中我们为其取名“villasy-queue”),Consumer则监控该端口的指定队列(“villasy-queue”),这个队列是约定好的,然后Producer向该队列发送消息,而Consumer则从该队列取消息,在Consumer中通过while(true)的死循环去监控,不断从队列中取消息,如果消息不为null,那么将消息信息打出来,而如果消息为空,说明队列中已经没有消息了,所以退出死循环。
(6)下面编写测试的代码,可以直接粘贴去跑,当然前提是必备的包都齐了:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class HelloWorld {
	public static void main(String [] args) throws InterruptedException{
		thread(new Producer(),false);
                Thread.sleep(2000);
		thread(new Consumer(),false);
	}
	public static void thread(Runnable runnable, boolean daemon) {
        Thread brokerThread = new Thread(runnable);
        brokerThread.setDaemon(daemon);
        brokerThread.start();
    }
}

class Producer implements Runnable{
	private static final int SEND_NUMBER = 5;
	@Override
	public void run() {
		ConnectionFactory connFactory;
		Connection conn = null;
		Session session;
		Destination destination;
		MessageProducer msgProducer;
		
		//构造ConnectionFactory实例对象
		connFactory = new ActiveMQConnectionFactory(
						ActiveMQConnection.DEFAULT_USER,
						ActiveMQConnection.DEFAULT_PASSWORD,
						"tcp://localhost:61616"
						);
		try{
			//从构造工厂获得连接对象
			conn = connFactory.createConnection();
			//启动连接
			conn.start();
			//获得连接session
			session = conn.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
			//获得连接目的地
			destination = session.createQueue("villasy-queue");
			//消息生产者
			msgProducer = session.createProducer(destination);
			//设置不持久化
			msgProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
			//构造并发送消息
			sendMsg(session,msgProducer);
			session.commit();
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(null != conn)
				try {
					conn.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
		}
	}
	
	public static void sendMsg(Session session,MessageProducer msgProducer) throws JMSException{
		for(int i=1;i<SEND_NUMBER;i++){
			TextMessage txtMsg = session.createTextMessage("发送消息:"+i);
			System.out.println(txtMsg.getText());
			msgProducer.send(txtMsg);
		}
	}
}

class Consumer implements Runnable,javax.jms.ExceptionListener{
	@Override
	public void run() {
		// ConnectionFactory :连接工厂,JMS 用它创建连接
		ConnectionFactory connectionFactory;
		// Connection :JMS 客户端到JMS Provider 的连接
		Connection connection = null;
		// Session: 一个发送或接收消息的线程
		Session session;
		// Destination :消息的目的地;消息发送给谁.
		Destination destination;
		// 消费者,消息接收者
		MessageConsumer consumer;

		connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnection.DEFAULT_USER,
				ActiveMQConnection.DEFAULT_PASSWORD,
				"tcp://localhost:61616");
		try {
			// 构造从工厂得到连接对象
			connection = connectionFactory.createConnection();
			// 启动
			connection.start();
			// 获取操作连接
			session = connection.createSession(Boolean.FALSE,
								Session.AUTO_ACKNOWLEDGE);
			// 获取session0的queue
			destination = session.createQueue("villasy-queue");
			consumer = session.createConsumer(destination);
			
			while (true) {
				TextMessage message = (TextMessage) consumer.receive(1000);
				if (null != message) {
					System.out.println("收到消息" + message.getText());
				} else {
				break;
				}	
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != connection)
					connection.close();
			} catch (Throwable ignore) {
		}
	  }
	}

	@Override
	public synchronized void onException(JMSException arg0) {
		System.out.println("JMS Exception occured.  Shutting down client.");
	}	
}

以上为代码,通过注释读者应该能够理解基本的流程,需要说明的是,在创建连接的时候我们是通过这句:
connFactory = new ActiveMQConnectionFactory(
						ActiveMQConnection.DEFAULT_USER,
						ActiveMQConnection.DEFAULT_PASSWORD,
						"tcp://localhost:61616"
						);

实现的,通过tcp协议和消息队列服务器进行交互,我们也可以使用一些其他的方式实现我们的消息队列:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");

    这种消息队列是通过在本地文件类型的,同样可以实现通讯。
    在项目中对该项技术的主要的使用之处在于提高处理速度和提高用户体验,我们可以通过消息队列的方式实现异步的方式,比如我们要处理10个订单的核对,我们可以将这10个订单发送到某服务器的消息队列上,而订单核对程序在从该服务器上的消息队列中取,只要取到就进行处理,处理完之后返回处理完毕消息,异步之于阻塞的优势是我们不必一个一个地去等待订单的处理完毕,而将所有的订单都一起发过去,如果处理机够多的话,只要有消息到达,处理机就可以处理,实现了并发处理,最终所有处理完毕时将结果告诉需要订单核对结果的程序,这样就减少了处理的时间提高了用户体验。
    对于ActiveMQ的学习还是比较初步,比较简单,继续深入学习。
分享到:
评论

相关推荐

    Apache ActiveMQ 入门最简单例子

    Apache ActiveMQ5.8 入门最简单例子 消息队列 Master

    activemq, Apache ActiveMQ镜像.zip

    activemq, Apache ActiveMQ镜像 欢迎来到 Apache ActiveMQis是一个高性能的Apache 2.0许可以消息代理和 JMS 1.1实现。正在启动要帮助你入门,请尝试以下链接:入门http://activemq.apache.org/version-

    apache-activemq-5.5.1-bin.zip加上入门demo

    解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。 包含了apache-activemq-5.5.1-bin.zip以及ActiveMQ一个helloworld的demo启动ActiveMQ以后,登陆:...

    jms-activemq-example:使用Apache ActiveMQ的Belajar JMS

    Apache ActiveMQ入门 如何运行应用程序: 提炼 跑步 bin/activemq start 启动 JMS术语 提供者,即面向消息的中间件或充当代理的应用程序,示例之一是Apache ActiveMQ,RabitMQ,Hive MQTT,IBM MQ,JBoss ...

    activeMQ 入门级demo

    下载最新版本4.1.0release, 解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz) 目录如下: +bin (windows下面的bat和unix/linux下面的sh) +conf (activeMQ配置目录,包含最...

    activemq:Apache ActiveMQ的镜像

    欢迎使用Apache ActiveMQ Apache ActiveMQ是高性能的Apache 2.0许可的Message Broker和JMS 1.1实现。 入门 为了帮助您入门,请尝试以下链接: 入门 建造 例子 我们欢迎您提供各种帮助,以获取有关如何帮助详细...

    activemq网站:Apache ActiveMQ网站

    Apache ActiveMQ网站 这是位于的Apache ActiveMQ网站的存储库。 这个怎么运作 存储库的此分支包含用于生成最终被推送到站点HTML的源文件。 对分支进行提交时,将自动在CI中执行Jekyll构建,并将生成的站点输出提交回...

    ActiveMQ入门

    ActiveMQ是Apache开发的开源消息中间件,相比重量级收费的IBM 的消息中间件MQ, ActiveMQ更适合于初学者!

    ActiveMQ入门教程

    摘要:本文主要讲述ActiveMQ的基本知识和使用方法,并简单结合spring使用ActiveMQ。 企业消息软件从80年代起就存在,它不只是一种应用间消息传递...Apache ActiveMQ就是其中一种。它使应用间能以异步,松耦合方式交流。

    ActiveMQ入门示例

    2.解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。 3、启动ActiveMQ以后,登陆:http://localhost:8161/admin/,创建一个Queue,命名为FirstQueue。

    ActiveMQ_in_Action.doc

    解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz)目录如下: +bin (windows下面的bat和unix/linux下面的sh) +conf (activeMQ配置目录,包含最基本的activeMQ配置文件) +data ...

    ActiveMQ详细入门使用教程_java_MQ_

    ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。?特点:?1、支持多种语言编写客户端?2、对spring的支持,很容易和spring整合?3、支持多种传输协议:TCPSSLNIOUDP等?4、支持AJAX?...

    ActiveMQ实践入门指南

    ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和 J2EE 1.4 规范的 JMS Provider 实现,尽管JMS 规范出台已经是很久的事情了,但是JMS在当今的 J2EE应用中间仍然扮演着...

    ActiveMQ入门实例

    解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。启动ActiveMQ以后,登陆:http://localhost:8161/admin/,创建一个Queue,命名为FirstQueue。创建project...

    MQ之ActiveMQ.mmap

    本次以Apache的ActiveMQ作为切入点,分为基础/实战/面试上中下三大部分,将带着同学们 从零基础入门到熟练掌握ActiveMQ,能够结合Spring/SpringBoot进行实际开发配置并能够 进行MQ多节点集群的部署,最后学习MQ的...

    ActiveMQ开发教程

    apache ActiveMQ强大的消息中间件,入门资料,高手绕行,

    消息中间件之ActiveMQ视频课程

    本套视频以Apache的ActiveMQ作为切入点,分为基础/实战/面试上中下三大部分,带你从零基础入门到熟练掌握ActiveMQ,能够结合Spring/SpringBoot进行实际开发配置并能够进行MQ多节点集群的部署,可以学习到MQ的高级...

Global site tag (gtag.js) - Google Analytics