MQ队列管理器—双向通道的创建
基于公有云的RabbitMQ双向数据同步方案

基于公有云的RabbitMQ双向数据同步方案一、测试环境阿里云MQ:172.16.130.204(master) / 172.16.128.63(slave)微软云MQ:172.16.192.9(master) / 172.16.192.28(slave)同步组件:RabbitMQ federation-upstream同步方式:双向同步二、方案目标及介绍验证基于不同公有云的数据中心,支持MQ消息队列的业务数据同步方案。
下面配置按先后顺序,分别在阿里云MQ节点和微软云MQ节点进行配置,完成后实现两地消息生产者产生消息会在本地留存一份,并立即转发到对端(各自上游MQ节点),使两地消费者可以及时读取全部消息。
三、阿里云MQ1.创建federation-upstreamURL:amqp://admin:************.192.9(定义上游为微软云香港MQ节点)Reconnect Delay:5sAck mode:on-confirm目的是将上游的微软云香港MQ节点收到的信息,推送到当前MQ节点(下游)。
2.创建exchange3.创建queue4.绑定exchange、queue5.创建policy这条策略是为了在当前阿里云MQ,匹配所有以dual开头的exchange、queue,按federation-upstream定义执行。
策略配置完成即生效,Federation会自动在上游微软云MQ节点完成下列操作:a.创建同名交换器dual.exchangeb.创建federation类型交换器:federation: dual.exchange -> rabbit@iz2zegotcocceakkehlbi3z Bc.创建同名队列dual.queued.创建federation类型队列:federation: dual.exchange -> rabbit@iz2zegotcocceakkehlbi3ze.绑定dual.exchange和federation类型交换器f.绑定federation类型交换器和federation类型队列g.配置federation类型队列的消费者:阿里云MQ节点6.检查连接状态阿里云端MQ的federation中,同步策略运行正常微软云香港MQ的connections中,阿里云MQ服务器已连接成功。
MQ本机实现两个队列管理器消息传递

