JMS
作者:互联网
JavaEE
javaEE 是一套使用java进行企业级应用开发的大家一致遵循的13个核心规范工业标准,JavaEE平台提供了一个基于组件的方法来加快设计,开发,装配及部署企业应用程序
1,JDBC(Java Databease)数据库连接
2,JNDI(Java Naming and Directory Interfaces)Java的命令和目录接口
3,EJB(Enterprise JavaBean)
4,RMI(Remote Method Invoke)远程方法调用
5,Java IDL(Interface Description Language)/CORBA(Common Object Broker Architecture)接口定义语言/共用对象请求代理程序体系结构
6,JSP(Java Server Page)
7,Servlet
8,XML(Extensible Markup Language)可标记白标记语言
9,JMS(Java Message Service)Java消息服务
10,JTA(Java Transaction API)Java事务API
11,JTS(Java Transaction Service)Java事务服务
12,JavaMail
13,JAF(JavaBean Activation Framework)
什么是Java消息服务
Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持Java应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。
JMS的组成结构和特点
- JMS Provider
实现JMS接口和规范的消息中间件,也就是我们说的MQ服务器 - JMS Producer
消息生产者,创建和发送JMS消息的客户端应用 - JMSConsumer
消息消费者,接收和处理JMS消息的客户端应用 - JMS Message
- 消息头
- 消息属性
- 消息体
消息头
JMSDestination
消息发送的目的地,主要是指Queue和Topic
JMSDeliveryMode
持久模式和非持久模式。
一条持久性的消息:应该被传送“一次仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。
一条非持久的消息:最多会传递一次,这意味着服务器出现故障,该消息将会永远丢失。
JMSExpiration
可以设置消息在一定时间后过期,默认是永不过期
消息过期时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT时间值。
如果timeToLive值等于0,则JMSExpiration被设为0,表示该消息永不过期。
如果发送后,在消息过期时间之后还没有被发送到目的地,则该消息被清除。
JMSPriority
消息优先级,从0-9十个级别,0-4是普通消息5-9是加急消息。
JMS不要求MQ严格按照这十个优先级发送消息但必须保证加急消息要先于普通消息到达。默认是4级。
JMSMessage ID
唯一标识每个消息的标识由MQ产生
消息体
封装具体的消息数据
5种消息格式
- TextMessage普通字符消息,包括一个String
- MapMessage 一个Map类型的消息,key为String类型,而值为Java基本类型
//6.通过messageProducer 生产三条消息发送到消息队列中
for (int i = 1; i < 6 ; i++) {
//创建字消息
// TextMessage textMessage = session.createTextMessage("msg--" + i);
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("k1","mapMessage---v1");
//通过messageProducer发布消息
messageProducer.send(mapMessage);
}
消费者
//通过监听的方式来消费消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (message != null&&message instanceof TextMessage) {
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("***消费者的消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
if (message != null&&message instanceof MapMessage) {
MapMessage mapMessage = (MapMessage) message;
try {
System.out.println("***消费者的消息:"+mapMessage.getString("k1"));
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
- BytesMessage 二进制数组消息,包含一个byte[]
- StreamMessage java数据流消息,用表中流操作来顺序填充和读取
- ObjectMessage 对象消息,包含一个可序化的Java对象
发送和接收的消息体类型必须一致对应
消息属性
如果需要除消息字段以外的值,那么可以使用消息属性
识别/去重/重点标注等操作非常有用的方法
setStringProperty
//6.通过messageProducer 生产三条消息发送到消息队列中
for (int i = 1; i < 6 ; i++) {
//创建字消息
TextMessage textMessage = session.createTextMessage("msg--" + i);
textMessage.setStringProperty("c01","vip");
//通过messageProducer发布消息
messageProducer.send(textMessage);
}
if (message != null&&message instanceof TextMessage) {
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("***消费者接收到消息:"+textMessage.getText());
System.out.println("***消费者接收到消息的属性:"+textMessage.getStringProperty("c01"));
} catch (JMSException e) {
e.printStackTrace();
}
}
标签:Java,JMS,消息,textMessage,TextMessage,message 来源: https://www.cnblogs.com/qiuwenli/p/13475034.html