zoukankan      html  css  js  c++  java
  • JBOSS建立JMS应用实例

    JBOSS建立JMS应用实例

     

    环境配置说明

    Jboss 4.2.3

    Java ee 5

    MySql5.0

    安装jdk,我的目录为C:/Sun/SDK

    安装jboss.我的目录为D:/jboss 4.2.3

    安装mysql

    配置环境变量JBOSS_HOME D:/jboss 4.2.3

    配置环境变量 JAVA_HOME C:/Sun/SDK/jdk

     

    JBOSSJMS配置

    由于没有用到集群所以用JBOSSdefault应用即可。

    1、  配置MySQL数据库的JNDI

    MySQL数据库驱动拷到default/libJBOSS没有自带MySQL的数据库驱动。

    D:/jboss 4.2.3 /docs/examples/jca 下的文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/ jboss4.2.3/server/default/deploy

    修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <datasources>

    <local-tx-datasource>

        <jndi-name>MySqlDS</jndi-name>

        <connection-url> jdbc:mysql://localhost:3306/test</connection-url>

        <driver-class>com.mysql.jdbc.Driver</driver-class>

        <user-name>root</user-name>

        <password>rootpassword</password>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

        <metadata>

           <type-mapping>mySQL</type-mapping>

        </metadata>

    </local-tx-datasource>

    </datasources>

     

    这里,定义了一个名为MySqlDS的数据源,其参数包括JDBCURL,驱动类名,用户名及密码等。

    通过配置后就可以通过JNDIjava:MySqlDS 访问到配置的Mysql数据库。

     

    2、  配置JBOSSJMS环境

    D:/jboss 4.2.3 /docs/examples/jms下的mysql-jdbc2-service.xml拷到D:/jboss4.2.3/server/default/deploy/jms 下。并将数据库DataSourceBinding 改成name=MySqlDS连到你的MySql数据库

     

    D:/jboss 4.2.3 /server/default/deploy/jms 目录下的hsqldb-jdbc-state-service文件改名为mysql-jdbc-state-service.xml 并将<depends optional-attribute-name="ConnectionManager">jboss.jca:service=DataSourceBinding,name=MySqlDS</depends>

    该成name=MySqlDS用于连接你的MySql的数据库。

    启动JBOSS后在控制台将会看到类似如下的信息就表示默认的JMSjndi名已经绑定了。JMS的配置成功了。

    10:14:42,343 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=DefaultDS' to JNDI name 'java:DefaultDS'

    10:14:42,984 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'

    10:14:43,171 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=MySqlDS' to JNDI name 'java:MySqlDS'

    10:14:43,968 INFO  [A] Bound to JNDI name: queue/A

    10:14:44,000 INFO  [B] Bound to JNDI name: queue/B

    10:14:44,000 INFO  [C] Bound to JNDI name: queue/C

    10:14:44,000 INFO  [D] Bound to JNDI name: queue/D

    10:14:44,015 INFO  [ex] Bound to JNDI name: queue/ex

    10:14:44,046 INFO  [testTopic] Bound to JNDI name: topic/testTopic

    10:14:44,046 INFO  [securedTopic] Bound to JNDI name: topic/securedTopic

    10:14:44,062 INFO  [testDurableTopic] Bound to JNDI name: topic/testDurableTopic

    10:14:44,062 INFO  [testQueue] Bound to JNDI name: queue/testQueue

    10:14:44,140 INFO  [myQueue] Bound to JNDI name: queue/myQueue

    10:14:44,203 INFO  [UILServerILService] JBossMQ UIL service available at : /127.0.0.1:8093

     

        连接到MySQL数据库也可以看到默认的建了几个以jms_开头的数据表。用语保存jms的用户信息和持久化消息。

     

    JBOSSJMS实例

    JBOSSJMS环境建立好了以后我们就可以写几个发送接受JMS的程序来验证一下。

    当你发送一个消息,你不能直接发送到对此消息感兴趣的接受者。而是你发送到一个目的地。对此消息感兴趣的接受者必须连接到目的地,得到此消息或在目的地设置订阅。

    JMS中有两种域:topics queues

    *一个消息发送到一个topics ,可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher, 消息接受者叫做subscriber

    *queue 是另外一种方式,仅仅允许一个消息传送给一个客户。一个发送者将消息放在消息队列中,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能在得到它。

    为了能发送和接收消息,必须得到一个JMS连接。该连接是使用JMS Provider得到连接的,在得到连接之后,建立一个会话(Session)。然后再建立publisher/sender 来发送消息或subscriber/receiver来接收消息。

    运行时,如果使用topic 那么publisher subscriber 通过一个topic来关联,如果使用queue ,则sender receiver通过queue来关联起来。

    通常,在JMS框架中运转的方法如下:

    (1) 得到一个JNDI初始化上下文(Context)

    (2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型)

    (3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);

    (4) 通过连接来建立一个会话(Session);

    (5) 查找目的地(Topic/ Queue);

    (6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/ QueueReceiver).

    为了得到一个连接和得到一个目的地(用来关联publisher/sender subscriber/receiver),必须用provider-specific参数。

     

    D:/jboss 4.2.3 /server/default/deploy/jms下的jbossmq-destinations-service.xml是在配置JMS目的地的xml文件。在文件中已经存在几个缺省的目的地,所以你比较容易明白怎样增加到文件中

    1、  topics例子

    package com.msg;

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

    import javax.jms.TopicConnectionFactory;

    import javax.jms.TopicConnection;

    import javax.jms.TopicSession;

    import javax.jms.TopicPublisher;

    import javax.jms.Topic;

    import javax.jms.TextMessage;

    import javax.jms.Session;

    import javax.jms.JMSException;

    import java.util.Hashtable;

     

    public class HelloPublisher {

     

           TopicConnection topicConnection;

           TopicSession topicSession;

           TopicPublisher topicPublisher;

           Topic topic;

     

           public HelloPublisher(String factoryJNDI, String topicJNDI)

                         throws JMSException, NamingException {

                  Hashtable props = new Hashtable();

                  props.put(Context.INITIAL_CONTEXT_FACTORY,

                                "org.jnp.interfaces.NamingContextFactory");

                  props.put(Context.PROVIDER_URL, "localhost:1099");

                  props.put("java.naming.rmi.security.manager", "yes");

                  props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");

                  Context context = new InitialContext(props);

                  TopicConnectionFactory topicFactory = (TopicConnectionFactory) context

                                .lookup(factoryJNDI);

                  topicConnection = topicFactory.createTopicConnection();

                  topicSession = topicConnection.createTopicSession(false,

                                Session.AUTO_ACKNOWLEDGE);

     

                  topic = (Topic) context.lookup(topicJNDI);

     

                  topicPublisher = topicSession.createPublisher(topic);

     

           }

     

           public void publish(String msg) throws JMSException {

     

                  TextMessage message = topicSession.createTextMessage();

                  message.setText(msg);

                  topicPublisher.publish(topic, message);

           }

     

           public void close() throws JMSException {

                  topicSession.close();

                  topicConnection.close();

           }

     

           public static void main(String[] args) {

                  try {

                         HelloPublisher publisher = new HelloPublisher("ConnectionFactory",

                                       "topic/testTopic");

                         for (int i = 1; i < 11; i++) {

                                String msg = "Hello World no. " + i;

                                System.out.println("Publishing message: " + msg);

                                publisher.publish(msg);

                         }

                         publisher.close();

                  } catch (Exception ex) {

                         System.err

                                       .println("An exception occurred while testing HelloPublisher25: "

                                                     + ex);

                         ex.printStackTrace();

                  }

           }

    }

     

    package com.msg;

     

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

     

    import javax.jms.TopicConnectionFactory;

    import javax.jms.TopicConnection;

    import javax.jms.TopicSession;

    import javax.jms.TopicSubscriber;

    import javax.jms.Topic;

    import javax.jms.Message;

    import javax.jms.TextMessage;

    import javax.jms.Session;

    import javax.jms.MessageListener;

    import javax.jms.JMSException;

     

    public class HelloSubscriber implements MessageListener {

           TopicConnection topicConnection;

           TopicSession topicSession;

           TopicSubscriber topicSubscriber;

           Topic topic;

     

           public HelloSubscriber(String factoryJNDI, String topicJNDI)

                         throws JMSException, NamingException {

                  Context context = new InitialContext();

                  TopicConnectionFactory topicFactory = (TopicConnectionFactory) context

                                .lookup(factoryJNDI);

                  topicConnection = topicFactory.createTopicConnection();

                  topicSession = topicConnection.createTopicSession(false,

                                Session.AUTO_ACKNOWLEDGE);

                  topic = (Topic) context.lookup(topicJNDI);

                  topicSubscriber = topicSession.createSubscriber(topic);

                  topicSubscriber.setMessageListener(this);

                  System.out.println("HelloSubscriber subscribed to topic: " + topicJNDI);

                  topicConnection.start();

           }

     

           public void onMessage(Message m) {

                  try {

                         String msg = ((TextMessage) m).getText();

                         System.out.println("HelloSubscriber got message: " + msg);

                  } catch (JMSException ex) {

                         System.err.println("Could not get text message: " + ex);

                         ex.printStackTrace();

                  }

           }

     

           public void close() throws JMSException {

                  topicSession.close();

                  topicConnection.close();

           }

     

           public static void main(String[] args) {

                  try {

                         HelloSubscriber subscriber = new HelloSubscriber(

                                       "TopicConnectionFactory", "topic/testTopic");

                  } catch (Exception ex) {

                         System.err

                                       .println("An exception occurred while testing HelloSubscriber: "

                                                     + ex);

                         ex.printStackTrace();

                  }

           }

    }

     

    2、  queues 例子

    package com.msg;

     

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

    import javax.jms.QueueConnectionFactory;

    import javax.jms.QueueConnection;

    import javax.jms.QueueSession;

    import javax.jms.QueueSender;

    import javax.jms.Queue;

    import javax.jms.TextMessage;

    import javax.jms.Session;

    import javax.jms.JMSException;

     

    import java.util.Hashtable;

     

    public class HelloQueue {

        QueueConnection queueConnection;

        QueueSession queueSession;

        QueueSender queueSender;

        Queue queue;

     

        public HelloQueue(String factoryJNDI, String topicJNDI)

                      throws JMSException, NamingException {

               Hashtable props = new Hashtable();

               props.put(Context.INITIAL_CONTEXT_FACTORY,

                             "org.jnp.interfaces.NamingContextFactory");

               props.put(Context.PROVIDER_URL, "localhost:1099");

               props.put("java.naming.rmi.security.manager", "yes");

               props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");

               Context context = new InitialContext(props);

               QueueConnectionFactory queueFactory = (QueueConnectionFactory) context

                             .lookup(factoryJNDI);

               queueConnection = queueFactory.createQueueConnection();

               queueSession = queueConnection.createQueueSession(false,

                             Session.AUTO_ACKNOWLEDGE);

     

               queue = (Queue) context.lookup(topicJNDI);

     

               queueSender = queueSession.createSender(queue);

     

        }

     

        public void send(String msg) throws JMSException {

               TextMessage message = queueSession.createTextMessage();

               message.setText(msg);

               queueSender.send(queue, message);

        }

     

        public void close() throws JMSException {

               queueSession.close();

               queueConnection.close();

        }

     

        public static void main(String[] args) {

               try {

                      HelloPublisher publisher = new HelloPublisher("ConnectionFactory",

                                    "topic/testTopic");

                      for (int i = 1; i < 11; i++) {

                             String msg = "Hello World no. " + i;

                             System.out.println("Publishing message: " + msg);

                             publisher.publish(msg);

                      }

                      publisher.close();

               } catch (Exception ex) {

                      System.err

                                    .println("An exception occurred while testing HelloPublisher25: "

                                                  + ex);

                      ex.printStackTrace();

               }

        }

    }

    package com.msg;

     

    import java.util.Hashtable;

     

    import javax.jms.JMSException;

    import javax.jms.Message;

    import javax.jms.MessageListener;

    import javax.jms.Session;

    import javax.jms.TextMessage;

    import javax.jms.Queue;

    import javax.jms.QueueConnection;

    import javax.jms.QueueConnectionFactory;

    import javax.jms.QueueSession;

    import javax.jms.QueueReceiver;

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

     

    public class HelloReceQueue implements MessageListener {

        QueueConnection queueConnection;

        QueueSession queueSession;

        QueueReceiver queueReceiver;

        Queue queue;

        public HelloReceQueue(String factoryJNDI, String topicJNDI)

        throws JMSException, NamingException

        {

               Context context = new InitialContext();

               QueueConnectionFactory queueFactory =

               (QueueConnectionFactory)context.lookup(factoryJNDI);

               queueConnection = queueFactory.createQueueConnection();

               queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

               queue = (Queue)context.lookup(topicJNDI);

       

               queueReceiver = queueSession.createReceiver(queue);

               queueReceiver.setMessageListener(this);

               System.out.println(

               "HelloReceQueue receiver to queue: " + topicJNDI);

               queueConnection.start();

        }

        public void onMessage(Message m) {

        try {

        String msg = ((TextMessage)m).getText();

        System.out.println("HelloReceQueue got message: " + msg);

        } catch(JMSException ex) {

        System.err.println("Could not get text message: " + ex);

        ex.printStackTrace();

        }

        }

        public void close() throws JMSException {

               queueSession.close();

               queueConnection.close();

        }

    }

     

    我们通过一个jsp页面建立一个web应用来发送接受消息观察message的发送接受情况。

    sendmsg.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    <%@ page import="com.msg.*" %>

    <%

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    HelloPublisher sendmsgBean=new HelloPublisher("ConnectionFactory", "topic/testTopic");

     

    String msg=request.getParameter("msg")==null?"":request.getParameter("msg");

    String flag=request.getParameter("msgflag")==null?"1":request.getParameter("msgflag");

     

    if(!"".equals(msg)&&"1".equals(flag))

    {

       sendmsgBean.publish(msg);

    }

    if("2".equals(flag))

    {

       out.println("is run HelloSubscriber");

       HelloSubscriber subscriber=new HelloSubscriber("ConnectionFactory", "topic/testTopic");

    }

    if("3".equals(flag)&&!"".equals(msg))

    {

       HelloQueue queueBean=new HelloQueue("ConnectionFactory", "queue/myQueue");

       queueBean.send(msg);

    }

    if("4".equals(flag))

    {

       HelloReceQueue receQueueBean=new HelloReceQueue("ConnectionFactory", "queue/myQueue");

    }

    out.println(flag);

    %>

     

    <!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN">

    <html>

      <head>

        <base href="<%=basePath%>">

       

        <title>发消息</title>

       

           <meta http-equiv="pragma" content="no-cache">

           <meta http-equiv="cache-control" content="no-cache">

           <meta http-equiv="expires" content="0">   

           <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

           <meta http-equiv="description" content="This is my page">

           <!--

           <link rel="stylesheet" type="text/css" href="styles.css">

           -->

        <script>

        function submitMsg(flag)

        {

           if(flag==1)

           {

              document.getElementById("msgflag").value="1";

           }

           else if(flag==2)

           {

              document.getElementById("msgflag").value="2";

           }

           else if(flag==3)

           {

              document.getElementById("msgflag").value="3";

           }

           else

           {

              document.getElementById("msgflag").value="4";

           }

           document.msgForm.submit();

        }

        </script>

      </head>

     

      <body>

       <form name="msgForm" action="sendmsg.jsp" method="POST">

         <input type="text" name="msg">

         <input type="hidden" name="msgflag" value="1">

         <input type="button" name="btn1" value="PublicTopic" οnclick=submitMsg(1);>

         <input type="button" name="btn2" value="Subscriber" οnclick=submitMsg(2);>

         <input type="button" name="btn3" value="sendQueue" οnclick=submitMsg(3);>

         <input type="button" name="btn4" value="receiveQueue" οnclick=submitMsg(4);>

        

       </form>

      </body>

    </html>

     

    为了更好的观察消息的发送接受情况。可以下载HermesJMS来观察消息发送接受的情况。

    具体可以到

    https://sourceforge.net/project/showfiles.php?group_id=61713&package_id=58149&release_id=616588 下载。

    HermesJMSJBOSSjms配置见

    http://www.hermesjms.com/demos/jboss_config.html

     

    以上实例原代码见

    http://download.csdn.net/source/648609

  • 相关阅读:
    HashMap源码分析
    静态代理和装饰模式的区别
    自动内存管理
    ReentrantReadWriteLock
    ReentranLock
    对象的内存布局
    对象的创建
    [P2495][SDOI2011]消耗战——虚树
    [HDU2966]In case of failure——KD树
    [Gym-101158J]Coverthe Polygon with Your Disk——梯度下降,模拟退火
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171476.html
Copyright © 2011-2022 走看看