MQ本机实现两个队列管理器消息传递之一2010年09月07日14:02 来源:百度空间作者:javashmily 编辑:李倩评论:0条本文Tag:IBM Websphere【IT168 技术】首先在IBM WebSphere MQ资源管理器中建立“队列管理器”、“队列”、“通道”等然后编写程序实现把消息put到队列中,再get出来。
1、创建发送端的队列管理器send2、创建发送方的本地队列Q1注意:用法要改成“传输”3、创建远程队列Q2远程队列:Q2远程队列管理器:recieve ,下面我会创建名称为recieve 的队列管理器传输队列:Q14、创建“发送方通道”名称为“C.TO.S“注意:连接名称写目的地的IP 因为我在本机做测试,所以用127.0.0.1 ,1416为远程队列管理器的port5、创建“服务器连接通道”名称为CLIENT6、创建“远程队列管理”名称为recieve(接收方)7、创建接收方的本地队列 Q2 注意Q2要和发送方的远程队列名字相同8、创建“接收方通道”名称要与发送方的发送通道相同。
为“C.TO.S”9、创建接收方的“服务器连接通道”名称为"SERVER"10、想远程队列中放入一个测试消息,在接收方的本地队列中浏览消息,若能看到则成功。
MQ本机实现两个队列管理器消息传递之二2010年09月07日14:21 来源:百度空间作者:javashmily 编辑:李倩评论:0条本文Tag:IBM Websphere Java【IT168 技术】在《MQ本机实现两个队列管理器消息传递之一》当中,描述了如何对队列进行队列和配置,本片将放出一段完整的Java代码以供大家参考。
1import java.io.EOFException;2import java.io.IOException;34import com.ibm.mq.MQC;5import com.ibm.mq.MQEnvironment;6import com.ibm.mq.MQException;7import com.ibm.mq.MQGetMessageOptions;8import com.ibm.mq.MQMessage;9import com.ibm.mq.MQPutMessageOptions;10import com.ibm.mq.MQQueue;11import com.ibm.mq.MQQueueManager;1213public class Test {1415/**16* @param args17*/18public static void main(String args[]) {19 Test t = new Test();20 t.putMsg();21 t.getMsg();22 }2324private MQQueue mqQueue;25private MQQueueManager qMgr = null;26public void getMsg() {27// 接收方主机名28 String hostName = "192.168.0.16";29// 接收方服务器连接通道30 String channel = "SERVER";31// 接收方队列名称32 String qManager = "recieve";33// 接收方接收的本地队列34 String qName = "Q2";35 MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,MQC.TRANSPO RT_MQSERIES);36 SID = 1381;37 MQEnvironment.hostname = hostName;38 MQEnvironment.channel = channel;39 MQEnvironment.port = 1416;40try {41 qMgr = new MQQueueManager(qManager);42 System.out.println("成功连接QueueManager");43int openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUI ESCING;44 mqQueue = qMgr.accessQueue(qName, openOptions);45 MQGetMessageOptions gmo = new MQGetMessageOptions();46 gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;47 gmo.options = gmo.options + MQC.MQGMO_WAIT;48 gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;49 gmo.waitInterval = 3000;50 MQMessage inMsg = new MQMessage();51 mqQueue.get(inMsg, gmo);52 String msg = inMsg.readString(inMsg.getMessageLength());53 System.out.println("this message is " + msg);54 mit();55 } catch (EOFException e) {56 e.printStackTrace();57 } catch (MQException e) {58 e.printStackTrace();59 } catch (IOException e) {60 e.printStackTrace();61 } finally {62try {63if (mqQueue != null) {64 mqQueue.close();65 System.out.println("成功关闭Queue");66 }67if (qMgr != null) {68 qMgr.close();69 qMgr.disconnect();70 System.out.println("成功关闭、断开QueueManager");71 }72 } catch (MQException ex) {73 }74 }75 }767778public void putMsg() {79 MQQueueManager qMgr = null;80try {81// 源方主机名82 String hostName = "192.168.0.16";83// 源方服务器连接通道84 String channel = "CLIENT";85// 源方队列管理器86 String qManager = "send";87// 远程队列管理器定义远程队列管理器为recieve ,远程队列为Q288 String qName = "Q2";89 MQEnvironment.hostname = hostName;90 MQEnvironment.channel = channel;91 SID = 1381;92 MQEnvironment.port=1415;93 MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,MQC.TRANSP ORT_MQSERIES);94 MQEnvironment.disableTracing();95 MQException.log = null;96// 连接到队列管理器97 qMgr = new MQQueueManager(qManager);98 System.out.println("成功连接QueueManager");99int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING; 100 mqQueue = qMgr.accessQueue(qName, openOptions);101 MQPutMessageOptions mpmo = new MQPutMessageOptions();102 MQMessage mqMessage = new MQMessage();103 mqMessage.writeString(new java.util.Date().toString());104 mqQueue.put(mqMessage, mpmo);105 } catch (MQException ex) {106 System.out.println("Error Code : " + ex.reasonCode);107 ex.printStackTrace();108 } catch (java.io.IOException ex) {109 ex.printStackTrace();110 } finally {111try {112if (mqQueue != null) {113 mqQueue.close();114 System.out.println("成功关闭Queue");115 }116if (qMgr != null) {117 qMgr.close();118 qMgr.disconnect();119 System.out.println("成功关闭、断开QueueManager"); 120 }121 } catch (MQException ex) {122 }123 }124 }125 }。
IBM MQ

MQ中有几个很重要的组件:队列管理器(QueueManager)、队列(Queue)和通道(Channel)。
其基本的操作方法如下:创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器,可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p QmgrName 强制停止显示队列管理器dspmq –m QmgrName运行MQSeries命令runmqsc QmgrName如果是默认队列管理器,可以不带其名字往队列中放消息amqsput QName QmgrName如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字从队列中取出消息amqsget QName QmgrName如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字启动通道runmqchl –c ChlName –m QmgrName启动侦听runmqlsr –t TYPE –p PORT –m QMgrName停止侦听endmqlsr -m QmgrNameMQSeries命令定义死信队列DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE设定队列管理器的死信队列ALTER QMGR DEADQ(QNAME)定义本地队列DEFINE QL(QNAME) REPLACE定义别名队列DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)远程队列定义DEFINE QREMOTE(QRNAME) +RNAME(AAA) RQMNAME(QMGRNAME) +XMITQ(QTNAME)定义模型队列DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN)定义本地传输队列DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +INITQ(SYSTEM.CHANNEL.INITQ)+PROCESS(PROCESSNAME) REPLACE创建进程定义DEFINE PROCESS(PRONAME) +DESCR(‘STRING’)+APPLTYPE(WINDOWSNT)+APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’)其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等创建发送方通道DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR 和CLUSRCVR。
IBM MQ队列通道创建配置图示

