如何在Wildfly上搭建Ibm mq的消息队列

原创 2013年12月06日 09:45:10

说到Ibm mq消息队列,我想用过WebSphere服务器的人都不陌生,也能很熟练的在Was上配置一个队列服务,但是如何在Wildfly(Jboss前身)上配置Ibm mq的消息队列,网上给的资料也少,笔者了解过Wildfly内置的消息中间件是Hornetq,要想在Wildfly应用服务器上使用mq消息中间件,那还得做些配置,下面笔者来介绍下如何在Wildfly上搭建ibm mq消息队列。

步骤一:下载wmq.jmsra-7.0.1.3.rar,放到wildfly安装目录standalone/deployments下面;

步骤二:更改standalone目录下standalone-full.xml的配置,找到如下标签<subsystem xmlns="urn:jboss:domain:resource-adapters:2.0"/>,在标签下添加如下配置:

<subsystem xmlns="urn:jboss:domain:resource-adapters:2.0">
            <resource-adapters>
                <resource-adapter id="wmq.jmsra-7.0.1.3.rar">
                    <archive>
                        wmq.jmsra-7.0.1.3.rar
                    </archive>
                    <transaction-support>NoTransaction</transaction-support>
                    <connection-definitions>
                        <connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl" jndi-name="java:jboss/ManagedConnectionFactoryImpl" enabled="true" pool-name="ManagedConnectionFactoryImpl">
                            <config-property name="port">
                                1420
                            </config-property>
                            <config-property name="hostName">
                                127.0.0.1
                            </config-property>
                            <config-property name="channel">
                                CHANNEL1
                            </config-property>
                            <config-property name="CCSID">
                                1208
                            </config-property>
                            <config-property name="queueManager">
                                APPDEV01_QM
                            </config-property>
                            <security>

                              <!--不用身份验证,也就不需要在WildFly上添加application的user用户-->
                                <application>false</application>

                            </security>
                            <validation>
                                <background-validation>false</background-validation>
                            </validation>
                        </connection-definition>
                    </connection-definitions>
                    <admin-objects>
                        <admin-object class-name="com.ibm.mq.connector.outbound.MQQueueProxy" jndi-name="java:jboss/MQQueueProxy" enabled="true" use-java-context="false" pool-name="CGF_TESTQ">
                            <config-property name="baseQueueName">
                                CGF_TESTQ
                            </config-property>
                        </admin-object>
                    </admin-objects>
                </resource-adapter>
            </resource-adapters>
        </subsystem>

(注:MQ的地址根据自己的配置,生产环境下的配置谨慎使用)

另外找到<subsystem xmlns="urn:jboss:domain:ejb3:2.0">该标签的MDB配置,替换为:

             <mdb>

                <resource-adapter-ref resource-adapter-name="wmq.jmsra-7.0.1.3.rar"/>

                <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>

            </mdb>

做好上述配置之后,就要编写Java EE的程序来进行测试了,笔者代码里面用到了Java EE7的特性,所以在项目的classpath下要导入javaee7的jar包,如果读者想单独测试下mq的连通性,笔者附件项目里面也有单独测试mq 消息发送和接收的SE程序,如下是利用JMS1.X消息传递的两个java类和一个测试的servlet:

消息发送:

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSRuntimeException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;

@Stateless
public class MessageSender {
	@Resource(lookup = "java:jboss/ManagedConnectionFactoryImpl")
	private ConnectionFactory factory;

	// @Resource(lookup="java:jboss/exported/jms/queue/test")
	@Resource(lookup = "java:jboss/MQQueueProxy")
	Queue myQueue;

	public void sendMessage(String message) throws JMSException {
		System.out.println("工厂对象为: " + factory.getClass().getSimpleName());
		System.out.println("队列对象为: " + myQueue.getClass().getSimpleName());
		/*
		 * try (JMSContext context =
		 * factory.createContext("producer","producer@163")) {
		 * context.createProducer().send(myQueue, message); }catch
		 * (JMSRuntimeException e) { // TODO: handle exception }
		 */

		Connection connection = null;
		try {
		/**
		  * username和password是在通过add-user.bat添加application身份的用户
		  *connection = factory.createConnection("producer","producer@163");	
		  */
                  connection = factory.createConnection();
					} catch (Exception e) {
			System.out.println("创建连接对象时出了问题");
			e.printStackTrace();
		}
		System.out.println("连接对象为: "+connection.getClass().getSimpleName());
		Session session = connection.createSession(false,
				Session.AUTO_ACKNOWLEDGE);
		MessageProducer producer = session.createProducer(myQueue);
		connection.start();
		TextMessage textMessage = null;
		textMessage = session.createTextMessage(message);
		producer.send(textMessage);

	}
}

 

消息接收:

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;

