消息中间件及WebSphere MQ入门
- 格式:doc
- 大小:72.50 KB
- 文档页数:12
第十九章消息上下文(Message Context)一般说来,任意两条消息之间的属性是独立无关的,每条消息都有各自的属性。
比如,在缺省情况下,队列中的一条消息被MQGET 取出来,然后又原封不动地MQPUT 放回去。
虽然在内容上没有任何地改动,然而在一进一出之后,就变成了两条消息。
严格地说,放回去的消息已经不是原先在队列中的那条消息了,它们可以有各自的属性,从后一条消息中是看不出前一条消息的痕迹的。
缺省情况下,消息在经历了MQGET 和MQPUT 这么一个环节之后就“脱胎换骨”成了另一条消息,下一个环节只能知道消息的来源是上一个环节,而无法知道消息是由上一个环节产生,还是由上一个环节转发,更无法知道上一个环节之前的发送者。
(如图) 这样消息链中的每一个环节只能对上一环节对安全检查和权限认证,从而决定是否让消息通过,缺乏能在消息链全程中发挥作用的安全机制。
消息链的末端也只能看见最后一个环节,根本无法知晓消息的始作俑者,从而给末端授权或末端计费的应用带来一定的困难。
1 2 3 4图有时候,在实际的应用场景中需要消息的某些属性能够经历多次传递而不变。
这就意味着某些消息属性能够跨越一个环节,被自动复制到新的相关消息中去,从而被一环一环地传递下去,直到消息链的终点。
(如图) 终点的接收程序可以通过这些属性知道消息链起始端的发送程序想要传递的某些信息,这些可以被自动地复制传递而贯串始终的消息属性就是所谓的消息上下文(Message Text)。
A A图消息上下文指的是消息描述符(MQMD) 中的8 个字段,分两类:身份上下文(Identity Context) 和起源上下文(Origin Context)。
其中身份上下文指的是MQPUT 或MQPUT1 时发送程序的用户信息,通常存放消息链中最初的发送程序的用户信息;起源上下文指的是MQPUT 或MQPUT1 时发送程序自身的信息,通常存放上一个环节中MQPUT 程序的信息。
介绍安装以及配置服务详解IBM WebSphere MQ首先介绍一下MQMQ消息队列的简称是一种应用程序对应用程序的通信方法。
说白了也就是通过队列的方式来对应用程序进行数据通信。
而无需专用链接来链接它们。
MQ的通讯方式1.数据报的方式Datagram (Send and forget)应用程序在创建完消息后。
利用MQ的API将消息发送到队列中。
它充分利用了MQ(once and once only )2.请求和应答方式Request/Reply发送消息之后需等待对方处理结果。
需考虑如下问题:a.等待应答的时间是多少?b.如果没有应答怎么办。
c.本次session是否需要保留?MQ的开发流程1.让应用程序与队列管理器链接,通过MQconnect调用来进行此链接。
2.使用MQOpen调用为输出打开一个队列调用将其数据放到队列上。
MQPut应用程序使用 3.调用打开输入队列 4.调用MQOpen 5.使用MQGet从队列上接收数据安装步骤。
(此处为转载文章,作者已经证实所有步骤。
)Windows下WebSphere MQ服务端的安装:(1)把WebSphere MQWindows版服务器CD-ROM插入CD-ROM驱动器。
(2)如果安装了自动运行,那么会启动安装进程。
如果不启动,则双击CD-ROM 上的根目录中的Setup图标以启动安装程序。
(3)请等待,直到出现WebSphere MQ安装启动板窗口为止。
(4)如果需要更改安装的本地语言,单击选择语言图标,然后从列表中选择所需的语言。
(5)选择必备软件选项。
选择典型安装后,安装界面上的每个安装项右边有一个对钩号(表示已安装),反之则为一个叉号(表示还没有安装,如果要装MQ,则必须先把这些软件装好)。
如果出现了叉号:1)单击项目左边的?号以显示安装连接;2)选择要使用的安装源的选项,从以下各项选择:WebSphere MQ CD ?.因特网?网络? ?符号。
Websphere MQ入门教程——使用IBM Websphere MQ提纲前言今天,大多数企业都希望他们的硬件和软件提供者不只受限于一家厂商,相反,大家普遍认为应当面向多家厂商能够运行多种软件的多种硬件平台,这些硬件平台既可以是大型机,也可以是笔记本计算机。
其中包括传统的中央集中式系统,通常指大型企业所采用的大型机,部门级小型计算机和个人用个人计算机或工作站。
通常这些平台是在“混乱”中发展起来的,当时它们的成长既有独立性又有偶然性。
混乱造成的结果是由企业“玻璃房子”控制的清静、秩序井然的世界退化成了一个个独立而分散的部门,并要求任务能够满足其独立而分散的需求。
有些公司一直在寻求一种成熟的策略,以便在企业范围内扩展应用和数据,使其距最终用户最近。
这种需求在设计时,存在许多限制,因为目前的交互式主要是同步形式,它要求对方一直处于通讯状态,这必然会大大增加网络代价。
目前,许多企业都是由一些相对于整体业务问题而孤立的解决方案所组成的自动化孤岛。
在信息共享的大环境下,如果能在这些孤岛之间架起桥梁,那么效率和利润都将得到提高。
从我们与不同行业客户与服务提供者广泛接触的经验来看,这种沟通非常必要,而且正变得越来越重要。
有些公司已经找到了连接网络若干个部分的解决方案,它们或者是自行开发的或者只有较窄的应用领域。
如IBM用户事务处理的CICS就有这样的连接功能,但数据处理软件的设计、维护和开发通常都非常昂贵。
因此需要一种通用软件,它能够集成多个运行于供应商所提供的系统上的应用程序。
这种软件不仅成本不高,而且可以可靠地处理很高的吞吐量,消息中间件正是解决这种互连问题的解决方案。
商业消息中间件的出现保证了消息传输的可靠性,高效率和安全性,同时也减少了系统的开发周期。
目前应用最多的消息中间件产品为IBM Websphere MQ。
本文就针对Websphere MQ的体系结构、管理和开发进行详细的阐述,希望对读者有所帮助。
WebSphere培训教程1.引言WebSphere是由IBM公司推出的一款企业级应用服务器产品,广泛应用于企业信息系统的构建和部署。
WebSphere不仅支持JavaEE和Web服务,还提供了强大的事务管理、安全性和集群功能。
为了帮助开发人员更好地掌握WebSphere的使用,本教程将详细介绍WebSphere的基本概念、安装配置、应用部署和管理等内容。
2.WebSphere概述2.1WebSphere产品家族WebSphereApplicationServer(WAS):WebSphere的核心产品,支持JavaEE和Web服务,用于构建和部署企业级应用。
WebSphereMQ:一款消息中间件,用于实现不同系统之间的可靠消息传递。
WebSpherePortal:一款企业门户产品,用于构建和管理企业内外部的门户网站。
2.2WebSphere应用服务器事务管理:支持全局事务和局部事务,保证分布式应用的一致性。
安全性:提供基于角色的访问控制、单点登录等安全机制。
集群:支持负载均衡和故障转移,提高应用的可伸缩性和可用性。
管理工具:提供图形化界面和命令行工具,方便管理和监控应用。
3.WebSphere安装与配置3.1安装环境操作系统:支持Windows、Linux、X等。
JDK:安装JavaDevelopmentKit(JDK),版本要求根据WebSphere版本而定。
内存:至少2GB,推荐4GB或更高。
硬盘空间:至少2GB,推荐5GB或更高。
3.2安装步骤1)WebSphere安装包。
2)解压安装包,运行安装程序。
3)遵循安装向导完成安装。
3.3配置步骤1)打开WebSphere管理控制台。
2)创建新的应用服务器实例。
3)配置JVM参数、线程池等。
4)部署应用。
4.WebSphere应用部署与管理4.1应用部署1)打包应用:将应用打包为EAR、WAR或JAR文件。
2)部署应用:通过WebSphere管理控制台或wsadmin工具部署应用。
WebSphere MQ一小时快速入门一、什么是中间件中间件是处于应用软件和系统软件之间的通用服务,是一类以自己的复杂换取企业应用简单化的可复用的基础软件。
中间件主要分为消息中间件、应用服务器中间件、交易中间件等等。
而今天,笔者晓奕主要向大家介绍的正是IBM厂商的消息中间件WebSphere MQ。
二、WebSphere MQ简介Websphere MQ是IBM的商业消息通讯中间件(Commercial Messaging Middleware)。
Websphere MQ提供一个具有工业标准、安全、可靠的消息传输系统。
它可实施在广泛的IBM和非I BM平台上,它的功能是控制和管理一个集成的商业应用,使得组成这个商业应用的多个分支程序(模块)之间通过传递消息完成整个工作流程。
通过使用WebSphere MQ用户可以简单方便的开发出可靠、高效的分布式应用系统。
三、WebSphere MQ主要对象消息是对使用它的应用程序有意义的以字节为单位的字符串。
消息可以用来实现在相同或不同平台上应用程序间的通信。
队列是用于存储消息的数据结构。
按功能可以分为本地队列、远程队列、传输队列、模板队列、别名队列、死信队列等等。
队列管理器在WebSphere MQ中队列管理器是基本的软件系统,队列管理器可看成是队列和其他对象的容器。
通道是一种提供从一个队列管理器到另一个队列管理器的通信路径。
它又叫消息通道,用在分布式的队列把消息从一个队列管理器发送到另一个队列管理器。
按照定义可以分为发送通道(Sender)、接收通道(Receiver)、服务器通道(Server)、请求器通道(Requester)等。
MQSC命令是用来管理队列管理器对象,包括队列管理器本身、通道、队列和进程定义。
可以使用 runmqsc 向队列管理器发出 MQSC 命令。
四、WebSphere MQ体系结构WebSphere MQ的体系结构如图所示,它是由许多对象所组成的,主要包括队列管理器、队列、通道、进程定义等对象。
WebSphere+MQ入门培训教程()WebSphere MQ是一款IBM出品的消息队列软件,它利用多个操作系统之间的消息通讯,支持多种编程语言,提供了不同的API。
在整个面向服务的体系结构中,它可以提供业务过程和各个系统之间的可靠消息传递。
本篇文档将介绍如何使用WebSphere MQ,包括启动、安装、配置等方面。
1.环境准备在开始使用WebSphere MQ之前,您需要准备一个能够运行WebSphere MQ的环境,建议使用具有一定编程基础的Linux系统。
同时,您还需要将WebSphere MQ应用程序下载到本地机器上,并且在安装前进行解压。
在成功解压后,您需要按照提供的安装向导进行WebSphere MQ的安装。
2.启动和关闭WebSphere MQ应用程序要启动WebSphere MQ,您可以运行命令:mqm启动MQ 队列管理器,mqsc启动MQSC控制台,amqss启动SSL服务,等等。
要关闭WebSphere MQ服务,您可以使用以下命令:·停止MQ队列管理器:输入命令endmqm -iQUEUE_MANAGER_NAME;·停止MQSC控制台: 键入exit。
·停止SSL服务:输入命令:endmqssl。
3.配置和管理WebSphere MQ为了保证WebSphere MQ可以正常运行,您需要进行一些配置和管理工作。
以下是基本配置和管理任务的示例。
3.1 创建本地队列管理器您需要创建一个本地队列管理器,为应用程序提供基本消息队列服务。
3.2 创建本地队列您需要创建一个本地队列,以便您能够接收和发送消息,用于测试WebSphere MQ的基本消息队列功能。
3.3创建远程队列管理器当您打算在不同的网络内使用WebSphere MQ时,您需要创建一个远程队列管理器,以便可以跨网络访问。
3.4 连接到WebSphere MQ控制台您可以通过WebSphere MQ控制台来管理WebSphere MQ的基本配置,创建和管理队列和队列管理器,设置连接管理器,等等。
WEBSPHERE MQ实践最近以来,工作中一直在使用WebSphere的MQ产品,切实感觉到MQ作为消息中间件,在消息传递方面的强大功能,本文将详细描述MQ通讯的原理,并结合实例向大家展示MQ在java开发方面的一些技巧,由于很少在网上看到关于MQ比较复杂一点的通讯实例,抛砖引玉,希望对大家有所帮助。
简介WebSphere MQ是一种面向对象的消息中间件,用于异构应用之间的消息传递,应用程序通过MQ接口进行通讯,WebSphere MQ支持多协议消息通讯,可以最大限度地简化网络编程,同时MQ支持多种平台,对消息支持交易式的提交和回滚,是一款非常不错的产品。
本文首先将介绍MQ的通讯的一些知识,然后结合java开发实例,着重描述MQ在两个队列管理器的同步通讯过程,其中包括MQ的安装、配置、相关java代码开发等。
MQ基础知识MQ的通讯过程中一般会用到这么几个组建:队列管理器、队列、通道,接下来就本文会使用到的一些基础感念做简单介绍。
消息消息就是MQ通讯的内容,是应用程序之间传递的信息载体,消息(按照WebSphere MQ 队列管理器启动后,是否仍然保持)分为持久消息和非持久消息,一般把异步通讯配置为持久消息,同步通讯配置为非持久消息,本文有些地方也将消息称为报文。
队列队列就是消息的寄存器,在通讯时,消息被添加到队列中后发送出去。
队列分为本地队列、远程队列、别名队列等,本地队列是当前队列管理器中需要配置的,区别于本地队列,远程队列是指向远程队列管理器中的本地队列,本地队列又分为本地初始化队列、传输队列、目标队列、死进队列等,初始化队列作为消息触发,传输队列用来暂存待传输的消息,如果消息没有发送出去,最终会存放在死进队列中。
本文中主要本地初始化队列、本地传输和远程队列。
队列管理器队列管理器也就是MQ的运行环境,维护和管理消息队列,向应用程序提供消息服务。
应用程序连接到队列管理器的监听端口,访问队列管理器的队列,接收并发送消息,本文将建立2个队列管理器,模拟2个不同物理地址的MQ通讯,分别用来进行消息(报文)的发送端和接收端。
1 WebSphere MQ出现的背景许多企业随着自身规模不断壮大和信息化建设的加快,会出现不同部门有不同的应用系统,不同子系统完成不同的功能,但各个系统之间往往互不相连或联系很少,而形成诸多内部“信息孤岛”的现象。
因此,每次互联都需要单独设立1个项目,将双方的应用系统进行改造。
浪费了许多人力物力,直接影响企业内部整个运作,影响企业的快速决策,对企业长期的发展形成瓶颈。
面对这种情况,如何使企业像是一个有机的生物体,有能力进行自身的新陈代谢,自我更新,各个子系统分工明确,互相之间又具备有机的联系。
系统的整合是个好办法,换句话说,就是不需要改造各个子系统,而是借助某种中间件来加强子系统间的联系。
IBM WebSphere MQ就是这样一个优秀的用于应用系统间联系的软件。
它是IBM的商业通信中间件,由1个消息传输系统和1个应用程序接口组成,其资源是消息和队列。
它提供一个具有工业标准、安全、可靠的消息传输系统,实现控制和管理集成的商业应用,使得组成这个商业应用的多个子系统之间通过传递消息完成整个工作流程。
通过消息传递,将不同子系统有效地联系起来,每个子系统都可以对外提供自身的功能,其中消息是应用系统之间请求、应答和中间结果的载体。
不断流动的消息将松耦合关系的应用系统串起来,使它们之间的关系变成了功能叠加。
WebSphere MQ可以屏蔽不同的通信协议之间的差别,可以最大限度地简化网络编程的复杂性;同时,它支持多种平台,对消息支持交易式的提交和回滚。
2 WebSphere MQ的基本概念[1]2.1 消息消息是WebSphere MQ中最小的概念,是一段数据,是应用程序之间传递的信息载体。
消息分为持久和非持久消息;可以是1个请求、1个应答、1个报告或1份报文等。
1个消息大致分成两部分:消息数据头和应用数据体。
前者是对消息属性的描述,后者是应用间传送的数据消息,可以是字串、数据结构甚至二进制数据。
2.2 队列队列可以看作是用于存储消息的容器,并且存储是有顺序的。
javaweb消息中间件——rabbitmq⼊门概念:RabbitMQ是⼀款开源的消息中间件系统,由erlang开发,是AMQP的实现。
架构图⼤概如上。
broker是消息队列的服务器,⽐如在linux上,我们安装的rabbitmq就是⼀个broker,可以通过url+username+password连接。
每个消息服务器可以创建多个vhost,默认的vhost是“/”,linux中通过rabbitmqctl add_vhost <vhost> 创建vhost,再给指定⽤户授权即可。
⽣产者⾸先通过创建channel与broker连接,类似于创建⼀个会话,这样可以与消息主机通信发送消息。
消息⽣产者将消息发送到定义的exchange上,exchange通过不同的转发路由规则将消息转发到相应的队列,消费者选择⼀个队列监听,如果有多个消费者监听同⼀个队列,默认是轮询⽅式,保证每个连接有相同的收到消息的概率。
⼀个简单的rabbitmq程序:public class Producer {private static final String TEST_VHOST = "testvhost";private static final String TEST_QUEUE_NAME = "task_queue";private static Connection connection;private static Channel channel;public static void main(String[] args) throws IOException, TimeoutException, RabbitmqConnectionException {try {//create connectionFactory with host, username, password, vhost.ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setUsername("test");connectionFactory.setPassword("test");connectionFactory.setHost("localhost");connectionFactory.setVirtualHost(TEST_VHOST);//get connection from connectionFactoryconnection = connectionFactory.newConnection();//create an session to communicate with mq hostchannel = connection.createChannel();//declare a queue(if not exists, create it)channel.queueDeclare(TEST_QUEUE_NAME, true, false, false, null);String message = "Hello world";System.out.println("sending message : " + message);//publish message to the declaring queuechannel.basicPublish("", TEST_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());}catch (Exception e) {throw new RabbitmqConnectionException("Error connection");} finally {channel.close();connection.close();}}}public class Consumer {private static final String TEST_VHOST = "testvhost";private static final String TEST_QUEUE_NAME = "task_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost(TEST_VHOST);factory.setUsername("test");factory.setPassword("test");final Connection connection = factory.newConnection();final Channel channel = connection.createChannel();//declaring a queue to listenchannel.queueDeclare(TEST_QUEUE_NAME, true, false, false, null);System.out.println("Waiting for messages...");//a piece message per timechannel.basicQos(1);final com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received : '" + message + "'");channel.basicAck(envelope.getDeliveryTag(), false);}};channel.basicConsume(TEST_QUEUE_NAME, false, consumer);}} 在spring中:<!-- spring-rabbitmq.xml--><?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:rabbit="/schema/rabbit"xmlns:mvc="/schema/context"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/rabbit /schema/rabbit/spring-rabb <description>rabbitmq 连接服务配置</description><mvc:component-scan base-package="com.battery.rabbitMq"/><!-- 连接配置 --><rabbit:connection-factory id="rabbit-connectionFactory" host="${mq.host}" username="${ername}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.vhost}"/><rabbit:admin connection-factory="rabbit-connectionFactory"/><!-- spring template声明,注⼊到类中,⽤于将消息发送到指定队列--><rabbit:template exchange="test-mq-fanout" id="ssoTemplate" connection-factory="rabbit-connectionFactory" message-converter="jsonMessageConverter" /><!-- 消息对象json转换类 --><bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /><!-- 声明⼀个消息队列(durable:是否持久化exclusive: 仅创建者可以使⽤的私有队列,断开后⾃动删除auto_delete: 当所有消费客户端连接断开后,是否⾃动删除队列) --><rabbit:queue id="test_queue" name="test_queue" durable="true" auto-delete="false" exclusive="false" /><!-- 定义交换机rabbit:direct-exchange:定义exchange模式为direct,意思就是消息与⼀个特定的路由键完全匹配,才会转发。
浅谈消息中间件IBM WebSphere MQ
王建;江婷
【期刊名称】《微型机与应用》
【年(卷),期】2010(029)005
【摘要】详细地论述了MQ的基本概念、工作原理、基本配置及其在实际中的应用.
【总页数】4页(P6-8,11)
【作者】王建;江婷
【作者单位】中国科学技术大学,苏州软件学院,江苏,苏州,215123;上海南洋高科技有限公司,上海,201400
【正文语种】中文
【中图分类】TP319
【相关文献】
1.IBM消息中间件WebSphere MQ的应用 [J], 高宁
2.用消息中间件Websphere MQ获取OPC应用的实时数据方法 [J], 张江洋;胡战虎
3.IBM消息中间件WebSphere MQ的应用 [J], 高宁
4.基于IBM WebSphere MQ的商业银行数据推送技术的应用 [J], 杜丛强;曾庆妍;
5.基于Zabbix实现对消息中间件IBM WebSphere MQ队列及通道的自动发现与监控 [J], 欧杰
因版权原因,仅展示原文概要,查看原文内容请购买。
MQ的基本概念:首先了解什么是mq?mq的作用是什么?mq是通讯中间件。
他的作用是省去开发人员开发通讯工具的时间,节省开发成本,提高开发效率。
如何安装mq?根据以往的经验,win版的mq比较容易安装,傻瓜式,一路next就可以。
aix版本的用smitty安装。
linux版本用rpm -ivh 安装。
1) 队列管理器队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。
简单的说就是一个大容器的管理员,这个大容器里放了很多东西。
2) 消息在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。
消息有两部分组成:消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;消息体(Message Body),即用户数据部分。
在MQ中,消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息,非永久性消息是存储在内存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。
当用户对消息的可靠性要求不高,而侧重系统的性能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。
永久性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。
3) 队列队列是消息的安全存放地,队列存储消息直到它被应用程序处理。
通俗的理解就是大容器里的东西,存放消息的盒子。
消息队列以下述方式工作:a) 程序A形成对消息队列系统的调用,此调用告知消息队列系统,消息准备好了投向程序B;b) 消息队列系统发送此消息到程序B驻留处的系统,并将它放到程序B的队列中;c) 适当时间后,程序B从它的队列中读此消息,并处理此信息。
消息中间件概述消息队列技术是分布式应用间交换信息的一种技术。
消息队列可驻留在存或磁盘上,队列存储消息直到它们被应用程序读走。
通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。
在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段。
为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的。
设计分布式应用的方法主要有:远程过程调用(PRC)--分布式计算环境(DCE)的基础标准成分之一;对象事务监控(OTM)--基于CORBA的面向对象工业标准与事务处理(TP)监控技术的组合;消息队列(MessageQueue)--构造分布式应用的松耦合方法。
(a) 分布计算环境/远程过程调用(DCE/RPC)RPC是DCE的成分,是一个由开放软件基金会(OSF)发布的应用集成的软件标准。
RPC模仿一个程序用函数引用来引用另一程序的传统程序设计方法,此引用是过程调用的形式,一旦被调用,程序的控制则转向被调用程序。
在RPC实现时,被调用过程可在本地或远地的另一系统中驻留并在执行。
当被调用程序完成处理输入数据,结果放在过程调用的返回变量中返回到调用程序。
RPC完成后程序控制则立即返回到调用程序。
因此RPC模仿子程序的调用/返回结构,它仅提供了Client(调用程序)和Server(被调用过程)间的同步数据交换。
(b) 对象事务监控(OTM)基于CORBA的面向对象工业标准与事务处理(TP)监控技术的组合,在CORBA 规中定义了:使用面向对象技术和方法的体系结构;公共的Client/Server程序设计接口;多平台间传输和翻译数据的指导方针;开发分布式应用接口的语言(IDL)等,并为构造分布的Client/Server应用提供了广泛及一致的模式。
(c) 消息队列(Message Queue)消息队列为构造以同步或异步方式实现的分布式应用提供了松耦合方法。
消息队列的API调用被嵌入到新的或现存的应用中,通过消息发送到存或基于磁盘的队列或从它读出而提供信息交换。
消息队列可用在应用中以执行多种功能,比如要求服务、交换信息或异步处理等。
中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络通讯。
它在计算机系统中是一个关键软件,它能实现应用的互连和互操作性,能保证系统的安全、可靠、高效的运行。
中间件位于用户应用和操作系统及网络软件之间,它为应用提供了公用的通信手段,并且独立于网络和操作系统。
中间件为开发者提供了公用于所有环境的应用程序接口,当应用程序中嵌入其函数调用,它便可利用其运行的特定操作系统和网络环境的功能,为应用执行通信功能。
如果没有消息中间件完成信息交换,应用开发者为了传输数据,必须要学会如何用网络和操作系统软件的功能,编写相应的应用程序来发送和接收信息,且交换信息没有标准方法,每个应用必须进行特定的编程从而和多平台、不同环境下的一个或多个应用通信。
例如,为了实现网络上不同主机系统间的通信,将要求具备在网络上如何交换信息的知识(比如用TCP/IP的socket程序设计);为了实现同一主机不同进程之间的通讯,将要求具备操作系统的消息队列或命名管道(Pipes)等知识。
目前中间件的种类很多,如交易管理中间件(如IBM的CICS)、面向Java应用的Web应用服务器中间件(如IBM的WebSphere Application Server)等,而消息传输中间件(MOM)是其中的一种。
它简化了应用之间数据的传输,屏蔽底层异构操作系统和网络平台,提供一致的通讯标准和应用开发,确保分布式计算网络环境下可靠的、跨平台的信息传输和数据交换。
它基于消息队列的存储-转发机制,并提供特有的异步传输机制,能够基于消息传输和异步事务处理实现应用整合与数据交换。
IBM 消息中间件MQ以其独特的安全机制、简便快速的编程风格、卓越不凡的稳定性、可扩展性和跨平台性,以及强大的事务处理能力和消息通讯能力,成为业界市场占有率最高的消息中间件产品。
MQ具有强大的跨平台性,它支持的平台数多达35种。
它支持各种主流Unix 操作系统平台,如:HP-UX、AIX、SUN Solaris、Digital UNIX、Open VMX、SUNOS、NCR UNIX;支持各种主机平台,如:OS/390、MVS/ESA、VSE/ESA;同样支持Windows NT服务器。
在PC平台上支持Windows9X/WindowsNT/Windows 2000和UNIX (UnixWare、Solaris)以及主要的Linux版本(Redhat、TurboLinux等)。
此外,MQ还支持其他各种操作系统平台,如:OS/2、AS/400、Sequent DYNIX、SCO OpenServer、SCO UnixWare、Tandem等。
回页首MQ的基本概念:1) 队列管理器队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。
2) 消息在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。
消息有两部分组成:消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;消息体(Message Body),即用户数据部分。
在MQ中,消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息,非永久性消息是存储在存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。
当用户对消息的可靠性要求不高,而侧重系统的性能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。
永久性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。
此外,在MQ中,还有逻辑消息和物理消息的概念。
利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。
3) 队列队列是消息的安全存放地,队列存储消息直到它被应用程序处理。
消息队列以下述方式工作:a) 程序A形成对消息队列系统的调用,此调用告知消息队列系统,消息准备好了投向程序B;b) 消息队列系统发送此消息到程序B驻留处的系统,并将它放到程序B的队列中;c) 适当时间后,程序B从它的队列中读此消息,并处理此信息。
由于采用了先进的程序设计思想以及部工作机制,MQ能够在各种网络条件下保证消息的可靠传递,可以克服网络线路质量差或不稳定的现状,在传输过程中,如果通信线路出现故障或远端的主机发生故障,本地的应用程序都不会受到影响,可以继续发送数据,而无需等待网络故障恢复或远端主机正常后再重新运行。
在MQ中,队列分为很多种类型,其中包括:本地队列、远程队列、模板队列、动态队列、别名队列等。
本地队列又分为普通本地队列和传输队列,普通本地队列是应用程序通过API 对其进行读写操作的队列;传输队列可以理解为存储-转发队列,比如:我们将某个消息交给MQ系统发送到远程主机,而此时网络发生故障,MQ将把消息放在传输队列中暂存,当网络恢复时,再发往远端目的地。
远程队列是目的队列在本地的定义,它类似一个地址指针,指向远程主机上的某个目的队列,它仅仅是个定义,不真正占用磁盘存储空间。
模板队列和动态队列是MQ的一个特色,它的一个典型用途是用作系统的可扩展性考虑。
我们可以创建一个模板队列,当今后需要新增队列时,每打开一个模板队列,MQ便会自动生成一个动态队列,我们还可以指定该动态队列为临时队列或者是永久队列,若为临时队列我们可以在关闭它的同时将它删除,相反,若为永久队列,我们可以将它永久保留,为我所用。
4) 通道通道是MQ系统中队列管理器之间传递消息的管道,它是建立在物理的网络连接之上的一个逻辑概念,也是MQ产品的精华。
在MQ中,主要有三大类通道类型,即消息通道,MQI通道和Cluster通道。
消息通道是用于在MQ的服务器和服务器之间传输消息的,需要强调指出的是,该通道是单向的,它又有发送(sender), 接收(receive), 请求者(requestor), 服务者(server)等不同类型,供用户在不同情况下使用。
MQI通道是MQ Client 和MQ Server之间通讯和传输消息用的,与消息通道不同,它的传输是双向的。
群集(Cluster)通道是位于同一个MQ 群集部的队列管理器之间通讯使用的。
MQ的工作原理回页首如图所示:首先来看本地通讯的情况,应用程序A和应用程序B运行于同一系统A,它们之间可以借助消息队列技术进行彼此的通讯:应用程序A向队列1发送一条信息,而当应用程序B需要时就可以得到该信息。
其次是远程通讯的情况,如果信息传输的目标改为在系统B上的应用程序C,这种变化不会对应用程序A产生影响,应用程序A向队列2发送一条信息,系统A的MQ发现Q2所指向的目的队列实际上位于系统B,它将信息放到本地的一个特殊队列-传输队列(Transmission Queue)。
我们建立一条从系统A到系统B的消息通道,消息通道代理将从传输队列中读取消息,并传递这条信息到系统B,然后等待确认。
只有MQ接到系统B成功收到信息的确认之后,它才从传输队列中真正将该信息删除。
如果通讯线路不通,或系统B不在运行,信息会留在传输队列中,直到被成功地传送到目的地。
这是MQ最基本而最重要的技术--确保信息传输,并且是一次且仅一次(once-and-only-once)的传递。
MQ提供了用于应用集成的松耦合的连接方法,因为共享信息的应用不需要知道彼此物理位置(网络地址);不需要知道彼此间怎样建立通信;不需要同时处于运行状态;不需要在同样的操作系统或网络环境下运行。
MQ的基本配置举例在上图中,要实现网络上两台主机上的通讯,若采用点对点的通讯方式,我们至少要建立如下MQ的对象:在发送方A:1)建立队列管理器QMA: crtmqm -q QMA2)定义本地传输队列: define qlocal (QMB) usage (xmitq) defpsist(yes) 3)创建远程队列: define qremote (QR.TOB) rname (LQB) rqmname (QMB) xmitq (QMB)4)定义发送通道: define channel (A.TO.B) chltype (sdr) conname ('IP of B') xmitq (QMB) + trptype (tcp)在接收方B:1)建立队列管理器QMB: crtmqm -q QMB2)定义本地队列QLB: define qlocal (LQB)回页首3)创建接收通道: define channel (A.TO.B) chltype (rcvr) trptype (tcp) 经过上述配置,我们就可以实现从主机A到B的单向通讯,若要实现二者之间的双向通讯,可参考此例创建所需要的MQ对象。