IBM MQ队列通道创建配置图示一:发送方服务器配置1.1:创建建队列管理器选定队列管理器:点击右键――新建――队列管理器输入:队列管理器名称:L01(可任意定义)点击下一步,下一步,日志路径可以更改在侦听端口处输入端口号:1422(可任意定义)** 输入的时候要记住这个端口号(继续看下去,你就知道这个端口号有很大作用)点击完成,创建成功后,刷新队列管理器,看到新建的队列名称L01 1.2:创建本地队列点击L01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好:本地队列LQ 011.3:创建本地传输队列:点击TQ01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”用法下拉框中选择:传输在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好,传输队列TQ011.4:创建远程队列:点击TQ01--队列-右键-新建-远程队列定义输入远程队列名称:RQ01选择“缺省持久性:持久,作用域:队列管理器”远程队列名称处:输入将要接收的远程队列管理器的本地队列名称)(LQ02)远程队列管理器名称:输入将要接收的远程队列管理器的名称(R01)传输队列名称:选择本地刚才新建的传输队列名称:TQ011.5:创建发送通道:点击TQ01--高级-通道-发送方通道输入发送方通道名称,LD01连接名称处:输入:将要接收的远程队列所在的服务器的IP及端口传输队列绑定:本地的传输队列(TQ01),点击确定,创建好发送通道LD011.6:创建接收通道点击TQ01--高级-通道-接收方通道,输入接收方通道名称就OK到这里:发送方服务器配置就Ok了。
二:接收方服务器配置---------------------------------------------------------2.1 创建队列管理器队列管理器名称:R01(可任意定义)点击下一步,下一步,日志路径可以更改在侦听端口处输入端口号:1422(可任意定义)输入的时候要记住这个端口号,点击完成2.2 创建本地队列点击R01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好:本地队列LQ 02到这里接收方的服务器配置就OK好了。
mq的使用场景和步骤

mq的使用场景和步骤MQ(Message Queue)是一种异步通信模式,在分布式系统中被广泛应用。
它将消息从一个应用程序传递到另一个应用程序,可以解耦应用程序之间的直接依赖关系。
MQ的使用场景:1. 异步任务处理:可以将耗时的任务放在消息队列中处理,提高系统的并发能力和响应速度。
2. 应用解耦:不同的应用之间可以通过消息队列进行解耦,提高系统的可伸缩性和可维护性。
3. 数据同步:可以将不同系统之间的数据同步操作通过消息队列进行异步处理。
4. 流量削峰:在大并发请求下,可以通过消息队列来控制系统的流量,避免系统崩溃或过载。
5. 日志处理:将日志消息发送到消息队列,然后通过消费者处理和存储,以降低日志系统的压力。
MQ的使用步骤:1. 安装和配置MQ系统:选择适合自己系统的MQ软件,如RabbitMQ、Kafka等,并进行相应的安装和配置。
2. 创建消息队列:在MQ系统中创建一个或多个消息队列,用于存储消息。
3. 发送消息:生产者将要发送的消息发送到消息队列中。
4. 接收消息:消费者监听(或订阅)消息队列,当有消息到达时,消费者接收并处理消息。
5. 处理消息:消费者处理接收到的消息,根据业务需求进行相应的处理逻辑。
6. 确认消息:当消费者成功处理一条消息后,向MQ系统发送确认消息,表示这条消息已经被处理完成。
7. 监控和调优:根据实际情况监控MQ的性能指标,进行性能调优以提高系统的稳定性和可靠性。
需要注意的是,不同的MQ系统可能会有一些细微的差别,具体的使用步骤可能会有所不同。
因此,在使用特定MQ系统之前,应该详细了解该MQ系统的使用文档和实践经验。
IBM MQ入门

