JMS:即Java消息服务(Java Message Service)应用程序接口。是一个Java平台中面向消息中间件(MOM) 的API。
作用:用于两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS 便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
JMS是一种与厂商无关的API,用来访问/收发系统消息,它类似与JDBC。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,访问消息收发服务。
JMS 使您能够通过消息收发服务从一个 JMS 客户机向另一个 JMS客户机发送消息。
JMS组成元素:
JMS提供者:连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户端:生产或消费基于消息的Java的应用程序或对象。
JMS生产者(消息生产者):创建并发送消息的JMS客户。
JMS消费者(消息消费者):接收消息的JMS客户。
JMS消息(Message):包括可以在JMS客户之间传递的数据的对象
Message包括三个部分:
消息头:所有类型的这部分格式都是一样的
可设置的属性:
JMSDestination: 消息的目的地,主要包括两种类型QUEUE,TOPIC
JMSDeliveryMode:传递方式(持久化) 持久模式;若JMS提供者出现故障,该消息不会丢失,在服务恢复之后再次传递;非持久的消息最多传递一次,服务器出现故障后消息会永久丢失
持久模式( PERSISTENT = 2)和非持久模式( NON_PERSISTENT = 1):
一条持久性的消息:应该被传送“一次仅仅一-次”,这就意味者如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。
一条非持久的消息:最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。
JMSExpiration:消息过期时间,设置消息可用时长值为0时表示永不过期
JMSPriority:优先级设置,0-4为普通,5-9为高级,默认是4,除了高级一定比低级优先外,其他不是严格的优先顺序
JMSMessageID:设置消息的ID,(可以控制消息重复调用的幂等性)
TextMessage textMessage = session.createTextMessage("==========topic send msg======="+i); textMessage.setJMSDestination(topic);//目的地 textMessage.setJMSDeliveryMode(1);//持久化 textMessage.setJMSExpiration(0);//过期时间设置 textMessage.setJMSPriority(4);//默认优先 textMessage.setJMSMessageID(UUID.randomUUID().toString());//设置消息ID producer.send(textMessage);
消息体:指我们具体需要消息传输的内容。
· StreamMessage -- Java原始值的数据流(原始值流) · MapMessage--一套名称-值对(属性集合) · TextMessage--一个字符串对象( 简单文本) · ObjectMessage--一个序列化的 Java对象(可序列化的对象) · BytesMessage--一个未解释字节的数据流(字节流)'
消息属性:是除消息头以外的标记消息属性的参数,可以用来识别、去重、重点标注等消息属性;根据需要自己添加,通常有
JMS队列(Queue):一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题(Topic):一种支持发送消息给多个订阅者的机制。
对象模型:JMS对象模型包含如下几个要素:
1)连接工厂:连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
2)JMS连接:JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
3)JMS会话:JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
4)JMS目的:JMS目的(Destination),又称为消息队列,是实际的消息源。
5)JMS生产者和消费者:生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
6)JMS消息通常有两种类型Queue:
① 点对点(Point-to-Point):在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。
在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
1.只有一个消费者将获得消息(一个消息只能被一个消费者消费,被消费后就会出队列)
2.生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。(没有时间的相关性,类似于 我们发短信)
3.每一个成功处理的消息都由接收者签收
② 发布/订阅(Publish/Subscribe):发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。
发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:
多个消费者可以获得消息
在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时 发布的消息将在订阅者重新连接时重新发布。
使用Java语言,JMS提供了将应用与提供数据的传输层相分离的方式。同一组Java类可以通过JNDI中关于提供者的信息,连接不同的JMS提供者。这一组类首先使用一个连接工厂以连接到队列或主题,然后发送或发布消息。在接收端,客户接收或订阅这些消息。
开发代码请参考:https://blog.csdn.net/qq_33404395/article/details/80590113