初步了解JMS-基本概念

2019-03-27 23:19|来源: 网络

基本概念

JMS是Java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型。P2P模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。


对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。

与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。

简单的讲,点到点模型和发布/订阅模型的区别就是前者是一对一,后者是一对多。


P2P


在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

l  每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

l  发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。

l  接收者在成功接收消息之后需向队列应答成功

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型。


Pub/Sub


      在Pub/Sub模型中,有下列概念: 主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

l  每个消息可以有多个消费者

l  发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。

当然,为了缓和这种严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

      如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。


消息的消费

在JMS中,消息的产生和消费是异步的。对于消费来说,JMS的消费者可以通过两种方式来消费消息。

l  同步 – 订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。

l  异步 – 订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。



JMS编程模型



Connection Factory

创建Connection对象的工厂,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。


Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。


所以,Destination实际上就是两种类型的对象:Queue、Topic。


可以通过JNDI来查找Destination。


Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IPsocket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。


Session

Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。


Message

从字面上就可以看出是被发送的消息。它有下面几种类型:

StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取。

MapMessage:一个Map类型的消息;名称为string类型,而值为Java的基本类型。

TextMessage:普通字符串消息,包含一个String。

ObjectMessage:对象消息,包含一个可序列化的Java对象

BytesMessage:二进制数组消息,包含一个byte[]。

XMLMessage:一个XML类型的消息。


最常用的是TextMessage和ObjectMessage。


消息生产者

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息!


消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以通过session的createDurableSubscriber方法来创建持久化的订阅者。


MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-DrivenBean)就是一种MessageListener。



本文链接:初步了解JMS-基本概念,领悟书生学习笔记,整理网络文章

相关问答

更多
  • 1.建立数据库database,建立数据表student。 字段: sid 学号 文本 sname 姓名 文本 ssex 性别 文本(2字节) saddress 地址 文本 stel 电话 文本 2.类代码 /****************************************************** 使用: 设置数据库路径、sql语句、最大返回行数,使用getHTMLTable()返回html表格形式的字符串 executeSQL(String,String)执行SQL语句返回一个对象,请 ...
  • 在做软件架构设计时,根据不同的抽象层次可分为三种不同层次的模式:架构模式(Architectural Pattern)、设计模式(Design Pattern)、代码模式(Coding Pattern)。 架构模式是一个系统的高层次策略,涉及到大尺度的组件以及整体性质和力学。架构模式的好坏可以影响到总体布局和框架性结构。 设计模式是中等尺度的结构策略。这些中等尺度的结构实现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总体布局和总体框架。设计模式定义出子系统或组件的微观结构。 代码模式( ...
  • 有限元法(finite element method)是一种高效能、常用的数值计算方法。科学计算领域,常常需要求解各类微分方程,而许多微分方程的解析解一般很难得到,使用有限元法将微分方程离散化后,可以编制程序,使用计算机辅助求解。有限元法在早期是以变分原理为基础发展起来的,所以它广泛地应用于以拉普拉斯方程和泊松方程所描述的各类物理场中(这类场与泛函的极值问题有着紧密的联系)。自从1969年以来,某些学者在流体力学中应用加权余数法中的迦辽金法(Galerkin)或最小二乘法等同样获得了有限元方程,因而有限元法 ...
  • 1.我需要了解的所有命名约定是什么? db表是复数,模型是单数,控制器是复数。 因此您拥有由users表支持的User模型,并可通过UsersController查看。 文件应该命名为类名的wide_cased版本。 所以FooBar类需要放在一个名为foo_bar.rb的文件中。 如果您使用模块命名空间,命名空间需要由文件夹来表示。 所以如果我们谈论Foo::Bar类,它应该在foo/bar.rb 。 2.控制器操作应如何构建和命名? 控制器操作应该是RESTful。 这意味着您应该将您的控制器视为公开资 ...
  • 栈,是一种先进后出的数据结构, 队列,是一种先进先出的数据结构, 栈,有一个指针,指向栈顶元素 队列,有两个指针,一个指向队尾,一个指向队首 栈,只能从顶进,从顶出 队列,从队尾进,从队首出 栈,像一个木桶,我们往里面放面包,我们只能从桶口处往里面放,然后再从桶口处往外取,这就形成了栈的先进后出的特性。 队列,像一个管子,我们从管子的屁股处往里面塞糖豆,肯定是最先塞进去的糖豆先从管子的头处掉出去,这就形成了队列的先进先出的特性。 这是我能达到的最精简的程度了,希望你能看懂。^_^
  • 是数学上的一类特殊函数的总称。一般贝塞尔函数是下列常微分方程(一般称为贝塞尔方程)的标准解函数: 这类方程的解是无法用初等函数系统地表示的。 贝塞尔函数的具体形式随上述方程中任意实数 变化而变化(相应地, 被称为其对应贝塞尔函数的阶数)。实际应用中最常见的情形为 是整数 ,对应解称为n阶贝塞尔函数。  尽管在上述微分方程中, 本身的正负号不改变方程的形式,但实际应用中仍习惯针对 和 定义两种不同的贝塞尔函数(这样做能带来好处,比如消除了函数在 点的不光滑性)。
  • 我不知道这句话的内容,但它似乎是描述了一个链接的块列表。 一般来说,“块”是少量字节(通常是2的幂)。 它可能是4096字节,它可能是512字节,这取决于。 硬盘驱动器的设计是一次检索一个数据块的数据; 如果你想获得第1234567个字节,你必须得到它所在的整个块。一个“单词”要小得多,并且指的是一个单一的数字。 它可能低至2个字节(16位)或高达8个字节(64位); 再次,这取决于文件系统。 当然,块和单词并不全是文件系统。 文件系统通常实现某种类型的B树来快速查找(它不必搜索整个文件系统来查找文件,只需 ...
  • 每当您想要控制应用程序中多个线程的执行时。 虽然这不仅意味着只有一个线程增加了计数器; 但让事件发起/停止或暂停。 请参阅WaitHandles - Auto / ManualResetEvent和Mutex - 编辑 - WaitHandle是“使用”来控制线程执行的机制。 它不是关于在线程中不能访问的句柄; 它关于在线程内使用它们。 这可能是一个很好的例子,但请忍受我; 想一想,一位女士给五个女孩给了五个不同的口音,并告诉他们,一旦发生什么something就会吹口哨。 这个过程是为每个女孩吹口哨,女士 ...
  • Qt是一个庞大的框架,具有用于处理GUI,网络,数据库和各种事物的库。 它有很好的文档记录,所以请看看如何在诺基亚网站上学习Qt 。 话虽如此,这里有一些基本概念: Qt是一个框架。 这意味着您可以围绕响应事件来组织代码。 最重要的是,你没有“主循环”。 你的main看起来像这样: QApplication app(argc, argv); MyMainWindow win; win.show(); return app.exec(); 信号和插槽。 Qt使用信号和插槽的概念以一种彻底解耦的方式连接程 ...
  • 1)如果要同时接收消息,请使用MessageConsumer.receive 2)基本上,队列中的'peek'意味着返回但不删除队列的头部。 为此,您可以使用QueueBrowser查看队列中的消息而不删除它们。 1) If you want to receive messages synchroneously use MessageConsumer.receive 2) Basically, 'peek' in queues means to return, but do not remove, the ...