知识大全 使用JMS接口接入WebSphere MQ消息

Posted 消息

篇首语:当筵意气临九霄,星离雨散不终朝。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用JMS接口接入WebSphere MQ消息相关的知识,希望对你有一定的参考价值。

使用JMS接口接入WebSphere MQ消息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在你的应用程序中利用IBM WebSphere MQ消息中间件提供Java消息服务开放接口

  IBM WebSphere MQ(WMQ)是一套面向消息的中间件(message oriented middleware MOM) 通过使用消息和队列简化应用程序之间的通信 WMQ支持点到点的和发布/订阅消息 支持多种平台 包括Windows AIX HP UX和Sun Solaris 它特别适合目前的异构计算环境

  对于Java开发者而言 WMQ为Java应用程序提供了两种接口

   为Java提供MQ基础类 一个基于WMQ本地接口的Java接口

   MQ JMS Java消息服务(Java Messaging Service JMS) 接口的实现

  JMS通过开启Java应用程序发送和接收消息扩展了Java的互操作性 JMS应用程序可以使用点到点或发布/订阅模式进行消息交换

  本文描述的是使用WMQ和JMS进行开发的过程 重心集中在点到点消息 通过下面几步教你如何使用Java类编写JMS接口

   创建WMQ对象

   创建JMS管理对象

   解释JMS代码

   运行一个实例类发送消息和从WMQ接收消息

   WMQ安装

  本文使用的是winxp上的MQ 版本 (可以从下载试用版) 在windows上的安装是非常简单的 一路默认就可以完成安装

  如果你还没有使用过WMQ也不要担心 你可以使用基于Eclipse的WebSphere MQ管理器 它是一个简单的用于管理WMQ的图形工具

  创建MQ对象 队列管理器和队列

  队列是用来存储 target=_blank>存储消息的 直到应用程序处理完毕才释放 队列管理器拥有并管理队列 要创建一个队列管理器和队列 按以下步骤启动WebSphere MQ管理器 开始?所有程序? IBM WebSphere MQ ? WebSphere MQ Explorer 图 显示了启动WebSphere MQ管理器时的样子 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 WebSphere MQ 管理器

  在MQ管理器中执行下列操作创建一个队列管理器

   在导航视图下 右击 队列管理器 选择 新建 队列管理器 启动创建队列管理器向导

   在第一步中输入队列管理器的名字 TestMQ 点击 下一步 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 创建队列管理器 第一步 输入队列管理器名称

   在第二步和第三步都点击 下一步 进入第四步 确定选中了 创建一个TCP/IP监听器 然后输入一个未使用的端口号 点击 完成 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 创建队列管理器 第四步 检查队列管理器的监听器端口号

  接下来创建两个队列 IN QUEUE 和 OUT QUEUE 你就可以将消息写入IN QUEUE 从OUT QUEUE读取消息

   在TestMQ下 右击 队列 ? 新建 ? 本地队列 启动 新建本地队列 向导

   在名称区域 输入IN QUEUE 点击 完成 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 创建队列向导 输入队列名称 其它属性值保留默认值

   重复上面的步骤创建好队列OUT QUEUE

  创建JMS管理对象

  JMS定义了一个通用的接口来发送和接收消息 只要与之通信的程序兼容JMS即可 点到点的JMS接口是

   javax jms QueueConnection 这个接口提供一个到JMS提供程序的连接 用于创建会话对象

   javax jms QueueSession 这个接口为产生和消耗消息提供上下文呢 包括创建QueueSender和QueueReceiver的方法

   javax jms QueueSender 这个接口用于向队列发送消息 javax jms QueueReceiver用于从队列接收消息

  为了让你的代码可以在不同的消息提供程序间有良好的移植性 你必须在你的应用程序中使用javax jms中的标准JMS接口 所有特定厂家的信息都封装在javax jms QueueConnectionFactory 和 javax jms Queue中 这些管理对象可以使用厂家提供管理工具进行构建 存储在JNDI命名空间中 JMS应用程序可以从命名空间中检索这些对象 这时就不需要知道是哪个厂家提供的了

  按照下面的步骤使用Websphere MQ管理器创建管理对象 存储在基于文件的目录下

   在JMS 管理对象上点击右键?添加初始上下文

   在屏幕 上

  为 JNDI存储在哪里 选择 文件系统

  在关联目录处 输入C:\\JNDI Directory(前提是这个目录已经存在)

  注意工厂类和提供程序URL 因为你将会在Java代码中使用到(如图 所示) src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 添加初始上下文向导 你将在样例类中使用工厂类和提供程序URL

   你的管理器现在应该如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 添加初始上下文后的MQ管理器 你可以在MQ管理器中轻易地创建JMS管理对象

  在新的初始上下文中 创建一个连接工厂

   在连接工厂上点击右键?新建?连接工厂 在第一个屏幕上 在名称区域输入 TestQM_QCF 点击 下一步 在JNDI查找中你就使用TestQM_QCF了

   将类型设置为 队列连接工厂 点击 下一步 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 新建连接工厂向导 用于点对点消息的队列连接工厂

   保持传送类型为汇集 点击下一步 当WMQ和应用程序在同一机器上时使用汇集传输

   在下一页面点击下一步(无需修改设置)

   在最后一页 选择连接标签 点击 选择 按钮选择TestQM作为 基础队列管理器 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 新建连接工厂向导 连接工厂被包装为TestMQ

   点击 完成

  接下来创建目的地 对应WMQ消息的JMS管理对象

   在目的地上点击右键?选择 新建 ? 目的地

   在第一页上 在名字区域输入INInputTestQueue作为名字 确保类型设置为队列了 点击 下一步 如图 所示 src= //img educity cn/img_ / / / jpg border= ffan= done >

  图 新建目的地向导 使用InputTestQueue查找IN QUEUE

   第二页保持默认设置不变 点击 下一步

   在最后一页

  在队列管理器区域 点击 选择 按钮选择TestQM

  在队列区域 点击 选择 按钮选择IN QUEUE

   点击 完成

  重复上述步骤创建另一个目的地 OutputTestQueue 它对应OUT QUEUE

  理解示例类

  如果你编写过JMS应用程序 就很容易理解JNDIUtil 和 Tester示例类(从_JMSSource&Classes zip下载Java源文件和编译好的类) 你创建的JMS管理对象隐藏了所有厂家专利实现

  JNDIUtil类

  JNDIUtil包括使用名字通过JNDI查找检索对象的方法 参考清单 你可以使用这个类中的方法检索你在MQ管理器中定义的JMS对象的引用情况

  清单 JNDIUtil java

