一、概念
JMS即Java消息服务(baiJava MessageService)应用程序接口是一个Java平台du中关于面向消息中间件(MOM)的API,用于zhi在两个dao应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java Database
Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEAWeblogicJMS service和 Progress 的 SonicMQ,这只是几个例子。JMS使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,
它们分别携带:
- 简单文本(TextMessage)
- 可序列化的对象 (ObjectMessage)
- 属性集合 (MapMessage)
- 字节流 (BytesMessage)
- 原始值流 (StreamMessage)
- 还有无有效负载的消息 (Message)。
二、消息生产者编码
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import javax.jms.Connection;
import javax.jms.JMSException;
public class JMSProduce {
public static final String ACTIVEEMQ_URL = "tcp://192.168.56.10:61617";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
//创建连接工厂,按照指定的URL地址,采取默认的用户名密码
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEEMQ_URL);
//获取连接connecion并启动访问
Connection connection = connectionFactory.createConnection();
connection.start();
//创建会话session
//两个参数,第一个事务、第二个签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地(queue/topic)
Queue queue = session.createQueue(QUEUE_NAME);
//创建生产者,传入地址
MessageProducer producer = session.createProducer(queue);
//创建消息
for(int i=1;i<3;i++){
Message message = session.createTextMessage("message"+i);
//生产者发送消息
producer.send(message);
}
System.out.println("success");
//关闭资源
producer.close();
session.close();
connection.close();
}
}
三、消息消费者编码
package T1;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JMSConsumer1 {
public static final String ACTIVEEMQ_URL = "tcp://192.168.56.10:61617";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
System.out.println("queue01");
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEEMQ_URL);
Connection connection = connectionFactory.createConnection();
connection.start();
//创建服务对象session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地Destination --->ActiveMQ的接收点
Queue queue = session.createQueue(QUEUE_NAME);
//创建生产者
MessageConsumer messageConsumer = session.createConsumer(queue);
while (true){
TextMessage message = (TextMessage) messageConsumer.receive();
if (message != null){
System.out.println("consumer消息接收"+message.getText());
}else {
break;
}
}
messageConsumer.close();
session.close();
connection.close();
}
}
依赖导入
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.12</version>
</dependency>
两种接收消息的方式:
1.receive() 方法
同步阻塞方式,订阅者或接收者调用MessageConsumer的receive()方法来接收消息,receive在能够接收到消息之前(或超时之前)将一直阻塞
- 无参数设置
如图显示一直处于在线状态 - 设置等待时延
等待3秒后就下线了
2.通过监听的方式来接收消息
订阅者或接收者通过MessageConsumer的setMessageListenere(MessageListener
listener)注册一个消息监听器,当消息到达之后,系统自动调用监听器MessageListener的onMessage的onMessage(Message
message)方法
//监听的方式接收消息MessageListener()
messageConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if( null != message && message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("consumer消息接收"+textMessage.getText());
}
catch (Exception e){
e.printStackTrace();
}
}
}
});
//保证控制台一直在线
System.in.read()
消费者消费的三种情况
1、生产者先生产 之后启动消费者1 可以消费
2、生产者先生产 之后启动消费者1 可以消费
2号消费者不能再接着消费
生产者生产
消费者1
消费者2
3、启动2个消费者,生产6条消息
消费者1和消费者2均分消息
小结:JMS开发基本步骤
1.创建一个Connection factory
2.通过conneciton factory 来创建JMS connection
3.启动JMS connection
4.通过connection创建JMS session
5.创建JMS destination
6.创建JMS producer 或者创建JMS message并设置destination
7.创建JSM consumer或者是注册一个JMS message listener 8,发送或者接收JMS message(s)
9.关闭所有JMS资源
点对点消息传递域的特点:
- 点对点的消息传递域中。目的地称为队列
- 每个消息只能有一个消费者,类似于1对1的关系,
- 消息的生产者和消费者之间的没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,消费者都可以提取消息。
- 消息被消费后队列中不会存储,所以消费者不会消费到已经被消费掉的消息