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

来源:互联网 发布:四级英语网络培训机构 编辑:程序博客网 时间:2024/05/18 01:39

说到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;@Statelesspublic 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;@Statelesspublic 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 blocke.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 blocke.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的消息发送和接收情况,可看到如下页面:

原创粉丝点击