ActiveMQ入门
来源:互联网 发布:mac eclipse 调试 fn 编辑:程序博客网 时间:2024/05/29 14:25
1.JMS规范概念
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
从百度中查询得知: JMS对象模型包含如下几个要素:
1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。
5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
6)JMS消息通常有两种类型:
① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。
② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。
7)JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
· StreamMessage -- Java原始值的数据流
· MapMessage--键-值对
· TextMessage--一个字符串对象
· ObjectMessage--一个序列化的 Java对象
· BytesMessage--一个未解释字节的数据流
2.ActiveMQ下载与安装
在写本篇文章的时候,ActiveMQ目前的最新版本是5.14.4版本,下面的入门案例中也是以5.14.4版本进行编写,若想要下载ActiveMQ的话,可以根据http://activemq.apache.org/download.html下载最新的版本。觉得到官网下载速度慢的话,也可以点击下activemq5.14.4载笔者上传到csdn的activemq5.14.4版本。
下载下来解压之后进入bin目录,会看到以下文件:
根据电脑的位数情况选择对应的activemq.bat批处理文件,运行之后结果如下:
能看到上面这些信息表示已经成功启动了ActiveMQ,如果在启动过程中出现闪退或者异常信息,请检查一下:
1.JDK安装与配置是否有问题
2.启动的activemq.bat批处理文件是否正确,如果是xp系统的话,直接使用bin目录下的即可。
3.自行百度异常。
关闭activemq:ctrl+shift+c 之后再提示中输入Y确认关闭;
启动成功之后打开浏览器输入:http://localhost:8161/admin进入控制台配置页面;登陆之后会要求你输入用户名和密码,默认的用户名和密码是:admin/admin。如果你想修改用户名和密码的话,在conf/jetty-realm.properties中修改即可。输入用户名密码登陆之后首页如下:
切换到Queue视图:
上图列表的意思大概如下:
可以自行新增一个队列,比如NewQueue;在session.createQueue(QueueName)中指定一个队列。
3.ActiveMQ案例
先说明几个需要注意的地方:
1.为了模拟activemq实现消息传送的过程,我们开启两个myeclipse,分别为发送端和接收端。
2.在发送端和接收端中都如要导入对activemq-all-5.14.4.jar包的引用,这个jar包在apache-activemq-5.14.4目录下。
3.发送端和接收端的jre版本需要为1.6以上,不然会报错。笔者使用的是jdk1.8
发送端:
package yzr;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;public class Sender {//发送消息数量 private static final int SEND_NUMBER = 5; public static void main(String[] args) { ConnectionFactory connectionFactory; Connection connection = null; Session session; Destination destination; MessageProducer producer; String user=ActiveMQConnection.DEFAULT_USER;//默认用户名是admin String password=ActiveMQConnection.DEFAULT_PASSWORD;//默认密码是admin String url="tcp://localhost:61616";//tcp协议连接 connectionFactory = new ActiveMQConnectionFactory(user,password,url); try { //得到连接对象 connection = connectionFactory.createConnection(); connection.start(); // 获取操作连接 session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 指定队列的消息源 destination = session.createQueue("TestQueue"); // 消息发送者对象 producer = session.createProducer(destination); // 设置传说模式为不持久化 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 发送消息 sendMessage(session, producer); session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } public static void sendMessage(Session session, MessageProducer producer) throws Exception { for (int i = 1; i <= SEND_NUMBER; i++) { // 发送文本消息 TextMessage message = session .createTextMessage("ActiveMq " + "MessageContent " + i); //控制台输出发送信息内容 System.out.println("发送消息:" + "ActiveMq " + "MessageContent " + i); producer.send(message); } }}接收端:
package yzr;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.MessageConsumer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;public class Receiver { public static void main(String[] args) { ConnectionFactory connectionFactory; Connection connection = null; Session session; 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); //队列消息源 destination = session.createQueue("TestQueue"); consumer = session.createConsumer(destination); while (true) { //设置接收者接收文本消息的时间 TextMessage message = (TextMessage) consumer.receive(100000); if (null != message) { System.out.println("收到消息:" + message.getText()); } else { break; } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } }}
启动发送端进行发送消息:
这时看到控制台的Queue视图:
如果此时activemq服务器关闭了,那么消息会清零,因为在发送端中指定了发送模式为不持久化。如果需要持久化,选择发送的模式为持久化模式即可。
启动接收端每一百秒从activemq中获取一次消息数据:
案列源代码点击下载案列代码
- ActiveMQ : ActiveMQ入门介绍
- ActiveMQ入门
- ActiveMQ入门
- activemq入门
- ActiveMQ 入门
- activeMQ 入门
- ActiveMQ入门
- activeMQ入门
- activemq 入门
- ActiveMQ 入门
- ActiveMq入门
- ActiveMQ入门
- activemq 入门
- ActiveMQ入门
- ActiveMQ入门
- activemq入门
- ActiveMQ入门
- activeMQ入门
- Java高级篇(1)与Console交互之InputStreamReader 、字符串转Float
- 【数据结构与算法】排序算法——快速排序
- mysql 提示表不存在的解决方法error: 1146: Table doesn't exist
- 查找数组中3个相加和为零的元素
- HBase - 建表语句解析
- ActiveMQ入门
- 简单工厂模式&&单例模式
- Web网络聊天室
- PAT L1-011. A-B
- Qt5 5种connect
- UDP分包组包的类
- 6影像合成之边缘效果
- 简单的sql注入之2WP
- C++带默认形参值的函数