ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.和J2EE1.4规范的JMS Provider实现尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍扮演着特殊的地位。
主要特点:
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,进行测试
ActiveMQ的消息形式:
一种是点对点的,即一个生产者和一个消费者一一对应;
另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
安装步骤
第一步: 把ActiveMQ 的压缩包上传到Linux系统。
第二步:解压缩。
第三步:启动。
使用bin目录下的activemq命令启动:
[root@localhost bin]# ./activemq start
关闭:
[root@localhost bin]# ./activemq stop
查看状态:
[root@localhost bin]# ./activemq status
进入管理后台:用户名:admin,密码:admin
Queue的Producer测试
第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
第二步:使用ConnectionFactory对象创建一个Connection对象。
第三步:开启连接,调用Connection对象的start方法。
第四步:使用Connection对象创建一个Session对象。
第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。
第六步:使用Session对象创建一个Producer对象。
第七步:创建一个Message对象,创建一个TextMessage对象。
第八步:使用Producer对象发送消息。
第九步:关闭资源。
@Test
public void testQueueProducer() throws Exception {
//1、创建一个连接工厂对象,需要指定服务的ip及端口。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.137.2:61616");
//2、使用工厂对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
//3、开启连接,调用Connection对象的start方法。
connection.start();
//4、创建一个Session对象。
//第一个参数:是否开启事务。如果true开启事务,第二个参数无意义。一般不开启事务false。
//第二个参数:应答模式。自动应答或者手动应答。一般自动应答。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用Session对象创建一个Destination对象。两种形式queue、topic,现在应该使用queue
Queue queue = session.createQueue("test-queue");
//6、使用Session对象创建一个Producer对象。
MessageProducer producer = session.createProducer(queue);
//7、创建一个Message对象,可以使用TextMessage。
/*TextMessage textMessage = new ActiveMQTextMessage();
textMessage.setText("hello Activemq");*/
TextMessage textMessage = session.createTextMessage("hello activemq");
//8、发送消息
producer.send(textMessage);
//9、关闭资源
producer.close();
session.close();
connection.close();
}
Queue的Consumer
消费者:接收消息。
第一步:创建一个ConnectionFactory对象。
第二步:从ConnectionFactory对象中获得一个Connection对象。
第三步:开启连接。调用Connection对象的start方法。
第四步:使用Connection对象创建一个Session对象。
第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。
第六步:使用Session对象创建一个Consumer对象。
第七步:接收消息。
第八步:打印消息。
第九步:关闭资源
@Test
public void testQueueConsumer() throws JMSException, IOException{
//创建一个connectionfactory对象连接MQ服务器
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.137.2:61616");
//创建一个链接对象
Connection connection=connectionFactory.createConnection();
//开启连接
connection.start();
//使用连接对象connection创建一个session对象
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个destination对象,queue对象
Queue queue=session.createQueue("test-queue");
//使用session对象创建一个消费者对象
MessageConsumer consumer=session.createConsumer(queue);
//接受消息
consumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message) {
// 打印结果
TextMessage textMessage=(TextMessage) message;
String text;
try{
text=textMessage.getText();
System.out.println(text);
}catch(JMSException e){
e.printStackTrace();
}
}
});
//等待接受消息
System.in.read();
//打印结果
//关闭资源
consumer.close();
session.close();
connection.close();
}
Topic的producer:
@Test
public void testTopicProducer() throws JMSException{
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.137.2:61616");
Connection connection=connectionFactory.createConnection();
connection.start();
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic=session.createTopic("test-topic");
MessageProducer producer=session.createProducer(topic);
TextMessage textMessage=session.createTextMessage("topic message");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
Consumer:
@Test
public void testTopicCunsumer() throws JMSException, IOException{
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.137.2:61616");
Connection connection=connectionFactory.createConnection();
connection.start();
Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic=session.createTopic("test-topic");
MessageConsumer consumer=session.createConsumer(topic);
consumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message) {
//打印结果
TextMessage textMessage=(TextMessage) message;
String text;
try{
text=textMessage.getText();
System.out.println(text);
}catch(JMSException e){
e.printStackTrace();
}
}
});
System.out.println("topic的消费者");
System.in.read();
consumer.close();
session.close();
connection.close();
}