IBM WMQ1.技术介绍1.1. 总体介绍消息队列(MQ)是一种应用程序对应用程序的通信方法。
应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
排队指的是应用程序通过队列来通信。
队列的使用除去了接收和发送应用程序同时执行的要求。
IBM WebSphere MQ 产品支持应用程序通过不同组件如处理器、子系统、操作系统以及通信协议的网络彼此进行通信。
例如,IBM WebSphere MQ 支持35 种以上的不同操作系统。
IBM WebSphere MQ 支持两种不同的应用程序编程接口:Java 消息服务(JMS)和消息队列接口(MQI)。
在IBM WebSphere MQ 服务器上,JMS 绑定方式被映射到MQI。
如图所示,应用程序直接与其本地队列管理器通过使用MQI 进行对话,MQI 是一组要求队列管理器提供服务的调用。
MQI 的引人之处是它只提供13 次调用。
这意味着对于应用程序编程员它是一种非常易于使用的接口,因为大部分艰苦工作都将透明完成的。
1.2. 术语定义2.安装2.1. 下载最新版本:7.0.1.3有多个版本:linux_32,linux_64,linux_win2.2. 硬件环境2.3. 安装上传文件到相关目录,CZJ3YML.tar.gz输入1安装后会自动创建系统用户及用户组:mqm 程序安装目录:/opt/mqm数据相关目录:/var/mqmJava相关jar包:/opt/mqm/java/lib后续操作用mqm用户操作2.4. 卸载1.用root帐号登录系统2.停止所有队列管理器//查看正在运行的队列管理器dspmq//停止所有跟队列管理器相关的监听程序,注意:QueueManagerName是队列队列管理器名称,具体名称用命令dspmq查询endmqlsr -m QueueManagerName//停止所有正在运行的队列管理器endmqm QueueManagerName3. //确认所有跟MQ有关的进程都已经停止ps -ef | grep mq4.//查看安装了那些相关的包rpm -q -a | grep MQSeries//一次性删除所有安装的包,以下命令只是一个示例,命令后面的包名称是命令“rpm -q -a | grep MQSeries” //查询所得的所有包名称,包名之间用空格分隔,rpm -ev MQSeriesRuntime-6.0.0-0 MQSeriesServer-6.0.0-0 MQSeriesServer-6.0.0-05.删除用户userdel mqm6.删除文件rm -rf /opt/mqm/rm -rf /var/mqm/7.重启主机2.5. 重新启动MQ3、启动服务启动命令服务器:非必须启动侦听器:验证队列管理器和侦听器在两台计算机上运行,然后启动通道:3.配置配置过程包括以下几个步骤:1.创建队列管理器。
IBMWebSphereMQ安装及配置详解

IBMWebSphereMQ安装及配置详解1. 打开MQ安装程序,选择下⼀步,默认安装WebSphere MQ,2. 完成MQ的安装⼯作,启动WebSphere MQ,3. 服务器配置,选择新建队列管理器,创建名为 "mq"的队列管理器,其他选项默认不变,点"下⼀步"4. 允许在 TCP/IP上进⾏队列管理器的远程管理,点击"下⼀步",完成MQ队列管理器的创建。
5. 新建本地队列,在mq下创建名为"MQ_send"的本地队列(⽤户可以根据⾃⼰的需求更改本地队列的名字和数量),其他选项默认即可。
6. 在 mq下创建名为"MQ_CHL"的服务器通道,其他选项默认即可。
7. 在MQ服务器端的计算机⽤户中添加MQ客户端所在计算机的系统⽤户。
例如:我的MQ客户端所在的计算机⽤户名为Administrator,则在服务器端系统中添加名为"Administrator"的⽤户。
具体步骤如下:<1>点击"开始"->"控制⾯板"->"管理⼯具"->"计算机管理"->"本地⽤户和组"->"⽤户",选择Administrator点右键,打开属性⾯板,选择“⾪属于”把mqmt添加进去。
如下图所⽰:(如果客户端计算机使⽤的其他的⽤户名,在服务器端新建⼀个⽤户名,同样操作,把⽤户名添加⾪属于mqm组⾥⾯)注意:1. 客户端连接MQ服务出现2035错误MQRC_NOT_AUTHORIZED2.找到mq的安装⽬录下的bin⽬录,在cmd环境下执⾏命令runmqsc 然后执⾏命令 alter qmgr chlauth(disabled) 把权限验证下掉就可以了,如下图所⽰:3. MQ常⽤命令:登录MQI,⼀般是cd到MQ安装⽬录下bin,然后切换mqm账户,mqm账户是mq默认的管理员账户。
IBM MQ队列通道创建配置图示

