Java Message Service学习(一)

一,背景

近期需要用到ActiveMQ接收Oozie执行作业之后的返回结果。Oozie作为消息的生产者,将消息发送给ActiveMQ,然后Client可以异步去ActiveMQ取消息。

ActiveMQ作为基于 JMS 开源的Apache Message Provider,故记录下JMS相关基础知识。

二,基础知识&基本概念

1)面向消息的中间件

Message-oriented middleware (MOM) is best described as a category of software for communication in an loosely-coupled, reliable, scalable and secure manneramongst distributed applications or systems
面向消息的中间件主要就是为了降低各个应用程序之间的耦合。

以前的软件之间的通信如下:

都是各个终端(应用程序)直接与主机通信(mainframe)。

而MOM的理念则是,在消息发送者与消息的接收者之间有一个message mediator 。This mediation provides a whole new level of loose coupling for enterprise messaging.

引入MOM的好处:

①This is the mechanism that allows for loose coupling between senders and receivers as there is no requirement for each to be connected to the MOM for sending and receiving messages.

可以做到 不必要求发送者和接收者同时“在线”(actived)才能进行消息通信。发送者只管把消息发给MOM,然后可以“离开”,接收者可以在随后任何时间去取(取决于何种通信模式)

即,发送者不需要知道接收者的存在,且可进行异步通信。

②MOMs added many additional features to enterprise messaging that weren‘t previously possible when systems were tightly coupled.

MOM还可以提供一些额外的功能:比如,消息的持久化(message persistence)、消息的转化、消息之间的路由……而这些在未引入MOM系统中很难实现的。

③ MOMs on the market today provide support for a diverse set of protocols for connectivity

支持各种各样的连接协议,即Client可以通过如HTTP/TCP....协议连接MOM。

④Furthermore, it‘s typical for a MOM to provide an API for sending and receiving messages and otherwise interacting with the MOM.

提供了相应的API发送及接收消息。

2)为什么有JMS?

1)中介绍了MOM的好处,正因为现实中存在许许多多的MOM厂商,他们开发出不同的MOM产品,如Apache的ActiveMQ,如WebSphereMQ....每家的MOM产品都有一套自己的发送、接收消息的API,因此,不同产品之间兼容性,和操作的统一性就出了问题。从而就出现了JMS。

The Java Message Service (JMS) moved beyond vender-centric MOM APIs to provide an API for enterprise messaging. JMS aims to provide a standardized API to send and receive messages using the Java programming language in a vendor-neutral manner.

The JMS API lowers the barrier to the creation of enterprise messaging applications among different JMS providers. It also eases the portability to other JMS providers.

从上图看出:JMS 客户端通过JMS 规定的API 访问 各种各样的基于JMS协议的消息中间件产品。这与Client 访问 数据库的方式十分相似。

每一家JMS都有自己的产品,如Apache ActiveMQ,每家公司都遵守JMS协议来为自己的产品开发出接口。而用户只需要与统一的JMS API打交道。

在数据库领域,有MySQL、Oracle、SQLSERVER……,但用户程序只需要通过JDBC就可以来访问各种数据库。

JMS clients utilize the JMS API for interacting with the JMS provider. Similar in concept to the using the JDBC API to access data in relational databases, JMS clients use the JMS API for standardized access to the messaging service.

关于JMS的一些基本概念

JMS Producer - A client application that creates and sends JMS messages.

JMS Consumer - A client application that receives and processes JMS messages.

JMS Domains - The two styles of messaging that include point-to-point and publish/subscribe.---点对点模型和发布订阅模型

JMS Provider - The implementation of the JMS interfaces which is ideally written in 100% pure Java.相当于各个开发出JMS产品的厂商

Administered Objects - Preconfigured JMS objects that contain provider-specific configuration data for use by clients. These objects are typically accessible by clients via JNDI.

Connection Factory - Clients use a connection factory to create connections to the JMS provider

Destination - An object to which messages are addressed and sent and from which messages are received.

JMS Message

一个JMS消息由三部分组成:Headers、Properties、Payload

Headers包含该消息的属性:如,消息要发送到哪里去?由JMSDestination字段来表示;

消息的传递模式,由 JMSDeliveryMode表示,传输模式有两种:

1)Persistent:Advises the JMS provider to persist the message so it‘s not lost if the provider fails. A JMS provider must deliver a persistent message once-and-only-once. In other words, if the JMS provider fails, the message will not be lost and will not be delivered more than once.

在该模式下,provider宕机了,消息不会丢失,且消息只会传递一次。

2)Non-Persistent:Instructs the JMS provider not to persist the message. A JMS provider must deliver a non-persistent message at-most-once. In other words, if the JMS provider fails, the message may be lost, but it will not be delivered twice.

......//还有许多其他的头部属性

Properties与Headers有点类似。

Payload:存储JMS实际消息的地方。可以以text形式、二进制形式存储消息。

JMS Selector

Consider the fact that there are times when a JMS client is subscribed to a given destination, but it may want to filter the types of messages it receives. This is exactly where headers and properties can be used.

