ActiveMQ
来源:互联网 发布:javascript .tagname 编辑:程序博客网 时间:2024/06/15 10:49
ActiveMQ消息管理、消息机制
1:MQ是什么?2:MQ和JMS是什么关系?3:MQ能做什么?4:MQ有哪些组件组成?5:MQ的应用场景6:如何使用MQ?
ActiveMQ是什么?
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现.
ActiveMQ目录说明
bin:存放的是脚本文件conf :存放的是基本配置文件 data :存放的是日志文件docs :存放的是说明文档examples :存放的是简单的实例lib :存放的是activemq所需jar包webapps :用于存放项目的目录
JMS 简介:
1:JMS(Java Message Service),即:java消息服务应用程序接口。2:是Java平台面向消息中间件(MOM)的API/技术规范。
场景:
应用与两个应用程序之间,或者分布式系统架构中分发消息,可进行异步/同步方式的通讯,和平台API无关,基本多数的MOM都提供对JMS的支持JMS 体系架构:1. JMS提供者 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。2. JMS客户 生产或消费基于消息的Java的应用程序或对象3. JMS生产者 创建并发送消息的JMS客户4. JMS消费者 接收消息的JMS客户5. JMS消息 包括可以在JMS客户之间传递的数据的对象6. JMS队列 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走7. JMS主题 一种支持发送消息给多个订阅者的机制
JMS 属性:
Destination(接口/目标)Product(生产者)Consumer(消费者)Broker(消息转发器)P2P,Pub/Sub(模型)P2P:消息队列(Queue)、发送者(Sender)、接收者(Receiver)Pub/Sub:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)
ActiveMQ和JMS的关系:
JMS是一种规范ActiveMQ是JMS规范的一种实现
ActiveMQ架构图:
ActiveMQ主要特性:
(1)JMS1.1、J2EE1.4(2)J2EE servers(Tomcat,JBoss4,GlassFish,WebLogic…)(3)多语言客户端(Java,C,C++,C#,Ruby,PhP)(4)多种协议(VM,TCP,SSL,UDP,multicast,JGroups…)(5)Spring(6)Ajax(7)CXF,Axis(WebService的两个流行的框架)(8)REST(状态传递)(9)Message Groups,Virtual Destinations,Wildcards,Composite , Destinations(10)持久化(journal,JDBC)(11)性能(client-server,cluster,peer…)
ActiveMQ功能:
多种协议持久化安全集群监控其他
AvtiveMQ多种协议:
URI: scheme:scheme-specific-part(通用)eg: VM vm://brokername TCP tcp://host:port (常用) SSL ssl://host:port (常用) HTTP http://host:port (常用) UDP udp://host:port peer peer://group/brokername multicast multicast://IPAddress static static(list uris) failover failvoer(list uris) discovery discovery://host:port
ActiveMQ持久化:
日志 <journaledJDBC journalLogFiles="5"dataDirectory="../mq-data" />数据库 包括: Derby,HSQL,MySQL,SQLServer, Sybase,DB2,Oracle… <journaledJDBC dataSource="#mysql-ds"/>
ActiveMQ安全:
认证 simpleAuthenticationPlugin jaasAuthenticationPlugin授权 authorizationPlugin
ActiveMQ集群:
Master/SlaveNetwork of Brokers
ActiveMQ监控:
JMX(Java管理扩展框架)Advisory Message(通知消息)
Queue与Topic区别
ActiveMQ作为实现JMS中间件优点
1.多种语言和协议编写客户端。语言: Java, C, C++, C#, Python, PHP。2.完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)3.对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性4.完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)5.通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上6.支持多种传送协议7.从设计上保证了高性能的集群,客户端-服务器,点对点8.支持Ajax9.支持与Axis的整合10.可以很容易得调用内嵌JMS provider,进行测试
ActiveMQ关键词
ActiveMQConnectionFactory: 实现了jms的ConnectionFactory,Connection的工厂类 Connection : JMS连接,和Java连接池的Connection差不多 Producer和Consumer用来和Broker通讯的 Session : 会话 Destination : 目的地,数据要发送到哪里或者从哪里取 MessageProducer: 生产者 MessageConsumer : 消费者 Message : 消息,add到队列的东西,也就是自己要处理的东西,Message有很多子接口,TextMessage或ByteMessage
ActiveMQ入门示例
1:导包:
activeio-core-3.1.4.jaractivemq-all-5.13.2.jaractivemq-pool-5.13.2.jarcommons-pool2-2.4.2.jar或者:activemq-all-5.3.0.jar
2:创建生产者
/** * 发送消息--生产者---消息提供者 * @author zxh * @date 2017-11-17 下午2:30:12 */public class Product { 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;//连接的URL--broker public static void main(String[] args) { ConnectionFactory connectionFactory;//连接工厂 Connection connection;//连接 Session session;//会话 Destination destination;//消息的接口(目的地) MessageProducer messageProducer;//消息生产者 connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);//初始化工厂信息 try { connection = connectionFactory.createConnection();//建立连接 connection.start();//开启连接 /** * 参数1:true和false---是否开启事务 * 参数2: * AUTO_ACKNOWLEDGE:消息的生产者和消费者无需做任何副本操作,即可获取消息内容或发送消息(自动装配模式) * CLIENT_ACKNOWLEDGE:发送消息后,需要消息的接受者客户端发送确认操作,才可以获取消息 * DUPS_OK_ACKNOWLEDGE:是需要副本操作的 * SESSION_TRANSACTED:只需要参数1为false的时候,才可以使用 * * 如果参数1为true,则代表连接需要开启事务,false不需要开启事务 * 如果参数1位true、则参数2可以为AUTO_ACKNOWLEDGE、CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE * 如果参数1位false,则参数2可以为四种 */ session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); destination = session.createQueue("java11");//采用queue主题协议,进行消息发送,参数代表消息名称(主题) messageProducer = session.createProducer(destination);//创建生产者 sendMessage(session,messageProducer); //如果不写commit,消息也可以发送成功,但是是没有安全监控的,数据不存储 session.commit();//提交消息 } catch (JMSException e) { e.printStackTrace(); } } /** * 发送消息方法 * @param session * @param messageProducer * @throws JMSException */ private static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException { for (int i = 0; i < 5; i++) { TextMessage message = session.createTextMessage("生产者发送消息内容为:第"+i+"条消息"); System.out.println("生产者发送消息内容为:第"+i+"条消息"); messageProducer.send(message);//发送消息 } }}
3:创建消费者
/** * 消息的接受者(消费者) * @author zxh * @date 2017-11-17 下午2:48:57 */public class Cousmer { 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;//连接的URL--broker public static void main(String[] args) { ConnectionFactory connectionFactory;//连接工厂 Connection connection;//连接 Session session;//会话 Destination destination;//消息的接口(目的地) MessageConsumer messageConsumer; connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);//实例化工厂 try { connection = connectionFactory.createConnection();//建立连接 connection.start();//开启连接 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建会话 destination = session.createQueue("java11"); messageConsumer = session.createConsumer(destination);//创建接受者 while(true){ TextMessage message = (TextMessage) messageConsumer.receive(100000);//接收消息,接收时间为100S if (message != null) { System.out.println("消费者收到消息为:"+message); }else{ break; } } } catch (JMSException e) { e.printStackTrace(); } }}
4:启动ActiveMQ服务
activemq.bat双击启动,不要关闭启动窗口
5:运行生产者
main方法运行,并打印到控制台
6:运行消费者
main方法运行,并打印到控制台
7:监控平台
http://localhost:8161/admin/queues.jsp
ActiveMQ应用场景
1:发消息 多个应用程序之间进行消息交互2:用于分布式业务场景3:执行任务的监控
原始的任务监控方案:
使用ActiveMQ监控执行任务:
使用ActiveMQ解决消息丢失问题:
后台监控页面:
入门示例2-集成Spring、SpringMVC
步骤:
1:配置MQ的工厂连接2:配置session信息(缓存、有效期、session最大值等等)3:配置topic和queue主题信息4:配置topic和queue主题的监听
AcitveMQ.xml配置信息:
<!-- ActiveMQ 连接工厂 --><!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供--><!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码--><amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost: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> <!-- Session缓存数量 --> <property name="sessionCacheSize" value="100" /></bean><!-- 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类型 --><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--><!-- 消息消费者 start--><!-- 定义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 -->
实现流程:
SS框架发送:/message.do-->controller-->servive(@Component)--->使用jms的基类模型JmsTemplate,并调用JmsTemplate的send方法接收:实现MessageListener接口,接收返回信息
代码:
参考工程代码
阅读全文
0 1
- ActiveMQ
- ACtiveMQ
- ACtiveMQ
- activeMQ
- ActiveMQ
- activeMQ
- activeMQ
- activemq
- ActiveMQ
- ActiveMQ
- ActiveMQ
- ActiveMQ
- activeMQ
- activemq
- ActiveMQ
- ActiveMQ
- ActiveMQ
- ActiveMQ
- Intellij idea设置背景绿色图片护眼
- 提速 Android Gradle 构建
- 无故而不怠之
- windows环境下永久修改pip镜像源的方法
- nexus6 root方法
- ActiveMQ
- REQUEST_METHOD 访问页面的请求方法
- Sticks UVA
- 堆栈被破坏 gdb 无法回溯调用栈 怎么办?
- 数据库的对比
- bzoj 4500: 矩阵 差分约束
- 1.1什么是软件性能
- 比特币价格再刷记录,场外黄牛日赚差价万元
- php结合redis实现高并发下的抢购、秒杀功能