ActiveMQ概念介绍
是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,消息中间件。
消息中间件:
A传递消息到B(功能或者系统),有比较强的耦合关系,但是耦合关系会带来一些问题,需要将AB断开
但是AB之间有依赖关系,需要找一个第三方M,进行通信。A发送消息到M,B从M获得消息,进行处理。
使用第三方进行消息传递,这种第三方叫做中间件。
作用:
最主要的功能:实现JMS Provider,实现高可用高性能,可伸缩性,易于和安全企业级面向消息服务的系统。
异步操作(调用):
A发送消息到消息中间件,不必等待B消息结果的处理.
特点:
1、 多种语言和协议编写客户端。语言: Java、C、C++、C#、Ruby、Perl、Python、PHP。应用协议:OpenWire、Stomp REST、WS Notification、XMPP、AMQP
2、完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3、对spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
4、通过了常见J2EE服务器(如 Geronimo、JBoss 4、GlassFish、WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
5、支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA
6、支持通过JDBC和journal提供高速的消息持久化
7、从设计上保证了高性能的集群,客户端-服务器,点对点
8、支持Ajax
9、支持与Axis的整合
10、可以很容易得调用内嵌JMS provider,进行测试
消息形式:
1、点对点(queue)
2、一对多(topic)
##########
MOM基本功能:将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序
MOM主要特点:
1.消息异步接受,类似手机短信行为,消息发送者不需要等待消息接受者的响应,减少软件多系统集成的耦合度
2.消息可靠接受,确保消息在中间件可靠保存,只有接受方收到消息后才删除消息,多个消息也可以组成原子事物
应用场景:
多个系统间整合和通讯时候,通常要求:
1。可靠传输,数据不能丢失,有时候也要求不能重复传输
2.异步传输,否则各个系统同步发送接收数据,互相等待,造成系统瓶颈。
简单的例子
创建两个工程A和工程B编写测试类
package activemqA; 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.ActiveMQConnectionFactory; //生产者 public class Sender { public static void main(String args[]){ Sender sender = new Sender(); sender.sendMessage("hello,activemqB"); } public void sendMessage(String msg){ ConnectionFactory connectionFactory = null; Connection connection = null; Session session = null; try { //1.创建连接工厂 connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); //2.得到一个连接 connection = connectionFactory.createConnection(); //3.创建一个Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地 Destination destination = session.createQueue("myQueue"); //5.创建发送者 MessageProducer messageProducer = session.createProducer(destination); //6.创建文本消息 TextMessage textMessage = session.createTextMessage(msg); //7.发送消息 messageProducer.send(textMessage); } catch (JMSException e) { e.printStackTrace(); }finally{ //8.关闭connection和sessiosn try { if(connection !=null){ connection.close(); } if (session !=null) { session.close(); } } catch (JMSException e) { e.printStackTrace(); } } } }
消费者
package activemqB; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; //消费者 public class Receiver { public static void main(String args[]){ Receiver receiver = new Receiver(); receiver.receiverMessage(); } public void receiverMessage(){ ConnectionFactory connectionFactory = null; Connection connection = null; Session session =null; try { //1.创建连接工厂 connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); //2.得到一个连接 connection = connectionFactory.createConnection(); //3.创建一个Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地 Destination destination = session.createQueue("myQueue"); //5.创建接受者 MessageConsumer messageConsumer = session.createConsumer(destination); //6.打开连接 connection.start(); //7.接收消息 TextMessage textMessage = (TextMessage) messageConsumer.receive(1000); //8.输出验证 System.out.println("接收到的消息为:"+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); }finally { try { if (connection !=null) { connection.close(); } if (session !=null) { session.close(); } } catch (JMSException e) { e.printStackTrace(); } } } }