JMS(java message service)是java消息服务应用接口的API,用于两个应用程序之间或者分布式系统的消息发送,进行异步通信,JSM的两种典型消息模式为:1.点对点2.发布订阅
正个流程中ActiveMQ5的服务需要启动,启动ActiveMQ的服务:activemq.bat,ActiveMQ的服务启动地址:http://127.0.0.1:8161/admin
用户名和密码都是admin
1.点对点的消息模式(先启动生产者在启动消费者)
引入activemq5的jar包依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.14.5</version>
</dependency>
1.1创建消息的生产者:
/**
* 消息发布者(点对点的模式)
* @author Weiguo Liu
*
*/
public class JMSProducer {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认的连接
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认的密码
private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认的链接地址
private static final int SEDNUM = 10;//发送消息的数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;//连接工厂,可以生产连接
Connection connection;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息目的地
MessageProducer messageProducer;//消息生产者
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
//获取Connection
connection = connectionFactory.createConnection();
connection.start();
/*
* Session.AUTO_ACKNOWLEDGE表示当客户成功的从receive方法返回时
* 或者从MessageListener.onMessage方法返回的时候,会话确认客户收到的消息,Boolean.TRUE则表示启用事务,用完必须关闭
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination = session.createQueue("FirstQueue1");
//创建消息生产者
messageProducer = session.createProducer(destination);
//调用发送消息的方法
sendMessage(session, messageProducer);
//事务必须提交,否则不能发送成功
session.commit();
//关闭资源连接
if(connection != null){
connection.close();
}
}
/*
* 发送消息
*/
public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException{
for(int i=0;i<JMSProducer.SEDNUM;i++){
TextMessage message = session.createTextMessage("ActiveMQ发送的消息" + i);
System.out.println("发送消息:" + "ActiveMQ发送的消息" + i);
messageProducer.send(message);
}
}
}
1.2创建消息的消费者:
/*
* 这种方式的消费方式最常用
* 消费消息,利用监听的方式来接收消息
*/
public class JMSConsumer2 {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认的连接
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认的密码
private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认的链接地址
private static final int SEDNUM = 10;//发送消息的数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;//连接工厂,可以生产连接
Connection connection;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息目的地
MessageConsumer messageConsumer;//消息的消费者
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
//获取Connection
connection = connectionFactory.createConnection();
connection.start();
//创建Session
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建连接消息的队列,必须和生产者一一对应才能接受消息
destination = session.createQueue("FirstQueue1");
//创建消息消费者
messageConsumer = session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new Listener());
}
}
1.3消息监听器
/**
* 消息监听
* @author Weiguo Liu
*
*/
public class Listener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("收到的消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.发布/订阅模式(先启动订阅者,再启动生产者)
2.1消息的生产者(和点对点 的不同的是他创建的是Topic,而点对点创建的是Queue)
其中一个消费者对应一个监听器
public class JMSProducer {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认的连接
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认的密码
private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认的链接地址
private static final int SEDNUM = 10;//发送消息的数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;//连接工厂,可以生产连接
Connection connection;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息目的地
MessageProducer messageProducer;//消息生产者
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
//获取Connection
connection = connectionFactory.createConnection();
connection.start();
/*
* Session.AUTO_ACKNOWLEDGE表示当客户成功的从receive方法返回时
* 或者从MessageListener。onMessage方法返回的时候,会话确认客户收到的消息
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建消息队列(点对点的模式中)
//destination = session.createQueue("FirstQueue1");
//发布订阅模式
destination = session.createTopic("FirstTopic1");
//创建消息生产者
messageProducer = session.createProducer(destination);
//调用发送消息的方法
sendMessage(session, messageProducer);
//事务必须提交,否则不能发送成功
session.commit();
//关闭资源连接
if(connection != null){
connection.close();
}
}
/*
* 发送消息
*/
public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException{
for(int i=0;i<JMSProducer.SEDNUM;i++){
TextMessage message = session.createTextMessage("ActiveMQ发送的消息" + i);
System.out.println("发送消息:" + "ActiveMQ发布的消息" + i);
messageProducer.send(message);
}
}
}
2.2消息的订阅者
订阅者1
/*
* 消息订阅者1
* 这种方式的消费方式最常用
* 消费消息,利用监听的方式来接收消息
*/
public class JMSConsumer1 {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认的连接
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认的密码
private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认的链接地址
private static final int SEDNUM = 10;//发送消息的数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;//连接工厂,可以生产连接
Connection connection;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息目的地
MessageConsumer messageConsumer;//消息的消费者
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
//获取Connection
connection = connectionFactory.createConnection();
connection.start();
//创建Session
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建连接消息的队列,必须和生产者一一对应才能接受消息
//destination = session.createQueue("FirstQueue1");
//创建接收消息的订阅者,必须和生产者一一对应才能接受消息
destination = session.createTopic("FirstTopic1");
//创建消息消费者
messageConsumer = session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new Listener1());
}
}
订阅者2
/*
* 消息订阅者2
* 这种方式的消费方式最常用
* 消费消息,利用监听的方式来接收消息
*/
public class JMSConsumer2 {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认的连接
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认的密码
private static final String BROKERURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认的链接地址
private static final int SEDNUM = 10;//发送消息的数量
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;//连接工厂,可以生产连接
Connection connection;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息目的地
MessageConsumer messageConsumer;//消息的消费者
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
//获取Connection
connection = connectionFactory.createConnection();
connection.start();
//创建Session
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建连接消息的队列,必须和生产者一一对应才能接受消息
//destination = session.createQueue("FirstQueue1");
//创建接收消息的订阅者,必须和生产者一一对应才能接受消息
destination = session.createTopic("FirstTopic1");
//创建消息消费者
messageConsumer = session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new Listener2());
}
}
消息订阅者1的监听器
/**
* 订阅者1的消息监听器
* @author Weiguo Liu
*
*/
public class Listener1 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者1收到的消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消息订阅者2的监听器
/**
* 订阅者2的消息监听器
* @author Weiguo Liu
*
*/
public class Listener2 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者2收到的消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
后台调试时主要看的是Queues和Topics这两个选项,查看有几个生产者生产了几条消息,几个消费者消费了几条消息