JMS笔记 - HornetQ

JMS 1.x 规范

1.实现PTP , Pub/Sub 两种方式通信
2. 持久化
3. 事务处理
4. 同步,异步通信
5. Delivery guarantees

可选项:
负载均衡,容错
错误/劝告通知
管理
安全
通信协议
消息类型存储池



JMS 作用
Messaging systems allow you to loosely couple heteregenous systems together, whilst typically providing reliability, transactions and many other features.
Unlike systems based on a Remote Procedure Call (RPC) pattern, messaging systems primarily use an asynchronous message passing pattern with no tight relationship between requests and responses. Most messaging systems also support a request-response mode but this is not a primary feature of messaging systems.

松散地联系各系统,不用受其它服务器的制约,有效的减少线程Block的时间. 不同于RPC , 采用的Request/Reponse 的方式.



Durable Subscription
JMS Provider只会为已经连接并且订阅了该指定Topic的消息订阅者发送消息, 如果消息到达之后你恰好不在,那不好意思,你将接收不到这一消息。
JMS Provider也会保证, 该Durable Subscription消息订阅者重新回来之后,之前到达而该Durable Subscription消息订阅者还没有处理的消息,将被一个不少的发送给它。
HornetQ

Groups of messaging servers. 水平添加服务节点.

---JMS 管理:
Amin tools  bind  via JNDI (ConnectionFactory)
JMS Client Lookup --Connection & Queue/Topic.


设置属性和属性迭代
Acknowledge 消息确认

Message 接口(是所以JMS Message 的接口)
主要定义 Message 的header 和 acknowledge 方式,Body 留给具体的实现类.

Header 内的值由clients ,providers (识别message 和路由信息).
---Header---
JMSMessageID
JMSTimestamp
JMSCorrelationID 相关ID,联接ID
JMSDestination  发往的目的.
JMSReplyTo (return Destination)
JMSDeliveryMode  (DeliveryMode.NON_PERSISTENT,PERSISTENT)
JMSRedelivered
JMSType
JMSExpiration
JMSPriority

Properties (可以自定义属性,主要用于Message filtering 功能,selectors)

Body
Stream -- StreamMessage 包含顺序读取值的流
Text -- TextMessage)
Map -- MapMessage (key/value))
Object --  ObjectMessage  Support Serializable序列化的对象.
Bytes --  BytesMessage  字节信息(如存放图像)

acknowledge();



---API
JMS标准API和特有API
ConnectionFactory  (Topic/Queue)ConnectionFactory
Connection    (Topic/Queue)Connection
Destination     Topic/Queue
Session    (Topic/Queue)Session
Producer     TopicPublisher /QueueSender
Consumer     TopicSubscriber /QueueReceiver


---事务, Commit /Rollback

--- Producer 发送模式 DeliveryMode (PERSISTENT和NON_PERSISTENT )


---Acknowledge 方式,(用于消息消费者,确认自己收到消息的方式):

一条信息得到确认一般经过三个步骤:
1.客户收到消息.
2.客户成功处理消息
3.客户确认收到消息.



非事务中:
Session.AUTO_ACKNOWLEDGE
指定消息代理在每次收到消息时自动发送确认。消息只向目标发送一次,但传输过程中可能因为错误而丢失消息(消息代理确认只是确认收到了消息,而不是确认消息提交给了消息接收者)
receive() or MessageListener  处理消息并成功返回,此会话会自动确认收到消息.

Session.CLIENT_ACKNOWLEDGE
由消息接收者确认收到消息,通过调用消息的acknowledge()方法(会通知消息提供者收到了消息)
Session session = conection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = (Destination)getContext().lookup(QUEUE_NAME);
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive(100);

message.acknowledge() //确认收到之前包括本身的信息.

Session.DUPS_OK_ACKNOWLEDGE
指定消息提供者在消息接收者没有确认发送时重新发送消息(这种确认模式不在乎接收者收到重复的消息)
在消息传递过程中,如果 JMS provider失败,这可能会导致传递一些重复的消息,因此只有在消费者允许重复的消息时才考虑使用此模式
如果重传一条消息,jms provider 必须设置消息头 JMSRedelivered 为 true)。

consumerSess.recover(); 操会重发,没有确认的信息.

事务中:
事务提交的时候会自动确认消息,当事务被回滚,所有消费的消息都会被重传.
Session.SESSION_TRANSACTED=0

当 TopicSession 关闭,jms provider 也会保持那些持久 TopicSubcriber 没有确认的消息。非持久 TopicSubscriber 没有确认的消息,当会话关闭时会被丢弃

---ClientId 值.
DurableSursciber  需要设置此值.
可以使用方法 TopicSession.createDurableSubscriber 创建一个持久订阅者。持久订阅在任何时候仅能有一个订阅者。
* 为连接设置一个唯一的客户 id( Connection.setClientID )
* 订阅的主题名以及订阅的名称

unsubscribe 方法会使 jms provder 删除它维护的关于订阅者的状态信息。
jms provider 会保存发布到这个主题上的消息。如果任意一个应用程序使用具有相同客户 id 的连接,并使用相同的主题和订阅名调用 createDurableSubscriber 方法,那么这个持久订阅就会被激活,jms provider 就会把在此订阅者处于不活动状态发布的消息传递给此订阅者。

删除一个持久订阅,首先要关闭订阅者,然后使用订阅名调用 unsubscribe 方法注销持久订阅。
topicSubscriber.close();
topicSession.unsubscribe( "mySub" );
unsubscribe 方法会使 jms provder 删除它维护的关于订阅者的状态信息。

--ReplyID

Destination queue = (Destination)getContext().lookup(QUEUE_NAME);
Destination replyQueue = (Destination)getContext().lookup(REPLY_QUEUE_NAME);

MessageProducer producer = session.createProducer(queue);
textMessage.setJMSReplyTo(replyQueue);
producer.send(textMessage);

---

Destination jmsReplyTo = reveMessage.getJMSReplyTo();
MessageProducer producer = session.createProducer(jmsReplyTo);
producer.send(session.createTextMessage("---Reply"));


Connection-factory(NettyConnectionFactory) 相关参数:



HornetQ 特点:
1. stand-alone messaging,  or using its JCA adaptor integrated with any J2EE application.
2. hight performance. and multi-protocol.
3. Using pojo able to  used with any dependency injection framework. Jboss MC, Spring , Google Guice

JMS 的使用,是通过Client 代码 实现一个基于HornetQ 的 JMS facade.

Facade Pattern 是一种门面模型,主要解决客户和组件中各种繁杂子系统有过多的耦合.为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

JMS Facade      --->        HornetQ Client        -->  HornetQ Server.(Server side)
Core HornetQ client is fully functional.

Stand-alone
JNDI + HornetQ POJOs.

Hornet inside JBoss As 5.x
JNDI -- JMX -- EJB --Other Service
Web Services
Transactions
etc
HTTP
Hornet POJOs.
POJO (Plan old java object) 简单的JavaBean(具有一系列Getter,Setter方法的类)


Journal,

Java NIO (New I/O or Non-blocking I/O)





限制每秒消费的Message 数据.
<consumer-max-rate>1000</consumer-max-rate>
限制每秒生产的Message 数据.
<producer-max-rate>1000</producer-max-rate>


你可能感兴趣的:(spring,应用服务器,jboss,jms,Google)