JMS定义
JMS的全称是Java Message Service,即Java消息服务。用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。它是JAVAEE技术体系中的一个消息传递服务中间件,而MQ是JMS的落地产品。
以下是JAVAEE技术体系:
1、JDBC (Java Database) 数据库连接
2、JNDI (Java Naming and Directory Interfaces) Java的命名和目录接口
3、EJB ( Enterprise JavaBean)企业级的JavaBean
4、RMI (Remote Method Invoke)远程方法调用
5、Java IDL(Interface Description Language)接口定义语言
CORBA(Common Object Broker Architecture)公用对象请求代理程序体系结构
6、JSP (Java Server Pages)
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消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建,发送,读取消息等等,用于支持JAVA应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦,异步,削峰的效果。
JMS相关落地的产品及比较
JMS组成的特点
1、JMS Provier 作用:实现JMS接口规范的消息中间件,也就是MQ。
2、JMS Producer 作用:消息生产者,创建与发送JMS消息的客户端应用。
3、JMS Consumer 作用:消息的消旨者,接受与处理JMS消息的客户端应用。
4、JMS Messager 作用:消息的载体。
JMS Messager
消息头
JMSDesination:消息发送的目地地,主是指Queue和Topic。
JMSDeliveyMode:消息的持久模式和非持久模式。
一条持久性的消息应该被传送 “仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。一条非持久的消息最多会传送一次,这意味着服务器如果出现故障,该消息将永远丢失。
JMSExpiration:消息的过期设置,默认为永不过期。消息过期时间,等于Destination的send方法中的timeToLive值加上发送时间点的GMT时间值,如果timeToLive的值等于0,则消永不过期;如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority:消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息。JMS不要求MQ严格按照这十个优先级发送消息,但必须保正加急消息要先于普通消息到达。默认为4级。
JMSMessageID:唯一识别每个消息的表示,由MQ产生。
//设置producer发出的消息是否是持久的
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//设置消息发送的优先级,默认为4
producer.setPriority(6);
//设置禁用MessageID
producer.setDisableMessageID(true);
//设置过期时间
producer.setTimeToLive(1000);
//设置禁用消息的时间戳
producer.setDisableMessageTimestamp(false);
message.setJMSDestination(destination);
message.setJMSMessageID(1);
message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
message.setJMSPriority(5);
消息体:消息的载体
StreamMessage:Java原始值的数据流
MapMessage:一套名称(键)-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的 Java对象,需要放行所有包的安全检查
ActiveMQConnectionFactory factory=new ActiveMQConnectionFactory(brokerURL);
factory.setTrustAllPackages(true);//放行所有包的安全检查
BytesMessage:一个字节的数据流
//注意:发送和接收消息必须是一一对应的
消息属性
消息属性是一种加强型的API。如果需要使用消息头以外的值,那么可以使用消息属性。主要用于识别、去重、重点标注等操作。它们是属性名、属性值对应的形式制定的。可以把属性看着消息头的扩展,属性指定一些消息头没有包括的附加信息,比如可以在属性里指定消息选择器。
消息的属性就像可以分配给一个消息的附加消息头一样,它们允许开发者添加有关消息的不透明的附加信息,它们还用于暴露消息选择器在消息过滤时使用的数据。
TextMessage message=session.createTextMessage();
message.setText(text);
message.setStringProperty("username","小明");//自定义属性
消息可靠性及持久化
1、参数配置说明,默认为持久消息
//持久设置
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//非持久设置
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
2、Queue逻辑
不设置,发送消息,重启MQ,查看消息是否存在。存在,说明默认为持久。持久化消息,这个队列的默认传递样式,此模式保证这些消息只被传送一次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性是另一个重要方面是确保持久性消息传递到目标后,消息服务在向消费者传递它们之前不会丢失这些消息。
3、topic逻辑
非持久的topic没有意义,因为发布订阅模式是先启动订阅再启动生产,消息已经被消费了。如果先启动生产者后启动订阅者,消息会被当作废消息。
评论区