zoukankan      html  css  js  c++  java
  • IBM WebSphere MQ介绍安装以及配置服务详解

    首先介绍一下MQ

        MQ消息队列的简称是一种应用程序对应用程序的通信方法。说白了也就是通过队列的方式来对应用程序进行数据通信。而无需专用链接来链接它们。

    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调用为输出打开一个队列

        3.应用程序使用MQPut调用将其数据放到队列上。

        4.调用MQOpen调用打开输入队列

        5.使用MQGet从队列上接收数据

    安装步骤。(此处为转载文章,作者已经证实所有步骤。)

    Windows下 WebSphere MQ
    服务端的安装:
    ( 1)把WebSphere MQ
    Windows版服务器CD-ROM插入CD-ROM驱动器。
    ( 2)如果安装了自动运行,那么会启动安装进程。如果不启动,则双击CD-ROM上的根目录中的Setup图标以启动安装程序。
    (3)请等待,直到出现"WebSphere MQ
    安装启动板"窗口为止。
    (4)如果需要更改安装的本地语言,单击"选择语言"图标,然后从列表中选择所需的语言。
    (5)选择必备软件选项。
    选择典型安装后,安装界面上的每个安装项右边有一个对钩号(表示已安装),反之则为一个叉号(表示还没有安装,如果要装 MQ,则必须先把这些软件装好)。
    如果出现了叉号:
    1)单击项目左边的 "+"号以显示安装连接;
    2)选择要使用的安装源的选项,从以下各项选择:
    • WebSphere MQ CD
    • 因特网
    • 网络


     

    ( 6)安装完成时,单击项目左边的"-"符号。
    注意:对于定制安装,可能不需要所有的必备软件。
    ( 7)安装完所有的必备软件,然后选择"网络先决条件"选项。
    ( 8)选择"WebSphere
    MQ"安装选项 

    (9)选择启动WebSphere
    MQ安装程序,然后等待,直到显示了带有欢迎信息的"WebSphere MQ安装"窗口为止。

    (10)单击"下一步"按钮继续。

    (11)阅读面板上的信息和许可证条款,选择接受,然后单击"下一步"。

    (12)如果机器上未安装过此产品的前一个版本,则显示"安装类型"面板。选择希望的安装类型(一般选择"典型"安装即可),然后单击"下一步"按钮。

    (13)"WebSphere
    MQ安装"窗口显示"安装WebSphere MQ就绪"信息。该窗口还显示用户选中的安装摘要,单击"安装"开始正式安装。

    ( 14)成功安装WebSphere
    MQ后,"WebSphere MQ安装"窗口显示以下信息:安装向导成功完成。
    ( 15)单击"完成"按钮启动"准备WebSphere
    MQ"向导。
    安装图示


     


     


     


     


     

     

     


     


     


     


     


     


     


     


     

     

     


     


     


     

    应用分析


     

    该章节主要内容包括MQ服务端的基本配置,如队列管理器,队列以及通道的建立,
    且包含JAVA实现的客户端程序。由此构成一个完整的客户端-服务器的流程。


     

     
    服务端配置


     

    1)点 "开始"->"所有程序"->"IBM
    WebSphere MQ"->"WebSphere MQ 资源管理器",进入WebSphere MQ
    资源管理器界面。如下图所示:


     


    图9
    服务端配置


     

    2)创建名为 "QM_JACK"的队列管理器


     

    <1>选中 "队列管理器"->"新建"->"队列管理器",如下图所示:


     


    图10 创建名为"QM_JACK"的队列管理器


     

    <2>在队列管理中输入 "QM_JACK",其他选项默认不变,点"下一步":


     


    图11 在队列管理中输入"QM_JACK"


     

    <3>设置队列日志(本步骤采用系统默认设置),点 "下一步":


     


    图12
    设置队列日志


     

    <4>启动队列管理器,创建服务器连接通道,允许在 TCP/IP上进行队列管理器的远程管理,点击"下一步":


     


    图13 创建服务器连接通道


     

    <5>设置队列管理器 QM_JACK的侦听端口:8927(用户可以根据需要自行更改端口号),点击"完成"。


     


    图 14
    设置队列管理器QM_JACK的侦听端口


     

    <6>系统进入等待界面:


     


    图 15
    系统等待界面


     

    <7>队列管理器 QM_JACK创建成功


     


    图 16
    系统队列管理器QM_JACK创建成功


     

    3)在 QM_JACK下创建名为"QUEUE_RECV"和"QUEUE_REPLY"的本地队列(客户可以根据自己的需求随意更改本地队列的名字和数量,这里创建这两个本地队列只是为之后的MQ_Tuxedo项目作准备):


     


    图17 定义本地队列



    图18 定义本地队列
    设置队列名后其他属性全为系统默认值,点击 "确定"。
    4)在 QM_JACK下创建名为"CNN_JACK"的服务器通道。
    图 19
    创建服务器连接通道


    图20 创建服务器连接通道
    通道名称设为 CNN_JACK,其他选项保留为系统默认设置,点击"确定"。
    5)在 MQ服务器端的计算机用户中添加MQ客户端所在计算机的系统用户。比如我的MQ客户端被Suse
    Linux下的root用户使用,那么,我们就需要在MQ的服务端(也就是Windows
    xp系统中添加名为"root"的用户)所在的计算机系统中添加名为"root"的用户。具体步骤如下:
    <1>点击 "开始"->"控制面板"->"计算机管理"->"系统工具"->"本地用户和组"->"用户",点右键,选"新用户",如下图所示:

    图21
    创建系统用户


     

    <2>创建新用户: root(注意:这里的用户名"root"是MQ客户端所在系统的用户名,用户要根据具体情况进行修改)


    图22 创建系统用户

    随意设置一个有效密码,选中密码永不过期,点击 "创建"。
    <3>将新用户加入 mqm组(注意:这里的mqm组是我们安装完MQ
    Server后系统自动创建的)。具体操作如下:

    图23
    设置系统用户所在组

     
    点击 "属性":
    图24 设置系统用户所在组
    点击 "添加":


    图25
    设置系统用户所在组

    输入对象名称: mqm,点击"确定":

    图26 设置系统用户所在组
    root用户被添入 mqm组中:


    图27 设置系统用户所在组

     

    点击 "应用",点击"确定"。
    重启机器。至此, MQ服务端的配置完成。
     
    客户端实现   JAVA客户端源码
     
    复制代码
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.Properties;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import com.ibm.mq.MQC;
    import com.ibm.mq.MQEnvironment;
    import com.ibm.mq.MQException;
    import com.ibm.mq.MQGetMessageOptions;
    import com.ibm.mq.MQMessage;
    import com.ibm.mq.MQQueue;
    import com.ibm.mq.MQQueueManager;
    
    /**
     * 函数功能: MQjava客户端实现
     */
    
    public class MQClient {
    
        /**
         * Logger for this class
         */
        private static final Log logger = LogFactory.getLog(MQClient.class);
        private String strExtraSendXmlFileName = "D:\jndi.properties";
        private static Properties props;
    
        static {
        props = new Properties();
        props.put("mqHostName", "139.31.89.67");
        props.put("mqPort", "4032");
        props.put("mqCCSID", "1381");
        props.put("mqUserName", "liujx");
        props.put("mqPassword", "linux");
        props.put("mqQManager", "Monitor_Queue_Manager");
        props.put("mqChannel", "Monitor_Conn_Chanel");
        props.put("mqLocalOutQueue", "Q_RECEIVE");
        props.put("mqLocalInQueue", "Q_RECEIVE");
    
        }
    
        /**
         * 
         * 函数功能:TODO 主测试方法 <br>
         * 相关参数: <br>
         * 
         * @param args
         *            修改记录: <br>
         */
    
        public static void main(String[] args) {
    
        MQClient test = new MQClient();
        // 发送消息
        test.putMsg();
        // 接收消息
        test.getMsg();
        }
    
        public void putMsg() {
        // MQ发送数据
        try {
            // 建立MQ客户端应用上下文环境
            MQEnvironment.hostname = props.getProperty("mqHostName");
            MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
            MQEnvironment.CCSID = Integer
                .parseInt(props.getProperty("mqCCSID"));
            MQEnvironment.channel = props.getProperty("mqChannel");
            MQEnvironment.userID = props.getProperty("mqUserName");
            MQEnvironment.password = props.getProperty("mqPassword");
            // 连接队列管理器
            MQQueueManager qMgr = new MQQueueManager(
                props.getProperty("mqQManager"));
            int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
            // 打开队列
            MQQueue q = null;
            try {
            q = qMgr.accessQueue(props.getProperty("mqLocalOutQueue"),
                openOptions);
            } catch (MQException me) {
            System.out.println("打开队列出现通讯异常" + me.getMessage() + "
    ");
            return;
            }
            InputStream fins = new FileInputStream(new File(
                strExtraSendXmlFileName));
            byte[] data = new byte[fins.available()];
            fins.read(data);
            fins.close();
            MQMessage msg = new MQMessage();
            msg.write(data);
            // 放入消息
            q.put(msg);
            System.out.println("客户端发送数据包成功..");
            // 关闭队列
            q.close();
            // 断开队列管理器连接
            qMgr.disconnect();
        } catch (MQException e) {
            if (logger.isDebugEnabled())
            logger.debug(e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            if (logger.isDebugEnabled())
            logger.debug(e.getMessage());
            e.printStackTrace();
        }
        }
    
        /**
         * 
         * 函数功能:TODO 获取数据 <br>
         * 修改记录: <br>
         */
        public void getMsg() {
        // MQ接收数据
        try {
            // 建立用上下文环境
            MQEnvironment.hostname = props.getProperty("mqHostName");
            MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
            MQEnvironment.CCSID = Integer
                .parseInt(props.getProperty("mqCCSID"));
            MQEnvironment.channel = props.getProperty("mqChannel");
            MQEnvironment.userID = props.getProperty("mqUserName");
            MQEnvironment.password = props.getProperty("mqPassword");
            // 建立队列管理器
            MQQueueManager qMgr = new MQQueueManager(
                props.getProperty("mqQManager"));
            int openOptions = MQC.MQOO_INPUT_AS_Q_DEF
                | MQC.MQOO_FAIL_IF_QUIESCING;
            // 打开队列
            MQQueue q = qMgr.accessQueue(props.getProperty("mqLocalInQueue"),
                openOptions);
            MQGetMessageOptions mgo = new MQGetMessageOptions();
            mgo.options |= MQC.MQGMO_NO_WAIT;
            // 构造返回消息
            MQMessage msg = new MQMessage();
            if ((msg = fetchOneMsg(q)) != null) {
            byte[] xmlData = new byte[msg.getDataLength()];
            msg.readFully(xmlData);
            logger.info(new String(xmlData));
            System.out.println("接收服务器端返回数据包成功..
    接收数据为:
    "
                + new String(xmlData));
            }
            // 关闭队列
            q.close();
            // 断开队列管理器
            qMgr.disconnect();
        } catch (MQException e) {
            logger.error(e);
            e.printStackTrace();
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
        }
    
        /**
         * 
         * 函数功能:TODO 从队列中取出消息 <br>
         * 相关参数: <br>
         * 
         * @param q
         * @return
         * @throws Exception
         *             修改记录: <br>
         */
        private static MQMessage fetchOneMsg(MQQueue q) throws Exception {
        MQGetMessageOptions mgo = new MQGetMessageOptions();
        mgo.options |= MQC.MQGMO_NO_WAIT;
        MQMessage msg = new MQMessage();
        try {
            // 获取消息
            q.get(msg, mgo);
        } catch (MQException e) {
            return null;
        }
        return msg;
        }
    }
    复制代码
     

    出处:https://www.cnblogs.com/swugogo/p/5917677.html

  • 相关阅读:
    数据库规范化与经典三范式
    左右两个下拉框里的内容互换
    利用创造元素的方法进行下拉框内容的添加
    数组除重和应用随机数进行随机点名
    for 语句练习
    super和this
    linux常用命令
    g​e​t​A​t​t​r​i​b​u​t​e​和​g​e​t​P​a​r​a​m​e​t​e​r​区​别
    HTTP 方法:GET 对比 POST
    sql语句中字符串类型的变量前后需要使用单引号
  • 原文地址:https://www.cnblogs.com/mq0036/p/9473848.html
Copyright © 2011-2022 走看看