啥是JMS:
A Java API that allows applications to create, send, receive, and read messages using reliable, asynchronous, loosely coupled communication
Defines a common set of interfaces and associated semantics that allow programs written in the Java programming language to communicate with other messaging implementations
JMS不作什么
JMS自己不实现消息服务机制.消息服务是由 MOM(messaging-oriented middleware) 提供的
不过,现在很多MOM都采纳了JMS机制并提供了JMS实现,so a JMS product can now provide a complete messaging capability for an enterprise.
消息发送的两种机制:
a.point to point. 两者之间的消息通过 queue 来传送
b.publisher/subscriber . publisher发布一个主题(topic),登记了该主题的subscriber都可以收到该topic相关的消息
可顾名思义,不多讲
JMS体系结构
a.jms provider: 即MOM
b.jms clients: 如producers,consumers
c.message: text,byte,object等
d.administered objects:即“资源”,都是通过JNDI来声明的
A.Connection工厂. 这里的connection指client 与 provider通讯时的连接
B.发送消息的目的地(Destionation).如p2p模式下的queue,和 pub/sub模式下的topic
可靠性
a.最可靠
The most reliable way to produce a message is to send a PERSISTENT message within a transaction
The most reliable way to consume a message is to do so within a transaction, either from a queue or from a durable subscription to a topic.
b.自定义可靠性级别
i. Controlling message acknowledgment
在事务session中,acknowledgment是在事务提交时自动产生的;
而在非事务session中,需要自定义acknowledgment模式,有以下以几种
a.AUTO_ACKNOWLEDGE
b.CLIENT_ACKNOWLEDGE
c.DUPS_OK_ACKNOWLEDGE
ii.Specifying message persistence
a.PERSISTENT(默认选项) 要求provider将消息持久化,一旦provider当机,消息仍可恢复
b.NON_PERSISTENT 不对provider提出以上要求
iii.Setting message priority levels
provider会尽力按优先级来发送消息,但是不保证精确
iv. Allowing messages to expire
v. Creating temporary destinations
一般destination都是在provider中手工配置的,但我们也可以通过编码生成临时的destination.具体有啥用还不知道
事务
消息操作可以不在事务中执行,也可以在事务中执行。JMS事务可以分为两种
i.JMS API 本地事务. 它类似于JDBC API的事务,通过JMS API自己的commit(), rollback()方法来提交或回滚
ii.分布式事务。要MDB的事务管理机制来搞
MDB
A message-driven bean is a message listener that can reliably consume messages from a queue or a durable subscription
它和普通的listener的区别就是:它是一种EJB。 它有ejbCreate(),ejbRemove()等方法,而且,它所对应的connection factory和destionantion都是在容器中配置好的,而不是通过写代码确定的
运行在J2EE app server中的MDB 如何与jms provider 连接?有两种方法
a.deploy the MDB to use the JMS provider via the proprietary interface provided by your J2EE container
b.use a JCA resource adapter
一些零碎
a.一个消息如果没被acknowledge,那系统就认为它没有被消费掉,就会继续把消息放在队列里
b.acknowledge 以事务为边界
i.事务提交时,acknowledgement就会自动产生
ii.事务回滚后,所有已消费的消息都会重发一遍