什么是消息?

消息是可编程实现两端通信的机制。通常的一些消息技术如:TCP/IP Sockets、管道、文件、共享存储。

Java消息服务

Java消息服务,即Java Message Service(JMS),是一组Java应用程序接口(Java API),它提供创建、发送、接收、读取消息的服务,使得Java程序能够和其他消息组件进行通信。

消息传送机制的优点

1. 异构集成

在完全不同的平台上实现应用程序和系统请求调用服务。消息传送机制提供跨应用程序和子系统共享数据和功能的去耦方案。

2. 缓解系统瓶颈

与一个同步组件处理众多请求时,众多请求一个接一个的积聚阻塞不同,这时候消息会发送到一个消息传送系统,该系统将该请求分发给多个消息侦听器组件(增加漏斗)。如此一来,就缓解了单独采用点对点同步连接带来的系统瓶颈。

3. 提高可伸缩性

通过引入能够并发处理不同消息的多个消息接收者(消息侦听器),消息传送系统的可伸缩性得以实现。

4. 提高最终用户生产率

通过使用异步消息传送机制,用户可以在向系统发出请求后,继续做其他事情。

5. 体系结构灵活性和敏捷性

消息传送机制,能快速地响应软硬件和业务的变化。使用消息传送机制方式,消息生产者或是客户端组件都不会知道接收组件使用的是哪种编程语言或平台,组件或服务位于何处,组件或服务实现的名称是什么,甚至用于访问该组件或服务的是哪种协议。

企业消息传送

消息是通过网络从一个系统异步传送给其他系统的。在异步消息传送机制中,应用程序使用一个简单的API来构建一条消息,然后再将该消息转发给面向消息的中间件,以便传送给一个或多个的预定接收者。

一条消息就是一个业务数据包,它通过网络从一个应用程序发送给其他应用程序。消息应该是自描述的,因为它包含所有必要的上下文,以便允许接收者独立地完成它们的工作。

消息传送系统由消息传送客户端和几种消息传送中间件服务器所组成。客户端向消息传送服务器发送消息,该服务器随后再将那些消息分发给其他客户端。客户端是使用消息传送API的一个业务应用程序或组件(JMS)。

1. 集中式体系结构

依赖于一台消息服务器(也称消息路由器或代理),它负责从一个消息传送客户端(JMS)向其他消息传送客户端(JMS)传送信息,实现一个发送客户端和其他接收客户端之间的解耦。客户端仅仅看到消息传送服务器,而不会看到其他客户端,这将允许在不会影响系统整体的情况下添加和删除客户端。通常,集中式体系结构使用的是星型的拓扑结构。

2. 分布式体系结构

使用网络层IP组播,没有集中服务器,一些服务器功能(持久性、事务和安全性)作为一个客户端的本地部分嵌入进来,而此时消息路由则利用IP组播协议委托给网络层。

消息传送模型

JMS支持两类消息传送模型(消息传送域):点对点模型(P2P)和发布/订阅(Pub/Sub)模型。点对点模型设计用于一对一消息传送,发布/订阅模型设计用于一对多消息广播。

1. 点对点模型

JMS客户端通过队列(queue)这个虚拟通道来同步和异步发送、接收消息,基于拉取(Pull)或者基于轮询(Polling)的消息传送模型,这种模型从队列中请求消息,而不是自动地将消息推送给客户端。耦合性比Pub/Sub模型更强。

2. 发布/订阅模型

消息会被发布到一个名为主题(topic)的虚拟通道中,基于推送(Push)的模型,消息自动地向消费者广播,它们无须请求或轮询主题来获得新消息,每个订阅者都会接受到发布者所发送的消息的一个副本。去耦能力比P2P模型更强。

传送消息方式

JMS现在有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。

如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。

JMS API

JMS本身并不是一种消息传送系统,它是消息传送客户端和消息传送系统通信时所需接口和类的一个抽象。JMS抽象可以访问消息提供者。使用JMS,应用程序的消息传送客户端可以实现跨消息服务器产品的移植。

