上篇简单介绍了JMS,这篇咱们对针对一个具体的JMS提供者进行实战
ActiveMq是apache 出品,是一个完成支持JMS1.1和J2EE1.4规范的JMSProvider实现。提供客户端支持跨语言和协议。
ActiveMQ安装这里就不再演示
1、下载ActiveMQ,下载地址:http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.8.0/apache-activemq-5.8.0-bin.zip
2、 解压apache-activemq-5.8.0.zip即可完成ActiveMQ的安装
3、 解压后目录结构如下
+bin(windows下面的bat和unix/linux下面的sh) 启动ActiveMQ的启动服务就在这里
+conf(activeMQ配置目录,包含最基本的activeMQ配置文件)
+data (默认是空的)
+docs(index,replease版本里面没有文档)
+example (几个例子)
+lib(activeMQ使用到的lib)
+webapps (系统管理员控制台代码)
+webapps-demo(系统示例代码)
-activemq-all-5.8.0.jar(ActiveMQ的binary)
-user-guide.html(部署指引)
-LICENSE.txt
-NOTICE.txt
-README.txt
你可以进入bin目录,使用activemq.bat双击启动(windows用户可以选择系统位数,如果你是linux的话,就用命令行的发送去启动),如果一切顺利,你就会看见类似下面的信息:
启动成功就可以访问管理员界面:http://localhost:8161/admin,默认用户名和密码admin/admin。如果你想修改用户名和密码的话,在conf/jetty-realm.properties中修改即可。
ActiveMq消息发送流程
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender/消费者MessageReceiver
(5)、使用消息生产者MessageSender发送消息/接收者MessageReceiver接受消息
消息实例
为订阅发布模式,一个生产者,对应多个订阅者
首先创建消息生产者
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.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSProduce {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int SENDNUM = 10;// 发送数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;// 创建链接工厂
Connection connection = null; // 连接
Session session; // 连接会话 fasong 或接受消息的线程
Destination destination; // 消息目的
MessageProducer messageProducer;// 消息生产者
// 实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD,
BROKEURL);
try {
// 连接工厂获取连接;
connection = connectionFactory.createConnection();
connection.start();// 启动连接
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);// 创建session ,参数第一个为是否启动事务
destination = session.createTopic("top1");;// 创建消息主题 session创建// (目的地址)
messageProducer = session.createProducer(destination);// 消息生产者// session创建
sedMessage(session,messageProducer); //发送消息
session.commit();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(connection!=null){
connection.close();
}
}
}
/**
* 发送消息
*
* @param session
* @param messageProducer
* @throws JMSException
*/
public static void sedMessage(Session session,
MessageProducer messageProducer) throws JMSException {
for (int i = 0; i < JMSProduce.SENDNUM; i++) {
TextMessage message = session.createTextMessage("activemq 发送的消息"
+ i + "");
System.out.println("发送消息" + "activemq 发送的消息" + i);
messageProducer.send(message); // 发送消息,使用messageproduce
}
}
}
消息监听机制
消息接收者监听机制 ,消费者不用一直处于接受状态
public class ConsumerListener implements MessageListener{
public void onMessage(Message arg0) {
try {
System.out.println("订阅 者1订阅的消息"+((TextMessage)arg0).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
消息消费者
public class JMSConsummer1 {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
// private static final int SENDNUM = 10;// 发送数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory; // Lianjie
Connection connection = null; // 连接
Session session; // 连接会话 fasong 或接受消息的线程
Destination destination; // 消息目的
MessageConsumer messageConsumer;// 消息生产者
// 实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD,
BROKEURL);
try {
// 连接工厂获取连接;
connection = connectionFactory.createConnection();
connection.start();// 启动连接
// 消费者不需要添加事务
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);// 创建session
destination = session.createTopic("top1");// 发布订阅模式创建消息
// (目的地址)
messageConsumer = session.createConsumer(destination);// 消息消费者//
// session创建
messageConsumer.setMessageListener(new ConsumerListener()); //注册消息监听
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
}
}
运行时要先将消费者 进行注册,订阅主题。 当消息发布者发布消息时就会将消息推送到订阅者哪里,等待订阅者接收消息。
效果图
小结:
消息机制可以应用于 推送订阅, 邮件发送。支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。