jms简介

jms是j2ee的一门技术,j2ee是一个包含20多门技术的总和。

jms定义了java中访问消息中间件的接口。并没有给予实现。将实现了jms接口的中间件叫做jms provider,比如activemaq.

jms消息分为三部分
1,消息头:每个消息头字段都有相应的get和set方法
2,消息属性:如果需要除消息头字段以外的值,可以用消息属性
3,消息体:封装具体的消息

jms producer : 消息生产者,创建和发送jms消息的客户端应用
jms consumer:消息消费者,接受和处理jms消息的客户端应用

消息的消费可以采用以下的两种方法之一:

1,同步消费:通过调用消费者的receive方法从目的地中显式提取消息,receive方法可以一直阻塞到消息到达
2,异步消费:客户端可以为消费者注册一个消息监听器,定义在消息到达时所采取的动作。

jms domains:消息传递域
1,点对点 :一对一,每个消息只能有一个消费者,可以有多个客户端来消费,但是每个客户端得到的数据都是不全的。他们消费的总和是一个完整的消息集。
2,发布订阅:一对多,每个消息都可以有多个消费者,每个topic的消费者只能消费自他订阅之后发布的消息。jms规范允许客户端创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费他在未处于激活状态时发送的消息。注意,即使是持久订阅,依然消费不到订阅前的消息。比如生活中的订杂志,不可能给你订阅之前的杂志。

Connection factory: 连接工厂
jms connection: 封装了客户与jms提供者之间的一个虚拟连接
jms session: 是生产和消费消息的一个单线程上下文。会话提供了一个事务性的上下文,在这个上下文中,一组发送和接收被组合到了一个原子性操作中。
destination:消息发送到的目的地
acknowledge: 签收。跟收快递一样,收到消息后,消费端要签收。

transaction:事务

===========================================
jms消息头
1,JMSDestination:由send方法设置(消息目的地),如果要在send方法里面指定目的地,则createProducer方法时就不能指定destination。
2,JMSDeliveryMode:由send方法设置(是不是要持久化),也可以由producer去设置。但是不要两方面同时设置。
3,JMSExpiration:有send方法设置(过期时间,默认是不过期)
4,JMSPriority:由send方法设置(优先级)jms规范里面,说优先级高的消息,会优先被消费。但是不保证全部是这样。
5,JMSMessageID: jms provider自动分配
6,JMSTimestamp:在调用send方法时自动设置。可以用这个来计算发送跟接收消息的时间差
7,JMSCorrelationID:由客户端设置
8,JMSReplyTo:由客户端设置,类似于快递的发件地址,收件人可以根据这个地址来联系对方。
9,JMSType:由客户端(开发者)设置,消息类型的识别符
10,JMSRedilivered:由JMS Provider设置。重新投递的意思

jms 消息体
jms规范规定了5中格式的消息体
1,TextMessage
2, MapMessage
3,BytesMessage
4,StreamMessage
5,ObjectMessage

消息属性
1,应用程序设置和添加的属性,如Message.setStringProperty(“”username”,”张三”)
2,JMS定义的属性
使用”JMSX”作为属性名的前缀,比如:
connection.getMetaData().getJMSXPropertyNames(),返回所有连接支持的JMSX属性的名字
3,JMS供应商特定的属性

==================jms可靠性机制========================
消息接收确认
jms消息只有在被确认后,才认为已经被成功的消费了。消息的成功消费常包含三个阶段:客户端接收消息,客户端处理消息和消息被确认。
在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式。
1,Session.AUTO_ACKNOWLEDGE:当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到消息。
2,Session.CLIENT_ACKNOWLEDGE:客户端通过调用消息的acknowledge方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行,确认一个被消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都会被确认。也即使说确认一个,会导致这个session里面的数据全部确认。工作中用的最多的也是这种方式,因为我们处理消息的时候可能会抛异常,这个时候就不签收,确保消息不丢。
3,Session.DUPS_OK_ACKNOWLEDGE :收到消息后,不发回馈信息。可能会导致消息被重复消费(比如2个consumer消费同一个队列,由于没有消息确认机制,可能会导致一条消息同时被2个客户端都消费了。这里只是说可能,broker会尽量避免这个问题),但是对于对重复数据要求不高的场合,非常适合。效率高。

消息还可以创建临时目的地(destination),生命周期仅限于producer连接期间。这个目的地没有名字。

持久订阅:
首先生产者必须使用PERSISTENT提交消息。客户可以通过会话上的createDurableSubscriber方法来创建一个持久订阅,该方法的第一个参数必须为topic。第二个参数是订阅的名称。

jms provider会存储发布到持久订阅对应的topic上的信息。之后再写吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值