最近学习了一下消息中间件activeMQ,为了增加印象,特此梳理处理自己学习内容,分享出来。。。。本片内容我们主要来介绍activeMQ是什么,能干什么、特点;消息中间件的特点、功能、应用场景等。
activeMQ是什么?ActiveMQ是apache推出的一款开源的,完全支持JMS1.1,和J2EE1.4规范的JMS(即Java Message Service,Java消息服务应用程序接口, 是一个Java平台中关于面向消息中间件(MOM)的API)Provider实现的消息中间件(Message Oriented Middleware,MOM) activeMQ能干什么?最主要的功能就是:实现JMS Provider接口,用来帮助实现高可用、高性能、可伸缩性、易用和安全的企业级面向消息服务的系统。 A------》MQ-------》B,解耦作用,让a b之间的调用,实现了异步调用。a不需要等待b的响应。A和B通过中间件来进行消息传递。 activeMQ特点基于java 语言开发 完全支持JMS1.1,和J2EE1.4规范(持久化、XA消息、事务) 支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA 可插拔的体系结构,可灵活定制,如消息存储方式、安全管理等。 很容易和application server集成使用 多种语言和协议编写客户端。如java、c、c++、c#、python、ruby、perl、PHP 从设计上保证了高性能的集群、客户端-服务器、点对点 可以很容易的和spring结合使用 支持通过JDBC和journal提供高速的消息持久化 支持与Axis整合 消息中间件(Message Oriented Middleware,MOM)MOM基本功能:将信息以消息的形式,从一个应用程序传动到一个或者多个应用程序。 MOM主要特点: 消息异步接收,类似手机短息的行为,消息发送者不需要等待消息接收者的响应,减少软件多系统集成的耦合度。 消息可靠接收,确保消息在中间件可靠保存,只有接收方收到后才删除消息,多个消息也可以组成原子事务。 消息中间件的主要应用场景: 在多个系统间进行整合和通讯的时候,通常会要求: 1、 可靠传输,数据不能丢失;有的时候,也会要求不能重复传输。 2、 异步传输,否则各个系统同步发送接收数据,互相等待,造成系统瓶颈。 目前比较知名的消息中间件: IBM MQSeries BEA WebLogicJMS Server OracleAQ Tibco SwiftMQ
ActiveMQ是免费的java实现的消息中间件 activemq安装和基本使用安装下载并安装activeMQ服务器端 从官网下载activeMQ相应的版本,本次学习使用的是5.9.0 拷贝到安装的目录下,直接解压。 启动运行 普通启动: ./activemqstart 启动并指定日志文件:./activemq start > /tmp/activeMQLog 检查是否启动成功 activeMQ默认使用61616端口提供JMS服务,使用8161端口个提供管理控制台服务,执行以下命令检验是否成功启动activeMQ服务:
查看61616端口是否打开:netstat –an |grep61616 查看控制台或者日志文件是否报错。 默认的用户名密码是admin/admin 关闭
activeMQ:./activeMQstop 或者直接kill -9 pid
生产和消费代码测试(基于队列实现消息的生产和消费)
配置maven所需依赖 <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.9.0</version> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.16</version> </dependency> |
生产者代码实例 public static void main(String[] args) throws JMSException, InterruptedException { // TODO Auto-generated method stub ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://172.20.10.8:61616"); Connection conn = connectionFactory.createConnection(); conn.start(); Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("queue"); MessageProducer producer = session.createProducer(destination); for(int i=0;i<3;i++){ TextMessage textMessage = session.createTextMessage("message"+i); Thread.sleep(1000); producer.send(textMessage); } session.commit(); session.close(); conn.close(); } |
Messages Enqueued进入队列的消息 Messages Dequeued 出了队列的消息 消费者代码实例 public static void main(String[] args) throws JMSException { // TODO Auto-generated method stub ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://172.20.10.8:61616"); Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("queue"); MessageConsumer consumer = session.createConsumer(destination); for(int i=0;i<3;i++){ TextMessage textMessage = (TextMessage) consumer.receive(); System.out.println("接收到的消息:"+textMessage.getText()); } session.commit(); connection.close(); } |
|