JMS(java消息服务)是java平台关于面向消息中间件的api接口,用于在应用程序和分布式系统中发送消息,进行异步通信。JMS提供了一套类似JDBC的技术规范,服务的实现由具体的实现提供商提供。
使用JMS,可以解决诸多的体系结构性问题,比如异构系统集成通信,缓解系统瓶颈,提高系统的伸缩性(异步、非点对点的模式使得处理消息的应用可以水平扩展),增强系统用户体验,使得系统模块化和组件化变得可行并更加灵活。
使用JMS的集群系统有以下两个角色:消息传送客户端和消息传送服务器。客户端向服务器端发送消息,服务器随后再将消息发送给一个或者多个消息接收的客户端。
JMS支持两类消息传送模型:点对点模式和发布/订阅模式。点对点适用于一对一的消息传送,而发布/订阅模型则适用于消息组播的场景。点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此。基于这一点,JMS可以使用这种消息传送模型做负载均衡。点对点模型还可以允许接收者在接收消息之前查看消息的内容,而发布订阅模型则不行。
发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以用多种不同的订阅者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即时当前订阅者不可用,处于离线状态。
JMS API中提供的公共接口ConnectionFactory需要从JMS提供者出用JNDI的方式获取,有了ConnectionFactory,就可以获取连接JMS服务器的链接(Connection)、会话(Session)等。
这里要讲一下JNDI,JNDI是一组在java应用中访问命名和目录服务的api。它可以使应用程序使用者用api从网络上的 JNDI 提供者中获取命名服务对象。它的一个可能实现是:将对象实例绑定到jnpserver后,当远程端采用context.lookup()方式获取远程对象实例并开始调用时,jnp server获取对象实例,将其序列化回本地,然后在本地进行反序列化,之后在本地进行类属性访问。通过这个机制,就可以知道了,本地其实是必须有绑定到jboss上的对象实例的class的,否则反序列化的时候肯定就失败了。
般的JMS服务器也提供了JNDI的支持,会将ConnectionFactory对象以jndi的方式发布出来,JMS客户端通过这种方式获取到链接之后,就可以创建会话来和JMS服务器进行消息传递了。
最后欢迎大家访问我的个人网站: 1024s