@Stateless
public class MessageReceiver {
	@Resource(lookup="java:jboss/ManagedConnectionFactoryImpl")
    private ConnectionFactory factory;
    
	//@Resource(mappedName="java:jboss/exported/jms/queue/test")
	@Resource(lookup="java:jboss/MQQueueProxy")
    Queue myQueue;

    public String receiveMessage() {
        /*try (JMSContext context = factory.createContext("producer","producer@163")) {
            return context.createConsumer(myQueue).receiveBody(String.class, 1000);
        }*/
    	System.out.println("接收端的工厂: "+factory.getClass().getSimpleName());
    	System.out.println("接收端的队列: "+myQueue.getClass().getSimpleName());
    	String rmessage = "";
    	try {
			Connection connection = factory.createConnection();
			Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			MessageConsumer consumer = session.createConsumer(myQueue);
			connection.start();
			TextMessage textMessage = (TextMessage) consumer.receive(5000);
			rmessage = textMessage.getText();
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	return rmessage;
    }
}

测试的Servlet:

import java.io.IOException;
import java.io.PrintWriter;

import javax.inject.Inject;
import javax.jms.JMSException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet(urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Inject
    MessageSender sender;

    @Inject
    MessageReceiver receiver;   
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String message = "你好,世界!";
		request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Application Managed JMSContext</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Application Managed JMSContext</h1>");
        try {
			sender.sendMessage(message);
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("发送消息出了异常。。。。");
			return;
		}
        out.println("Message sent: " + message + "<br><br>");
        out.println("Message received: " + receiver.receiveMessage());
        out.println("</body>");
        out.println("</html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

以读取standalone-full.xml配置的方式启动服务器,访问servlet,查看MQ的消息发送和接收情况,可看到如下页面:

JOSSO入门指南及其与WildFly AS 10的集成

JOSSO是一款开源的SSO实现。 本文将介绍JOSSO的发展版本变化,基本概念和用法。 1.JOSSO的版本 与Struts类似,JOSSO也分为JOSSO1和JOSSO2两个系列的版本。 JOSS...
  • taiyangdao
  • taiyangdao
  • 2016年04月15日 12:18
  • 899

如何在Wildfly上搭建Ibm mq的消息队列

说到Ibm mq消息队列,我想用过WebSphere服务器的人都不陌生,也能很熟练的在Was上配置一个队列服务,但是如何在Wildfly(Jboss前身)上配置Ibm mq的消息队列,网上给的资料也少...
  • liuzhihong01
  • liuzhihong01
  • 2013年12月06日 09:45
  • 2005

在Tomcat中集成ActiveMQ

网上有一些介绍,但是很多都是采用JNDI的方式,麻烦,而且tomcat和activemq要分别启动,理想的方式是启动tomcat的同时启动activemq,在web工程中直接使用activemq ...
  • bigtree_3721
  • bigtree_3721
  • 2016年03月19日 00:45
  • 440

MQ原理、使用场景、IBM WebSphere MQ介绍及spring集成配置

一、MQ简介及特点         MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专...
  • liuhaiabc
  • liuhaiabc
  • 2016年10月31日 16:54
  • 8289

消息队列mq的原理及实现方法

消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待...
  • lzq_csdn_th
  • lzq_csdn_th
  • 2016年07月18日 20:50
  • 29148

ActiveMQ初体验

ActiveMQ初体验
  • caicongyang
  • caicongyang
  • 2016年02月11日 16:00
  • 464

在WildFly中运行多个standalone模式的实例

WildFly作为一款优秀的EJB容器,其前身为JBoss AS。JBoss作为一款开源的应用服务器,被广泛的应用在各种项目当中。假设我们现在有这样一个项目,他是以standalone的模式运行在Wi...
  • LXB15959168136
  • LXB15959168136
  • 2016年08月18日 18:36
  • 2554

在IBM WebSphere MQ本地队列中存取消息

1)创建消息队列管理器(create mq manager)crtmqm -q GW.QUEUE.MANAGER2)启动消息队列管理器(start mq manager)strmqm GW.QUEUE...
  • hongbo781202
  • hongbo781202
  • 2006年03月16日 21:51
  • 2754

消息队列MQ实践----实现Queue(队列消息)和Topic(主题消息)两种模式

之前有篇文件介绍了生产消费者模式(http://blog.csdn.net/canot/article/details/51541920),当时是通过BlockingQueue阻塞队列来实现,以及在R...
  • canot
  • canot
  • 2016年12月11日 12:04
  • 9194

ActiveMQ

1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin....
  • bigtree_3721
  • bigtree_3721
  • 2016年03月18日 01:53
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Wildfly上搭建Ibm mq的消息队列
举报原因:
原因补充:

(最多只允许输入30个字)