JMS API分为3个主要部分:公共API、点对点API和发布/订阅API。公共API被用于向一个队列或一个主题发送和接收消息,点对点API专门用于队列,发布/订阅API则专门用于主题。

在JMS公共API内部,和发送与接收JMS消息有关的JMS API接口主要有7个:ConnectionFactory、Destination、Connection、Session、Message、MessageProducer、MessageConsumer。

在这些公共接口中,ConnectionFactory、Destination必须使用JNDI从提供者处获得。其他接口则可以通过工厂方法在不同的API接口中创建。

1. 点对点API

向一个队列发送和接收消息的接口:QueueConnectionFactory、Queue、QueueConnection、QueueSession、Message、QueueSender、QueueReceiver。

2. 发布/订阅API

内部接口:TopicConnectionFactory、Topic、TopicConnection、TopicSession、Message、TopicPublisher、TopicSubscriber。

JMS客户机

JMS客户机是指生产或消费消息的Java程序,Destination(目的)是JMS服务器上消息等待处理的地方。

参考文章:

1. Java消息服务学习笔记(1)

2. Java消息服务

Java消息服务的更多相关文章

  1. JMS(Java消息服务)入门教程

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  2. Java消息服务初步学习(基于Spring In Action的整理)

    几个名词 Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API. 消息代理(message broker):类似于邮局的作用,确保消息被投递到 ...

  3. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...

  4. JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)

    最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...

  5. java消息服务学习之JMS概念

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  6. 【转载】JAVA消息服务JMS规范及原理详解

    转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...

  7. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  8. JMS(Java消息服务)

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM:指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来 ...

  9. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

随机推荐

  1. POJ2406 KMP算法

    POJ2406 问题重述:给定字符串s0,记连续的k个s前后相连组成的s0s0...s0为s0^k.输入字符串S,求最大的k,使得S = s0^k. 问题分析: 1.采用kmp算法求出前缀函数 pre ...

  2. Symfony2 HttpKernel事件驱动

    HttpKernel:事件驱动       Symfony2 框架层和应用层的工作都是在 HttpKernel::handle()方法中完成,HttpKernel::handle() 的内部的实现其实 ...

  3. css透明度的一些兼容测试

    前言 网站丢给了外包公司来弄,但是老外写css的时候似乎没有考虑到国内的浏览器市场,于是只用了opacity这个属性来写,当IE8-的浏览器访问的时候,浮动层就像一块大黑斑药膏贴在哪里.很显然,婀娜多 ...

  4. Android用gif做启动页

    公司的一个app的启动页想改为gif图,之前没有在android中加入过gif,所以赶紧饿补! 前言 我们都知道ImageView是不能完美加载Gif格式的图片,如果我们在ImageView中src指 ...

  5. Android ActionBar 返回为NULL

    AndroidBar返回为NULL.是因为values-v11和values-v14下面的style的主题的设置的原因. 在SDK 11的设备上,会使用第二处,SDK 14会使用第三处. 只需要将三个 ...

  6. simulate windows postmessage or keydown

    2 ways: 1. under TForm:   if assigned(focused) then      Focused.keydown(key,keychar,[]); 2. using s ...

  7. Qt编程之通过鼠标滚轮事件缩放QGraphicsView里面的Item

    首先自己subclass QGraphicsView的一个类,叫DiagramView,然后重新实现它的滚轮事件函数,然后发送一个缩放信号: oid DiagramView::wheelEvent(Q ...

  8. android 遍历所有文件夹和子目录搜索文件

    java代码: import java.io.File; import android.app.Activity; import android.os.Bundle; import android.v ...

  9. 【转】Android 定时器实现的几种方式和removeCallbacks失效问题详解--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/9011193 实现定时器有很多种方式,在这里我简单的介绍几种方式 (1)使用Handler + ...

  10. Permutations 解答

    Question Given a collection of numbers, return all possible permutations. For example,[1,2,3] have t ...