Message selectors allow a JMS client to specify which messages it wants to receive from a destination based on values in message headers.

Message Selector允许用户只接收自己感兴趣的消息。

JMS Domain---消息传输模型

The point-to-point (PTP) messaging domain uses destinations known as queues.

点对点模型传输的目的地是队列。

Each message received on the queue is delivered to once-and-only-once consumer.

点对点嘛,消息只能发送给唯一的一个consumer。

Consumers receive messages from the queue either synchronously using the MessageConsumer.receive() method or asynchronously by registering a MessageListener implementation using the MessageConsumer.setMessageListener() method.

它支持同步通信和异步通信,同步通信使用MessageConsumer.receive()来接收消息。异步通信需要MessageListener监听器的支持。

发布-订阅模型

The publish/subscribe (pub/sub) messaging domain uses destinations known as topics

发布-订阅模型传输的目的地是Topics。

Any messages sent to the topic are delivered to all subscribers via a push model, as messages are automatically delivered to the subscriber.

JMS采用Push方式,即主动地把消息推送给订阅者。

发布-订阅模型中有两种订阅方式,一种是持久订阅(Durable subscriptions),另一种是非持久订阅。

非持久订阅:只有当 Client与JMS Provider(如,ActiveMQ)保持连接状态才能收到发送到某个Topic的消息。若Client处于离线,这个时间段发送到Topic的消息会丢失。

持久订阅:Using a durable subscription, when a subscriber disconnects from the JMS provider, it is the responsibility of the JMS provider to store messages for the subscriber

更详细的解释参考:

Message Durability 与 Message Persistence 的区别

Message Durability针对 Pub/Sub Domain而言的,它是指接收者以何种方式去接收消息,如果采用非持久订阅,接收者在消息发布到消息服务器的时候 没有连接到消息服务器,则它将收不到这个消息。

而Message Persistence与Domain无关,点对点模型中也存在Message Persistence问题。因为它是针对消息服务器而言的,描述的是消息的可靠性,即当消息服务器宕机后,消息是否丢失。

Message persistence is independent of the message domain. It is used to indicate the JMS application‘s ability to handle missing messages in the event of a JMS provider failure.

this quality of service is specified on the producer using the JMSDeliveryMode property using either the persistent or non-persistent property.

参考书籍:《ActiveMQ in Action》第二章

时间: 2024-10-10 16:54:12

Java Message Service学习(一)的相关文章

通俗深刻地认识JMS(即Java Message Service)

JMS很早就有,网上更是如此,但是大多总结的不太全面不太具体,在现有学习资源基础上结合自己的体悟,现重新总结一下: JMS全称为Java Message Service(即Java 消息服务),它是J2EE技术规范之一(它属于Java平台上有关面向消息中间件(MOM)的技术规范),用于访问消息系统(或向消息系统发送消息或向消息系统接收消息),最终实现不同应用系统之间的消息交互.呵呵呵,当你读到这里的时候恐怕会心里嘀咕--什么它妈的"消息系统"?我们知道通过同一套JDBC接口可以实现不同

Java Message Service

The Java Message Service(JMS) API is a Java Message Oriented Middleware API for sending messages between two or moreclients . JMS is a part of the Java Platform , Enterprise Edition , and is defined by a specification developed under the Java Communi

17) JMS: java Message Service(Java消息服务)

? ? ?JMS是一个标准,就像EJB,有很多开源的,商业的实现,ms技术对应的规范是jsr914,规范的实现称为jms provider,常见的实现有ActiveMQ.JBoss MQ.IBM Websphere MQ等. ? ? ? ?其主要优点: (1)可以使2个系统或模块实现松耦合,模块A不需要直接调用模块B,只需要往jms provider上发送一条约定格式的消息,模块B收到这条消息,进行后续的业务处理 (2)jms方式是异步的,意味着模块A发送消息之后,不需要等待模块B或者jms p

JAVA 基础知识学习笔记 名称解释

Java ee:? IDE: ? itegrity   development environment 集成开发环境 JMS:? java Message Service java   信息服务 JMX? Java Management Extensions,即Java管理扩展 JNDI:(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司 提供的一种标准的Java命名系统接口,JNDI提供统一的客户端 API,通过不同的访问提供者接口J

Web Service学习之服务端搭建与客户端调用

?工作中用到了Web Service,但是对这块不是很熟悉,决定花时间学习一下,现在记录一下最基本的入门知识点. 使用Java搭建Web Service服务端,使用Python脚本调用接口. 一.Web Service服务端 1.在Eclipse中新建一个Java工程,新建test.TestWebService类 package test; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public 

Web Service学习笔记

Web Service概述 Web Service的定义 W3C组织对其的定义例如以下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来运行远程系统的请求服务. 这里我们从一个程序猿的视角来观察web service.在传统的程序编码中,存在这各种的函数方法调用.通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法须要的參数P,方法A运行完毕后,返回处理结果R.这样的函数或方法调用

Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)

Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务. 这里我们从一个程序员的视角来观察web service.在传统的程序编码中,存在这各种的函数方法调用.通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行完毕后,返回处理结果R.这种函数或方法调用通常发

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我