jms和面向消息中间件

引进jms
1.兼容以前的application
2.应用间互联(异构的网络和不同的底层协议)

已经有各种消息通过许多技术
1.remote procedure calls(rpc):com,corba,dce
2.进程间,通知,消息队列的解决方案:fifo缓冲,消息队列,管道,信号,socket
3.各种各样的消息中间件提供的匿名可靠的消息queen解决方案:ibm websphere mq,sonicmq,tibco rendezvous,apache activemq用来整合企业应用整合目的
什么是面向消息中间件
允许应用间利用供应商提供的api来处理在分布式系统间的各种各样的问题:大体上的注意就是扮演消息发送者和接受者之间的媒介,允许发送者和接受者之间松耦合,同时也允许发送者和接受者
离线处理这些消息
面向消息中间件特点:允许在很慢或者不可靠,复杂的网络间的环境健康的通讯,即使接受者接受失败也不会影响消息发送者,消息会route to 许多接受者,消息的route基于properties或者消息的内容
,消息传输也允许同样的消息不会被
面向消息中间件允许http/s,多播,ssl,tcp/ip,udp,
什么是面向消息服务
jms是提供一个标准java的api给消息的发送和接受者,jms要求java程序员拥有更少消息服务的知识,jms本身不是消息中间件

jmsclient
jms producers:messageproducer 提供了方法不仅发送消息,而且设置了设置了各种消息的header包括jmsdeliverymode , jmspriority,jmsexpiration(get/setTimeToLive)
jms consumer:jmsclient利用messageconsumer从目标中通过receive消费信息,或者利用messagelisterner的实现来异步的处理消息(通过messageListenner.onMessage方法,当消息到达目的网络时invoke)
message consumer不会设置destination,但是destinatation通常被设置在consumer利用session.createConsumer方法的时候

non-jms client可以利用jms providers native client api而不是jms api,列如corba iiop协议或者java rmi协议

jms provider 供应商中间件实现了jmsapi 类似jdbc
jms  message jms message 允许anyting被send, 包括文本和二进制文件,他包括两部分(headers 和payload) header提供client和jmsprovider的元信息,payload是消息的body能够支撑二进制和文本文件
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

· StreamMessage — Java原始值的数据流

· MapMessage–一套名称-值对

· TextMessage–一个字符串对象

· ObjectMessage–一个序列化的 Java对象

· BytesMessage–一个未解释字节的数据流

jms内部(headers 和payload)可以通过property指定
1 header可以被自动指定同构client‘s send方法
1.1jmsdestination, 目标地址,这是值得的对于那些从多个不同destination的consume message ,可以是topic或者queen
1.2jms delieveMode 支持两种1.持久化2.费持久化

TopicPublisher publihser = session.createPublisher(topic);
// 设置持久化传输
publihser.setDeliveryMode(DeliveryMode.PERSISTENT);

持久化:消息提供者会使用存储-转发机制,先将消息存储到稳定介质中,等消息发送成功后再删除。如果jms provider挂掉了,那么这些未送达的消息不会丢失;jms provider恢复正常后,
会重新读取这些消息,并传送给对应的消费者
非持久化、:对于非持久的消息,JMS provider不会将它存到文件/数据库等稳定的存储介质中。也就是说非持久消息驻留在内存中,如果jms provider宕机,那么内存中的非持久消息会丢失

 传输模式通常可以通过produccer设置,但是也可以通过重载JMSEXPIRATION设置,当时间超时后就可以利用header来阻止消息的传输(MESSAGEPRODUCER.setTimeToLive全局,MESSAGEPRODUCER。send()局部)
 JMSEXPIRATION设置的是GMT时间,默认值为0,默认不超时,jms不会传输任何超时的message
1.3jmsmessageid
JMSMESSAGEID,唯一的字符串来标识被jms provider分配的message。
JMSPRIORITY用来分配message的重要性(jms provider),10个等级 从0到9 0-4正常的优先级5-9expedieted优先级
Jms时间戳JMS PROVIDER的时间点(millistime为单位)若想关闭就用producer.setDisableMessageTimestamp()方法,他将设置时间戳为0
header可选字段(client)
JMSCorrelationID用来关联多个消息
JMSReplyto生产者希望消费者回复消息,JMSReplyto作为回复的目的地
JMS type:用来指定消息的类型
header可选字段(JMS provider)
JMSRedeliverd:如果这个值为true,表示被重新发送了,但消费者没有确认他收到这条消息, 或者JMS不确定消费者是否收到

jmsmessage 属性能够简单的设置header通过一些通用的方法
我们可以通过getPropertyNames()和propertyExists(ENUMERATION)方法来遍历他们,
这里有三种属性:
1.custom properties(get/setBooleanProperty)(get/setStringProperty)
2.JMS defined properties,
JMSXAppID:标识哪个应用程序发送message
JMSXcONSUMERtxid:标识哪个消息被消费了
JMSXdELIEVERYCount,:
JMSXGROUPID:消息的group
JMSXGROUPIDSEQ在这个group里面的
3 provider-specific 属性

Message selectors(消息选择器)
jms客户端能够运用jms 消息来告诉 jms provider 他仅仅想要收到的消息
sesssion.createConsumer(destination, selector)
JMS类型(domain)(MessageConsumer.receive同步,或者Messagelisterner via MessageConsumer.setMessageListerner )
1.PTP:Point to Point  发送者和接收者中有一个消息队列(messages quene),发送者发送消息则把消息加入到队列中,接收者接收消息则把消息从队列中取出;如果接收者没有接收,
则这条消息永远保存在队列中(除非已过期)、
特点:
A、每条消息只能有一个接收者  
B、发送者和接收者之间可以异步(no timing dependencies)
C、接收者成功接收答复机制
2.Publish/Subscribe  

 发送者把消息挂在一个主题下(类似电子公告板),接收者先订阅这个主题,当这个主题有新消息发布时,接收者就可以接收这个主题下的消息了,
 这个消息一直保持到所有订阅这个消息的人(在线的)都接收了才删除
 特性:
 A、一条消息可以有多个接收者接收
 B、接收者和发送者之间必须同步。
为了弥补这种类型的时间依赖(timing dependencies)劣势,JMS API 提供了创建持久订阅的机制,这样不管接收者是否在线,发送者都可以发送,接收者也可以接收。



你可能感兴趣的:(jms和面向消息中间件)