IBM MQ队列通道创建配置图示一:发送方服务器配置1.1:创建建队列管理器选定队列管理器:点击右键――新建――队列管理器输入:队列管理器名称:L01(可任意定义)点击下一步,下一步,日志路径可以更改在侦听端口处输入端口号:1422(可任意定义)** 输入的时候要记住这个端口号(继续看下去,你就知道这个端口号有很大作用)点击完成,创建成功后,刷新队列管理器,看到新建的队列名称L01 1.2:创建本地队列点击L01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好:本地队列LQ 011.3:创建本地传输队列:点击TQ01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”用法下拉框中选择:传输在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好,传输队列TQ011.4:创建远程队列:点击TQ01--队列-右键-新建-远程队列定义输入远程队列名称:RQ01选择“缺省持久性:持久,作用域:队列管理器”远程队列名称处:输入将要接收的远程队列管理器的本地队列名称)(LQ02)远程队列管理器名称:输入将要接收的远程队列管理器的名称(R01)传输队列名称:选择本地刚才新建的传输队列名称:TQ011.5:创建发送通道:点击TQ01--高级-通道-发送方通道输入发送方通道名称,LD01连接名称处:输入:将要接收的远程队列所在的服务器的IP及端口传输队列绑定:本地的传输队列(TQ01),点击确定,创建好发送通道LD011.6:创建接收通道点击TQ01--高级-通道-接收方通道,输入接收方通道名称就OK到这里:发送方服务器配置就Ok了。
二:接收方服务器配置---------------------------------------------------------2.1 创建队列管理器队列管理器名称:R01(可任意定义)点击下一步,下一步,日志路径可以更改在侦听端口处输入端口号:1422(可任意定义)输入的时候要记住这个端口号,点击完成2.2 创建本地队列点击R01--队列-右键-新建-本地队列输入本地队列名称,选择“缺省持久性:持久,作用域:队列管理器”在触发器属性页处,选择:触发器控制:打开,绑定触发器名称点击确定,新建好:本地队列LQ 02到这里接收方的服务器配置就OK好了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建接收方通道:define channel(TO.TEST.R) chltype(rcvr) trptype(tcp)
在一台PC(win7)创建两个队列管理器,实现两者通信
首先是创建两个队列管理器
1. QM1:TEST_QM
2. QM2:TEST_RQM
crtmqm-q TEST_QM
crtmqm-q TEST_RQM
队列管理器QM1:TEST_QM
队列名
队列属性
DATA
本地队列
define qlocal(DATA)
define qremote(REMOTE.DATA) rname(DATA) rqmname(TEST_QM) xmitq(TEST)
TEST
传输队列
define qlocal(TEST) usage(xmitq)
创建对TEST_QM的监听:define listener(DATA.LISTENER) trptype(tcp) control(qmgr) port(1418)
创建接收方通道:define channel(TO.TEST) chltype(rcvr) trptype(tcp)
队列管理器QM2:TEST_QM2
队列名
队列属性
DATA.R
本地队列
define qlocal(DATA.R)
REMOTE.DATA
远程队列
指向队列:DATA指向队列管理器:TEST_QM
注意事项:
1. QM1和QM2的通道名称要一致,当然QM1和QM2可以互为发送方,因此本例中有两条通道;
2. QM1的监听端口号要与QM2的通道端口一致,如果QM2到QM1有多条发送通道,那QM1要相应匹配地创建相同数目的监听
创建对TEST_RQM的监听(tcp) control(qmgr) port(1417)
创建发送方通道:define channel(TO.TEST.R) chltype(sdr) conname('127.0.0.1(1418)') xmitq(TEST.R) trptype(tcp)
REMOTE.DATA.R
远程队列
指向队列:DATA.R指向队列管理器:TEST_RQM
define qremote(REMOTE.DATA.R) rname(DATA.R) rqmname(TEST_RQM) xmitq(TEST.R)
TEST.R
传输队列
define qlocal(TEST.R) usage(xmitq)