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中获取一次消息数据:
案列源代码点击下载案列代码