Code highlighting produced by Actipro CodeHighlighter (freeware) >package devx articles mqjms;  // JMS 类  import javax jms JMSException;  import javax jms Queue;  import javax jms QueueConnectionFactory;  // JNDI 类  import javax naming InitialContext;  import javax naming Context;  import javax naming NamingException;  // 标准 Java类  import java util Hashtable;  /**  *  * A wrapper class for JNDI calls  *  */  public class JNDIUtil    private Context context;  public JNDIUtil(String icf String url) throws JMSException NamingException    Hashtable environment = new Hashtable();  environment put(Context INITIAL_CONTEXT_FACTORY icf );  environment put(Context PROVIDER_URL url);  context= new InitialContext( environment );    /**  *  * @param ObjName Object Name to be retrieved  * @return Retrieved Object  * @throws NamingException  */  private Object getObjectByName(String ObjName) throws NamingException    return context lookup( ObjName );    /**  * A convenience method that returns QueueConnectionFactory objects (no casting required)  * @param factoryName QueueConnectionFactory JNDI name  * @return QueueConnectionFactory object  * @throws NamingException  */  public QueueConnectionFactory getQueueConnectionFactory(String factoryName) throws NamingException    return (QueueConnectionFactory) getObjectByName(factoryName);    /**  * A convenience method that returns Queue objects (no casting required)  * @param queueName  * @return  * @throws NamingException  */  public Queue getQueue(String queueName) throws NamingException    return (Queue) getObjectByName(queueName);    

  Tester类

  Tester类向OUT QUEUE中写入消息 从IN QUEUE中读取消息 参考清单

  清单 Tester java

Code highlighting produced by Actipro CodeHighlighter (freeware) > package devx articles mqjms;  //JMS 类  import javax jms Queue;  import javax jms QueueSession;  import javax jms QueueConnection;  import javax jms QueueConnectionFactory;  import javax jms JMSException;  import javax jms Session;  import javax jms QueueSender;  import javax jms QueueReceiver;  import javax jms TextMessage;  import javax jms Message;  //JNDI 类  import javax naming NamingException;  //标准 Java 类  /**  *  * A class to test JMS with IBM MQ  *  */  public class Tester    public static String icf = sun jndi fscontext RefFSContextFactory ;  public static String url = file:/C:/JNDI Directory ;  public static void main(String[] vars) throws JMSException NamingException    QueueSession session = null;  QueueConnection connection = null;  QueueConnectionFactory factory = null;  QueueSender queueSender = null;  QueueReceiver queueReceiver= null;  Queue oQueue = null; // 消息发送到的队列  Queue iQueue = null; // 接收消息的队列  try    JNDIUtil jndiUtil= new JNDIUtil(icf url);  factory= jndiUtil getQueueConnectionFactory( TestQM_QCF );  connection = factory createQueueConnection();  // 启动(或重新启动)入站消息的连接地址 如果没有这个调用消息不会被接收  connection start();  //表示一个非相互操作会话  boolean transacted = false;  session = connection createQueueSession( transacted Session AUTO_ACKNOWLEDGE);  oQueue= jndiUtil getQueue( OutputTestQueue );  queueSender = session createSender(oQueue);  TextMessage oMsg = session createTextMessage();  oMsg setText( );  // 你还可以设置其他消息属性  queueSender send(oMsg);  iQueue= jndiUtil getQueue( InputTestQueue );  queueReceiver = session createReceiver(iQueue);  Message iMsg = queueReceiver receive( );  if ( iMsg != null )  System out println( ((TextMessage)iMsg) getText() );  else  System out println( No messages in queue );    finally    //总是释放资源  if ( queueReceiver!= null )  queueReceiver close();  if ( queueSender!= null )  queueSender close();  if ( session!= null )  session close();  if ( connection!= null )    connection close();        

  开始点是连接工厂查找 这个工厂用于创建一个连接

