(Message Queue 消息队列)JMS
文章目录
前言
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间中发送消息,进行异步通信
JMS是一种与厂商无关的 API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。
一、什么是ActiveMQ?
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS 实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位(在两个应用程序之间发送消息)。
二、启动MQ
直接双击activemq.bat就可以,注意根据系统选择(window 64位 选择 win64中的activemq)
启动成功。。。
Url:http://127.0.0.1:8161/admin/index.jsp
默认的用户名和密码:admin/admin
ActiveMQ的控制台,发布的消息都可以看见。
三、点对点(Queue)和发布/订阅(Topic)的区别
1、点对点(Queue)
2、发布/订阅(Topic)
3、点对点 与 发布/订阅的区别
四、ActiveMQ 点对点代码实现
1.消息发送者(Sender)
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class 生产消息到Queue
{
public static void main(String[] args) {
//创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616");
//声明连接
Connection connection = null;
//创建Session:用于发送消息和接收消息
Session session = null;
//创建消息的目的地
Destination destination = null;
//声明消息生产者
MessageProducer producer = null;
try {
//1,获得与ActiveMQ的连接
connection = connectionFactory.createConnection();
//2,开启这个连接
connection.start();
//3,创建Session对象:这将是个用于发送消息或接收消息的线程
//createSession 第一个参数transacted 表示是否支持事务
//第二个参数 acknowledgeMode 有如下几种
//1.AUTO_ACKNOWLEDGE 自动确认模式,不需客户端进行确认(通常使用这种)
//2.CLIENT_ACKNOWLEDGE 客户端进行确认
//客户端获得message之后需要进行message.acknowledge();
//3.DUPS_OK_ACKNOWLEDGE 允许重复消息
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
//4,创建目的地,并指明消息所放队列的名字
destination = session.createQueue("香坊铁路局");//Queue是Destination子接口
//5,创建向该目的地发送消息的生产者
producer = session.createProducer(destination);
//6,设置持久化模式
// 持久化模式 NON_PERSISTENT不持久化,PERSISTENT持久化,默认是持久化的
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//默认是持久化的
//发送三个消息
for(int cs=1;cs<=3;cs++) {
//7,创建要发送的消息
TextMessage message = session.createTextMessage("T1978is over "+cs);
//8,发送消息到目的
producer.send(message);
}
//9,提交消息
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
finally
{
//关闭连接
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
2.消息接收者(Receiver)
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class 从指定的Queue接收消息
{
public static void main(String[] args) {
//声明连接工厂
ConnectionFactory connectionFactory=null;
//声明连接
Connection conn = null;
//声明Session
Session session = null;
//声明目的地
Destination destination =null;
//声明接收者
MessageConsumer consumer =null;
try
{
//创建连接工厂
connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");
/* connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");*/
//创建连接对象
conn = connectionFactory.createConnection();
//开启连接
conn.start();//这个不能忘啊
//创建Session, false不启动事务,AUTO_ACKNOWLEDGE 自动确认模式,不需客户端进行确认
session = conn.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
//创建目的地
destination = session.createQueue("香坊铁路局");
//创建消息接收者
consumer = session.createConsumer(destination);
/* TextMessage textMessage = (TextMessage)consumer.receive();
System.out.println("接收到的消息为:"+textMessage.getText());*/
while(true)
{
//consumer.receive();
//如果一秒种都无法在消息队列中得到值则返回null
TextMessage textMessage = (TextMessage) consumer.receive(1000);
//如果没有信息了就结束循环
if(textMessage == null)
{
break;
}
System.out.println(textMessage.getText());
}
session.commit();//只有提交才会将消息从MQ中移除(取走)
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
五、ActiveMQ 发布/订阅代码实现
1.消息发布者
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class PublisherDemo
{
public static void main(String[] args) {
//声明连接工厂
ConnectionFactory connectionFactory = null;
//声明连接
Connection connection = null;
//声明Session
Session session =null;
//声明消息目的地
Destination destination =null;
//声明消息发布者
MessageProducer messageProducer =null;
try
{
//创建连接工厂
connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//创建连接
connection = connectionFactory.createConnection();
//开始连接
connection.start();
//创建Session
session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
//创建目的地
destination = session.createTopic("阿城铁路局");//createTopic表示采用发布/订阅模式
//创建消息发布者
messageProducer = session.createProducer(destination);
//发送消息
TextMessage textMessage =session.createTextMessage("T1983 is over");
messageProducer.send(textMessage);
//提交
session.commit();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
2.消息订阅者
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class SubscriberDemo
{
public static void main(String[] args) {
//声明连接工厂
ConnectionFactory connectionFactory = null;
//声明连接
Connection connection = null;
//声明Session
Session session =null;
//声明消息目的地
Destination destination =null;
//声明消息发布者
MessageConsumer messageConsumer =null;
try
{
//创建连接工厂
connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//创建连接
connection = connectionFactory.createConnection();
//开始连接
connection.start();
//创建Session
session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
//创建目的地
destination = session.createTopic("阿城铁路局");//createTopic表示采用发布/订阅模式
//创建消息订阅者
messageConsumer = session.createConsumer(destination);
//接收消息
messageConsumer.setMessageListener(new MessageListener(){
//采用匿名内部类对象实现MessageListener接口
@Override
public void onMessage(Message message) {
//接收订阅的内容
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("订阅者:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//提交
session.commit();
}
catch (Exception e)
{
e.printStackTrace();
}//注意作为订阅者:1、要确保先启动等待着消息的发布,2、代码中不能关闭连接
}
}
总结
许多厂商都支持 比如我们今天要学习的ActiveMQ(ActiveMQ只是实现了JMS操作标准的Java产品之一,即所有实现了JMS操作标准的Java产品都可以称为MQ,MQ的主要应用就是可以实现以异步方式在两个应用程序之间发送消息)(主要应用:天气预报服务)。