activemq入门基于queue和基于topic的demo

来源:互联网 发布:c stl 源码 编辑:程序博客网 时间:2024/05/17 12:03

概述:

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。(这句话引用百度的,哈哈)

背景:

  • 1、采用Maven工程
  • 2、jdk 1.8 (它要求是jdk1.7以上)

1、下载activemq

官方网址:下载activemq,      window下载 

apache-activemq-5.15.0-bin.zip


2、启动activemq 服务器

解压下载包,找到 你解压的目录\apache-activemq-5.15.0\bin 


输入cmd回车就行,进入dos窗口,输入

activemq start  (双击activemq.bat好像起不来)



3、进入后台添加消息队列(Queue)(等会消息就会发送这里)

后台地址: http://127.0.0.1:8161/admin/  

会弹出用户和密码框,两个框都输入admin就行。(初始密码)


服务器起来,开始写代码

4、首先引入jar(pom.xml)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jack</groupId><artifactId>ActiveMQ</artifactId><version>0.0.1-SNAPSHOT</version><name>ActiveMQDemo</name><description>学习activeMq</description><dependencies><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.15.0</version></dependency></dependencies></project>

总结:这里采用一个总包,其实activemq分成很多部分,入门嘛简单就好。

接收者:

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.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 接受消息 * @author Administrator * */public class Receiver {public static void main(String[] args){//connectionFactory:连接工厂,JMS用创建连接ConnectionFactory connectionFactory;//Connection:JMS客户端到JMSProvider的连接Connection connection = null;//SEssion:一个发送或接收消息的会话Session session;//Destination:消息目的地,消息发送给谁Destination destination;//消费者,消息接受者MessageConsumer consumer;connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");try {//从工厂得到连接对象connection = connectionFactory.createConnection();//启动connection.start();//获取操作连接session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);//获取session注意参数firstQueue是在console进行配置的destination = session.createQueue("firstQueue");consumer  = session.createConsumer(destination);while (true) {//设置接收者接受消息的时间,设置100sTextMessage message = (TextMessage) consumer.receive(100000);if(null != message){System.out.println("收到消息" + message.getText());}else {break;}}} catch (JMSException e) {e.printStackTrace();} finally {try{if (null != connection) {connection.close();}}catch (Throwable e){}}}}
创建Session时 有两个重要的参数,第一个boolean类型的参数用来表示是否采用事务消息。如果是消息是事务的,对应的参数设置为true,此时消息的提交自动有commit处理,消息的回滚则自动由rollback处理。如果不是事务设置为false
第二参数 :

  • Session.AUTO_ACKNOWLEGE     表示Session会自动确认所接收到的消息,
  • Session.Client_ACKNOWLEDGE     表示由客户端程序通过调用消息的确认方法来确认所接收的消息。
  • Session.DUPS_OK_ACKNOWLEDGE 延迟确认,导致消息重复投递。

消费者:

package com.jack;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 发送 * @author Administrator * */public class Sender {private static final int SEND_NUMBER = 5;public static void main(String[] args) {//ConnectionFactory:连接工厂,JMS用它创建连接ConnectionFactory connectionFactory;//Connetcion : JMS 客户端到JMS Provider 的连接Connection connection = null;//Session :一个发送或接收消息的线程Session session;//Destination:消息的目的地;消息发送给谁Destination destination;//MessageProducer : 消息发送者MessageProducer producer;//TextMessageProducer producer;//构造ConnectionFactory实例对象,此处采用ActiveMq的实现jarconnectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");try {//构造从工厂得到连接对象connection = connectionFactory.createConnection();//启动connection.start();//获取操作连接session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);//获取session注意参数值firstQueue在console配置destination = session.createQueue("firstQueue");//消息生成者(发送者)producer = session.createProducer(destination);//不持久化producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//构造消息sendMessage(session, producer);session.commit();} catch (JMSException e) {e.printStackTrace();}finally{try {if(null != connection){connection.close();}}catch(Throwable e) {}}}private static void sendMessage(Session session, MessageProducer producer) throws JMSException {for (int i=1; i<=SEND_NUMBER; i++) {TextMessage message = session.createTextMessage("ActiveMq发送消息:" + i);//发送消息到目的地方System.out.println("发送消息:" + "ActiveMq发送的消息" + i);producer.send(message);}}}

5、启动测试

先启动接收者,后启动发送者(是不是类似socket通讯)

日志如下:


6、大致流程图


7、基于topic (多用于广播)

首先创建topic


修改代码:try{} 中的代码

注意:修改topic变量为 Topic topic

发送者 :注意创建session 第一个参数为false,那么session.commit()去掉。因为不是事务提交

//构造从工厂得到连接对象connection = connectionFactory.createConnection();//启动connection.start();//获取操作连接session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);//获取session注意参数值firstTopic在console配置topic = session.createTopic("firstTopic");//消息生成者(发送者)producer = session.createProducer(topic);//不持久化producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//构造消息sendMessage(session, producer);


接收者

//从工厂得到连接对象connection = connectionFactory.createConnection();//启动connection.start();//获取操作连接session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);//获取session注意参数firstTopic是在console进行配置的topic = session.createTopic("firstTopic");consumer  = session.createConsumer(topic);while (true) {//设置接收者接受消息的时间,设置100sTextMessage message = (TextMessage) consumer.receive(100000);if(null != message){System.out.println("收到消息" + message.getText());}else {break;}}

结果和queue是一样的。

参考引用:

http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html