Code highlighting produced by Actipro CodeHighlighter (freeware) >factory= jndiUtil getQueueConnectionFactory( TestQM_QCF );  connection = factory createQueueConnection();

  连接对象用于创建一个会话

Code highlighting produced by Actipro CodeHighlighter (freeware) > session = connection createQueueSession( transacted Session AUTO_ACKNOWLEDGE);

  要将消息写入IN QUEUE queue 查找前面创建的目的地对象OutputTestQueue

Code highlighting produced by Actipro CodeHighlighter (freeware) >oQueue= jndiUtil getQueue( OutputTestQueue );

  最后创建一个QueueSender对象将消息写入队列

Code highlighting produced by Actipro CodeHighlighter (freeware) >queueSender = session createSender(oQueue);TextMessage oMsg = session createTextMessage();oMsg setText( );queueSender send(oMsg);

  从OUT QUEUE读取消息的过程相同 但使用的是QueueReceiver

  编译运行示例类

  当你安装WMQ时会自动将编译和运行示例类需要的jar文件添加到CLASSPATH环境变量中 需要的jar文件位于C:\\Program Files\\IBM\\WebSphere MQ\\Java\\lib 包括JMS和JNDI需要的jar

  在运行Tester类之前 使用MQ管理器向IN QUEUE增加一条测试消息

   在 IN QUEUE上点击右键 选择放入测试消息

   输入任意文本 点击放入消息

  如果你还没有在IN QUEUE队列中放入过消息 Tester类会显示 队列中无消息

  要运行Tester类 将Tester class 和 JNDIUtil class添加到CLASSPATH 然后在命令提示符输入

Code highlighting produced by Actipro CodeHighlighter (freeware) > java devx articles mqjms Tester

  应用程序向OUT QUEUE写入一条消息 并显示从IN QUEUE检索到的消息 要检查发送到OUT QUEUE中的消息 进入MQ管理器 在OUT QUEUE上点击右键?选择 浏览消息 即可

  企业中的Java和WMQ MOM

cha138/Article/program/Java/JSP/201311/19679

相关参考

知识大全 WebSphere MQ传输环境搭建和测试

WebSphereMQ传输环境搭建和测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 我家是三层楼,原来每层都装了电话线和网线接口,以前户外接入的网线

我家是三层楼,原来每层都装了电话线和网线接口,以前户外接入的网线这是ADSL网络改造升级为光纤网络了,可以将光纤猫放在ADSL猫处,ADSL猫引出的网线肯定是家中的综合布线的汇接点,可以将光猫引出路由

知识大全 今日头条里的微信内容源接入是怎么弄,如何操作

今日头条里的微信内容源接入是怎么弄,如何操作,今日头条怎么没看到微信内容源接入1、在你准备授权同步的微信公众号,编辑一篇标题为《开通头条号》的单图文消息(无需群发)2、保存图文消息后,在“图文消息列表

知识大全 JBoss 4.0.2集群指南 建立JMS集群服务(图)

JBoss4.0.2集群指南建立JMS集群服务(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 用JMS客户端利用空闲的计算机资源

用JMS客户端利用空闲的计算机资源  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要  在企业

知识大全 一次WebSphere类加载问题的错误诊断

一次WebSphere类加载问题的错误诊断  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 webservice和软件接口有什么区别和联系吗

webservice和软件接口有什么区别和联系吗?webservice(SOAP)与HTTP接口的区别什么是webservice?soap请求是HTTPPOST的一个专用版本,遵循一种特殊的xml消息

知识大全 基于Spring框架的WebSphere应用开发

基于Spring框架的WebSphere应用开发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 WebSphere SAP适配器编程基础

WebSphereSAP适配器编程基础  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  介绍  从

知识大全 i7 4710mq对比i7 6500U哪个效能好。哪个办公好。哪个游戏好

i74710mq对比i76500U哪个效能好。哪个办公好。哪个游戏好?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