WebSphere MQ 入门指南
这是一篇入门指南。我们从最基本的概念说起;
对于MQ,我们需要知道4个名词:队列管理器、队列、消息、通道;对于编程设计人员,通常更关心消息和队列,对于维护管理人员,通常 会更关心队列管理器和通道。
如果我们把队列管理器比作是数据库,那么队列就是其中的一张表,消息就是表中的一条记录。
队列:我们可以简单地把队列看成一个容器,用于存放消息。
队列管理器:队列管理器构建了独立的 MQ 的运行环境,它是消息队列的管理者,用来维护和管理消息队列。
消息:MQ中的最小对象;默认情况下,消息缺省可以达到 4MB。消息可以分成持久消息和非持久消息。所谓“持久”的 意思,就是在MQ 队列管理器重启动后,消息是否仍然能保持。持久的消息写入或读出队列的同时会在 Log 中记录,所以性能上比非持久消息差不少。
通道:通道则是两个队列管理器之间的一种单向的点对点的通信连接, 消息在通道中只能单向流动。队列管理器之间的通信是通过配置通道来实现 的,通道两侧的队列管理器对这个通道的相关参数应该能对应起来。在通道上可以配置不同的通信协议,这样就使得编程接口与通信协议无关。通道两端的 配置必须匹配,且名字相同,否则无法连通。
RUNMQSC:命令行交互界面管理工具;作为维护人员的我们,与MQ打交道有两种方式,一种是通过MQ提供的二进制命令工具(在mq安装目录的bin目录下),另一种方式则是通过命令行交互管理工具;这二者在功能上有很多是重合的,但并非完全可替代;
RUNMQSC是一个通用的 MQ 对象管理工具,使用 MQSC命令集可以对 MQ 对象进行
全方位的管理,也是各种管理方式最直接、最全面的一种。
RUNMQSC 运行的命令集称为 MQSC (MQ Script Command)";在 RUNMQSC 中大小写无关,所有的命令会先转换成全大写再提交执行。所以如果要 表示大小相关的字串,比如对象名,则用引号将字串包住。
输入以下命令启动MQSC命令:runmqsc [queueManagerName]
ok,概念介绍完了,下面就是通过示例来学习如何使用他们;
首先,我们需要创建队列管理,用来存放队列。有了队列管理器后,就可以创建队列;队列创建了,就可以用来放入和取出消息;
eg:创建一个名为QM_MEMDB的队列管理器:
crtmqm -q QM_MEMDB
>Directory '/var/mqm/qmgrs/QM_MEMDB' created.
所有创建的队列管理器在/var/mqm/qmgrs目录下都会有对应文件名的子目录生成;
(至于为什么是/var/mqm,这个配置在安装目录下的mq配置文件中配置samp/mqs.ini)
从这里我们可以确定,队列管理器的创建是一个持久化的操作,当MQ服务器停止后再启动时,队列管理器都还是存在的;
启动名为QM_MMEDB的队列管理器:
/opt/mqm/bin$./strmqm QM_MEMDB
>WebSphere MQ queue manager 'QM_MEMDB' started using V7.5.0.0.
(停止mq队列管理器:endmqm)
队列及消息属于MQ的对象,MQ的对象管理一般使用mqsc命令交互工具来管理;
对于创建队列的操作,最好先写好放在一个文件里,然后调用;
eg,我们在队列管理器QM_MEMDB中定义一个TEST1队列:
vi define_memdb.tst:
define qlocal (TEST1) DEFPSIST(YES) MAXDEPTH(150000)
然后调用mqsc来创建:
/var/mqm/sh$runmqsc QM_MEMDB < define_memdb.tst > out.txt
创建的结果信息输出到out.txt:
1 : define qlocal (TEST1) DEFPSIST(YES) MAXDEPTH(150000)
AMQ8006: WebSphere MQ queue created.
One MQSC command read.
No commands have a syntax error.
All valid MQSC commands were processed.
基本队列操作命令分成两类, 一类在 MQ Server 端运行, 它们是 amqsput、 amqsget、
amqsbcg。另一类在 MQ Client 端运行,它们是 amqsputc、amqsgetc、amqsbcgc
从Server端将消息放入队列的命令格式:
amqsput amqsput QueueName [QueueManagerName]
amqsput和 amqsputc 可以将消息放入队列中, 程序把之后的每一行标准输入作为一条独立的消息,读到 EOF 或空行时退出。注意,UNIX 上的 EOF 为 Ctrl+D。可以将标准输入重定向到文件。队列中每放入一条消息,队列深度增加一。
eg:
/var/mqm/sh$amqsput TEST1 QM_MEMDB
查看队列管理器QM_MEMDB中名为TEST1的队列:
/var/mqm/sh$amqsbcg TEST1 QM_MEMDB
amqsget 和 amqsgetc 可以将消息从队列中全部读出并显示。读空后再等待 15 秒,在这段时间内如果有新的消息到达会一并读出。强行中断该程序用 Ctrl+C 。amqsget 和 amqsgetc 执行后队列应该为空,即队列深度为零。
以上是单个服务器的单个队列管理器中完成的操作,如果需要跨队列管理器或跨机通信,我们需要MQ命令服务器和MQ监听器,当然,少不了建立通道;
WebSphere MQ 命令服务器是队列管理器的一个组件,用来对外来的命令消息进行解释和执行。在远程管理和编程管理的应用中,需要启动命令服务器。一个队列管理器最多只有一个命令服务器,缺省情况下在创建队列管理器时由系统一并创建。
启动与停止:
strmqcsv
endmqcsv
dspmqcsv
启动后执行下,观察状态,看到正在运行:
/opt/mqm/bin$dspmqcsv QM1
WebSphere MQ Command Server Status . . : Running
WebSphere MQ 中监听器也是队列管理器的一个组件,用来监听外来的连接请求并相应
地做出反应。监听器通常需要先配置,然后才能运行,配置参数与监听器选择的通信协议有关。当然,也可以在第一次启动监听器时将配置参数传入,隐式地进行配置。一个队列管理器可以有多个监听器,分别应用于不同的通信协议或同一协议的不同参数。比如 TCP/IP 的不同端口。
通道的配置和建立下面单独拿出来讲解;
over。
《精通 WebSphere MQ》本书讲解的MQ版本为5.3,有些老,不过操作命令都没有变化;逻辑清晰,还不错;涉及到MQ的新特性,比如发布/订阅方面,就不用看这本书了,转到参考2:
《Application Programming Reference MQV7》
2.Push Notification的iOS处理代码和Provider详解
3.Push Notification的移动客户端定位服务
正文:
PushNotification简介和证书说明及生成配置
一、推送通知,个人理解,指的是苹果公司通过服务器向设备终端推送信息的一种通知服务和功能。
整个推送过程涉及的对象和流程如下图(借用了一张广为流传的图):
简要说明:
(1)对象:整个过程涉及四个对象,Your App(开发的应用),iOS(设备系统),APNS Server(Apple Push Notification Service Server苹果推送通知服务的服务器),YourServer(本地服务器,常称为Provider)。
(2)流程:
1、应用程序注册消息推送。
2、iOS从APNS Server获取devicetoken,应用程序接收devicetoken。
3、应用程序将devicetoken发送给PUSH服务端程序。
4、服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
(3)关键词:AppID,ProvisioningProfile,DeviceToken,SSLCertificate,PrivateKey(请不要着急,看下文的证书说明和配置)
归纳一下:
第一步:应用程序通过设备向APNS注册,APNS返回设备和应用绑定生成的DeviceToken给应用程序
第二步: 应用程序在收到DeviceToken以后,发送给本地服务器,可由本地服务器存储和管理
第三步:本地服务器向APNS发送消息推送请求,APNS 根据请求中包含的证书信息和目标DeviceToken,找到已注册DeviceToken,并发送相应推送消息给应用程序
二、证书,这是作为一个苹果开发者首先要面对的问题。
个人理解,虽然与其他开发者相比,一开始折腾证书,会比较打击开发积极性,不过这确实是好东西。由于证书的存在,苹果开发者的权益才能得到保证,当然代价就是得付费,关于付费请查看开发者中心,说多了都是泪。
玩笑和废话过后,继续。
(1)先了解几个概念:
1. AppID 应用ID。你的每个iOS应用都有一个唯一标识,如同每个人的身份证号码
2. Provisioning Profile 配置文件。包含了一系列的配置信息,例如开发版本或者发布版本
3. DeviceToken 设备令牌。标识安装有某应用的目标设备
4. SSL Certificate 带有推送服务的证书(后缀”也”为.cer),供Provider向APNS发送推送请求使用
5. Private Key 随证书一起存在
(2)生成证书(请高度注意,一大波~~证书正在靠近):
提示:下文内容的前提是您已经在自己的开发者中心创建好了对应的AppID,添加好了用于测试的Devices(如果有需要的朋友,再说吧)
重点:创建的AppID名称不能带有通配符,否则不支持推送通知服务;并且配置里面需要开启PushNotification服务功能选项,有需要的,先去配置一下,或者重新创建吧
本地Mac机生成签名请求文件(.certSigningRequest)
1. 启动钥匙串访问程序,点击钥匙图标
2. 在菜单栏中依次选择:钥匙串访问⟶偏好设置⟶证书选项卡,下面两项全部选关闭
3. 生成证书请求:钥匙串访问⟶证书助理⟶从证书颁发机构请求证书
4. 输入两个电子邮件地址和常用名称
a) 建议输入你在苹果网站注册的邮箱和名称,其他的也行,CA地址可以不填
b) 选择“存储到磁盘”和“让我指定钥匙对信息”。保存后的名称应该为:CertificateSigningRequest.certSigningRequest(这是第一个)
c) 保存到磁盘后在你的钥匙串访问窗口应该会出两个密钥,一个公钥密钥,一个专用密钥,红色部分就是你在上面输入的常用名。
在自己的开发者中心生成开发者证书(.cer文件)
现在可以回头看看推送图解的时候,SSL Certificate也是为.cer文件,但是二者是不同的。
开发者证书是为xcode提供的,分为开发版(Development)和发布版(Distribution),使App可以在真机上测试(使用开发版)以及最后的发布(使用发布版);SSLCertificate是供推送服务的Provider使用的,当然也分上述两种,指定推送权限和目标设备及App。
好,继~额。。首先请确认你已经在开发者中心并且已经为你的App创建好了AppID
在Certificates中,为您的AppID创建新的证书(别说没有看到“+”这个加号),以开发者证书为例
上图要求的CSR file正是我们之前生成的签名请求文件,直接继续
接下来,您自己点生成,我就不继续了,免得浪费一个证书嘛,节约一下。。。
得到一个.cer证书文件(第二个),可以下载存储好
生成SSL Certificate 供Provider使用的推送通知证书
在AppID列表里,选择目标AppID,然后可以看到生成新证书的按钮
上图用的是公司的开发账号登陆,因为我的权限不足,看不到生成按钮 =_=
直接下一步,然后选择开发者证书,选择设备,就可以生成目标文件了,最后下载,命名中最好带有apns之类的以示区别。
得到一个apns***.cer证书文件(第三个)
ProvisioningProfiles配置文件生成
生成配置文件也是按照提示来就好,最后生成.mobileprovision文件(第四个)
至此,证书生成阶段完毕:
1. CertificateSigningRequest.certSigningRequest
2. 开发者证书.cer
3. Provider使用的SSL Certificate证书(带有apns命名的.cer)
4. .mobileprovision配置文件
三、本地Mac机配置
1. 打开钥匙串访问程序,在如下界面,将开发者证书和推送通知用的证书一起添加进“登陆”文件列表
(借了一张图如上)
注意红色线遮挡的那个证书,应该是有一个Private Key跟随的。
特别是apns**.cer证书,需要有一个专用密钥(Private Key),才能右键生成.p12文件。
如上句所述,生成一个推送需要使用的.p12文件。
在此,说明一下,这里生成的p12文件是供Provider推送消息时使用,这是由我采用的推送方式决定。也还有其他推送方式,可以采用.pem等证书,甚至当采用Mac环境下的推送服务器时,可以直接使用apns**.cer文件,在此不谈论了。
将Xcode的Target证书配置选项,置为开发者证书,配置文件选项置为新生成的配置文件,即可在真机上测试后续的推送通知功能。
本篇介绍就到这里了,后续将介绍iOS推送通知代码和本地服务器Provider的实现。