ActiveMQ消息队列

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lcx216/article/details/53115899

ActiveMQ介绍

ActiveMQ Apache出品,最流行的,能力强劲的开源消息总线。

ActiveMQ安装

ActiveMQ要求JDK1.5以上,推荐1.6以上版本。

安装完JDK后,从 http://activemq.apache.org/download.html下载MQ的最新版本。解压后,可以看到MQ目录下有以下文件和目录。

ActiveMQ目录结构

目录结构介绍如下:

bin,放置启动、停止、注册服务等命令文件。

conf,配置文件,包括brokerjettylog等配置文件。

data,放置消息缓存(kahadb)jettyjsp编译后的classAMQ日志等文件。

docs,帮助文档

examples,应用示例

lib,依赖的jar

webappsAMQ下的web应用,包括web console file server

webapps-demodemo应用,默认不能访问,如需访问需要在conf/jetty.xml文件中配置。

activemq-all-5.10.1.jarAMQ的开发用的jar

其它文件,包括licensenoticereadme

JMS介绍

JMS(Java Message Service) Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。

对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。

与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。

 

ActiveMQ优势

·多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

·完全支持JMS1.1J2EE 1.4规范 (持久化,XA消息,事务)

·Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

·完全支持JMS1.1J2EE 1.4规范 (持久化,XA消息,事务)

·通过了常见J2EE服务器(Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

·支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

·从设计上保证了高性能的集群,客户端-服务器,点对点

·支持Ajax

·支持与Axis的整合

·可以很容易得调用内嵌JMS provider,进行测试

场景适用

适合场景:消息中间件一般被用在异步消息通信、整合多个系统的场景。

不适合场景:如果系统生态环境很单一,无需跟其他第三方进行通信,或是虽然要简单的通信但是数据量不大,业务不太复杂,其实个人认为是无需用MQ这种重量级的解决方案的,直接暴露接口就好了。

ActiveMQ后台  

浏览器打开http://192.168.202.128:8161/admin


输入用户名、密码,登录到后台界面。

 

点对点通信模式

一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:

只有一个消费者将获得消息

生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。

每一个成功处理的消息都由接收者签收

生产者生产消息

 

消费者消费消息

 

在点对点通信模式中,消息只要没有被消费,一直是挂起的状态,直到被消费者消费。

而在发布/订阅(Pub/Sub)模型中,如果消费者没有订阅主题或没有启动服务,则获得不到消息。

发布/订阅模型

支持向一个特定的消息主题发布消息。多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:

多个消费者可以获得消息

在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

 

Java代码实现

编程的结构

 消息产生者向JMS发送消息的步骤

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

(2)使用管理对象JMS ConnectionFactory建立连接Connection

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

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

(5)使用消息生产者MessageSender发送消息

 消息消费者从JMS接受消息的步骤

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

(2)使用管理对象JMS ConnectionFactory建立连接Connection

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

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

(5)使用消息消费者MessageReceiver接受消息,需要用setMessageListenerMessageListener接口绑定到MessageReceiver

消息消费者必须实现了MessageListener接口,需要定义onMessage事件方法。


展开阅读全文

activeMQ 消息队列的控制

09-03

利用java visualVm检测的结果:rnrn[img=https://img-bbs.csdn.net/upload/201409/03/1409716514_473921.jpg][/img]rnrn"ActiveMQ Data File Writer" - Thread t@7134rn java.lang.Thread.State: WAITINGrn at java.lang.Object.wait(Native Method)rn - waiting on <24d32e7b> (a org.apache.activemq.kaha.impl.async.DataFileAppender$1)rn at java.lang.Object.wait(Object.java:485)rn at org.apache.activemq.kaha.impl.async.NIODataFileAppender.processQueue(NIODataFileAppender.java:79)rn at org.apache.activemq.kaha.impl.async.DataFileAppender$2.run(DataFileAppender.java:227)rnrn Locked ownable synchronizers:rn - Nonernrn"ActiveMQ Scheduler" - Thread t@7135rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Object.wait(Native Method)rn - waiting on <50385eba> (a java.util.TaskQueue)rn at java.util.TimerThread.mainLoop(Timer.java:509)rn at java.util.TimerThread.run(Timer.java:462)rnrn Locked ownable synchronizers:rn - Nonernrn"ActiveMQ Transport Server Thread Handler: tcp://127.0.0.1:61618" - Thread t@7155rn java.lang.Thread.State: TIMED_WAITINGrn at sun.misc.Unsafe.park(Native Method)rn - parking to wait for <26751317> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)rn at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)rn at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)rn at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424)rn at org.apache.activemq.transport.tcp.TcpTransportServer$1.run(TcpTransportServer.java:339)rn at java.lang.Thread.run(Thread.java:662)rnrn Locked ownable synchronizers:rn - Nonernrn"DefaultQuartzScheduler_Worker-5" - Thread t@1531rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Object.wait(Native Method)rn - waiting on <7ffacd00> (a org.quartz.simpl.SimpleThreadPool$WorkerThread)rn at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:528)rnrn Locked ownable synchronizers:rn - Nonernrn"ExpiringMapExpirer-1" - Thread t@2751rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Thread.sleep(Native Method)rn at org.apache.mina.util.ExpiringMap$Expirer.run(ExpiringMap.java:302)rn at java.lang.Thread.run(Thread.java:662)rnrn Locked ownable synchronizers:rn - Nonernrn"HouseKeeper" - Thread t@9210rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Thread.sleep(Native Method)rn at org.logicalcobwebs.proxool.HouseKeeperThread.run(HouseKeeperThread.java:46)rnrn Locked ownable synchronizers:rn - Nonernrn"QuartzScheduler_QuartzScheduler-NON_CLUSTERED_MisfireHandler" - Thread t@8712rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Thread.sleep(Native Method)rn at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:3914)rnrn Locked ownable synchronizers:rn - Nonernrn"QuartzScheduler_Worker-1" - Thread t@6735rn java.lang.Thread.State: TIMED_WAITINGrn at java.lang.Object.wait(Native Method)rn - waiting on <33997429> (a org.quartz.simpl.SimpleThreadPool$WorkerThread)rn at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:528)rnrn Locked ownable synchronizers:rn - Nonernrnrn请问如何解决?rn猜测:"ActiveMQ Data File Writer" 是在往队列里面写的时候多个线程强资源导致的!rn请问,rn1.如果我在往消息队列文件里面写消息的时候加上同步(synchronized)会对效率造成很大影响么?rn2.想在消费消息的时候也加上同步,,是否效率就更糟糕了?rnrn消息队里高峰期并发数大约 5000!rn跪求大侠们的帮助!!!!!!!!!!!!!!!!!!!!!!rn 论坛

没有更多推荐了,返回首页