`
baobeituping
  • 浏览: 1068498 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jms结合dwr采取推的方式实现服务器向客户端发送消息

阅读更多

首先我们采用的技术是dwr2.0和jms api,JMS服务器采用的是openJms.下载地址:http://openjms.sourceforge.net/downloads.html下载openJms,解压后在系统环境变量中加入OPENJMS_HOME=安装路径,在 \openjms-0.7.6.1\bin 里,有openJms的运行脚本,执行 startup 启动,弹出一个新的窗口,服务就运行在新窗口内,shutdown 为停止命令;里面有一个admin.bat用来启动查看你的queue数量和topic数量,以及增加删除的界面.导入包:jms包和dwr2.0的包

1.Queue方式的消息

Queue服务端测试代码:

package com.server;

import java.util.Date;
import java.util.Hashtable;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Server {
    public static void main(String[] args) {
        try {
            //取得JNDI上下文和连接
         Date date = new Date();
            Hashtable properties = new Hashtable();
            properties.put(
                Context.INITIAL_CONTEXT_FACTORY,
                "org.exolab.jms.jndi.InitialContextFactory");
            //openJms默认的端口是1099
            properties.put(Context.PROVIDER_URL,
                 "rmi://localhost:1099/");
            Context context = new InitialContext(properties);

            //获得JMS信息连接队列工厂
            QueueConnectionFactory queueConnectionFactory =
                (QueueConnectionFactory) context.lookup(
                    "JmsQueueConnectionFactory");
            //获得JMS信息连接队列
            QueueConnection queueConnection =
                queueConnectionFactory.createQueueConnection();
            //产生队列Session,设置事务为false,自动应答消息接收
            QueueSession queueSession =
                queueConnection.createQueueSession(
                    false,
                    Session.AUTO_ACKNOWLEDGE);

            //获得默认内建在JMS里的队列之一:queue1
            Queue queue = (Queue) context.lookup("queue2");
            //产生JMS队列发送器
            QueueSender queueSender =
                queueSession.createSender(queue);
            //发送数据到JMS
            TextMessage message = queueSession.createTextMessage();
            message.setText("Hello, I'm openJms.");
            message.setText("有消息了哦");
            queueSender.send(message);

            System.out.println("信息写入JMS服务器队列");

            //以下做清除工作,代码略
            // ... ...
                      
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Queue客户端的测试代码

package com.client;

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
 * @author Liang.xf 2004-12-24
 * For openJms 演示, Message接收
 * www.javayou.com
 */
public class Client implements MessageListener{
 public Client()throws JMSException, NamingException
 {
  Hashtable properties = new Hashtable();
        properties.put(
            Context.INITIAL_CONTEXT_FACTORY,
            "org.exolab.jms.jndi.InitialContextFactory");
        properties.put(Context.PROVIDER_URL,
            "rmi://localhost:1099/");
        Context context = new InitialContext(properties);

        //获得JMS信息连接队列工厂
        QueueConnectionFactory queueConnectionFactory =
            (QueueConnectionFactory) context.lookup(
                "JmsQueueConnectionFactory");

        //获得JMS信息连接队列
        QueueConnection queueConnection =
            queueConnectionFactory.createQueueConnection();
        QueueSession queueSession =
            queueConnection.createQueueSession(
                false,
                Session.AUTO_ACKNOWLEDGE);
        //获得默认内建在JMS里的队列之一:queue1
        Queue queue = (Queue) context.lookup("queue2");
        //产生JMS队列接收器
        QueueReceiver queueReceiver =
            queueSession.createReceiver(queue);
        queueReceiver.setMessageListener(this);

        System.out.println(

        "HelloReceQueue receiver to queue");

        queueConnection.start();
 }
    public static void main(String[] args) {
        try {
   /*try {
           //取得JNDI上下文和连接
        
          Hashtable properties = new Hashtable();
                properties.put(
                    Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                properties.put(Context.PROVIDER_URL,
                    "rmi://localhost:1099/");
                Context context = new InitialContext(properties);

                //获得JMS信息连接队列工厂
                QueueConnectionFactory queueConnectionFactory =
                    (QueueConnectionFactory) context.lookup(
                        "JmsQueueConnectionFactory");

                //获得JMS信息连接队列
                QueueConnection queueConnection =
                    queueConnectionFactory.createQueueConnection();

                //启动接收队列线程
                queueConnection.start();
                //产生队列Session,设置事务为false,自动应答消息接收
                QueueSession queueSession =
                    queueConnection.createQueueSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);
                //获得默认内建在JMS里的队列之一:queue1
                Queue queue = (Queue) context.lookup("queue1");

                //这个queue1的名字必须和服务器端所发布的名字一样.
                //产生JMS队列接收器
                QueueReceiver queueReceiver =
                    queueSession.createReceiver(queue);
                //通过同步的方法接收消息
                Message message = queueReceiver.receive();
                String messageText = null;
                if (message instanceof TextMessage)
                    messageText = ((TextMessage) message).                        
                        getText();
                System.out.println(messageText);
        
         
           //以下做清除工作,代码略
           // ... ...
         
       } catch (Exception e) {
           e.printStackTrace();
       }*/
   new Client();
  } catch (Exception e) {
   e.printStackTrace();
  }
    }

 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();

      }
  
 }
}

2.Topic消息

Topic服务端

package com.server;

import java.util.Hashtable;

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class FalsePersistSub {
 public static void main(String[] args) {
        try {
            //取得JNDI上下文和连接
            Hashtable properties = new Hashtable();
            properties.put(
                Context.INITIAL_CONTEXT_FACTORY,
                "org.exolab.jms.jndi.InitialContextFactory");
            //openJms默认的端口是1099
            properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
            Context context = new InitialContext(properties);
            //获得JMS Topic连接队列工厂
            TopicConnectionFactory factory =
                (TopicConnectionFactory) context.lookup(
                    "JmsTopicConnectionFactory");

            //创建一个Topic连接,并启动
            TopicConnection topicConnection = factory.createTopicConnection();
            topicConnection.start();

            //创建一个Topic会话,并设置自动应答
            TopicSession topicSession =
                topicConnection.createTopicSession(false,
                        Session.AUTO_ACKNOWLEDGE);

            //lookup 得到 topic1
            Topic topic = (Topic) context.lookup("topic1");
            //用Topic会话生成Topic发布器
            TopicPublisher topicPublisher = topicSession.createPublisher(topic);
            topicPublisher.setDeliveryMode(DeliveryMode.PERSISTENT);
            //发布消息到Topic
            System.out.println("消息发布到Topic");
           
            TextMessage message = topicSession.createTextMessage
                ("BOSS新功能");
            topicPublisher.publish(message);
          

            //资源清除,代码略  ... ...   
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
Topic客户端

package com.client;

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.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class FalsePersistSubClient implements MessageListener{
 TopicConnection topicConnection;
 TopicSession topicSession ;
 public FalsePersistSubClient()throws JMSException, NamingException
 {
  System.out.println("定购消息接收启动:");
        //取得JNDI上下文和连接
        Hashtable properties = new Hashtable();
        properties.put(Context.INITIAL_CONTEXT_FACTORY,
            "org.exolab.jms.jndi.InitialContextFactory");
        properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
        System.out.println("aaa:");
        Context context = new InitialContext(properties);
       
        //获得Topic工厂和Connection
        TopicConnectionFactory factory =
            (TopicConnectionFactory) context.lookup(
                "JmsTopicConnectionFactory");
         topicConnection = factory.createTopicConnection();
       

        //创建Topic的会话,用于接收信息
         topicSession =
            topicConnection.createTopicSession(
                false,
                Session.AUTO_ACKNOWLEDGE);

        //lookup topic1
        Topic topic = (Topic) context.lookup("topic1");
                //创建Topic subscriber
        TopicSubscriber topicSubscriber =
            topicSession.createSubscriber(topic);
        topicSubscriber.setMessageListener(this);
        topicConnection.start();
 }
 public static void main(String[] args) {
  try {
   new FalsePersistSubClient();
   /*    try {
           System.out.println("定购消息接收启动:");
           //取得JNDI上下文和连接
           Hashtable properties = new Hashtable();
           properties.put(Context.INITIAL_CONTEXT_FACTORY,
               "org.exolab.jms.jndi.InitialContextFactory");
           properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
           System.out.println("aaa:");
           Context context = new InitialContext(properties);
          
           //获得Topic工厂和Connection
           TopicConnectionFactory factory =
               (TopicConnectionFactory) context.lookup(
                   "JmsTopicConnectionFactory");
           TopicConnection topicConnection = factory.createTopicConnection();
           topicConnection.start();

           //创建Topic的会话,用于接收信息
           TopicSession topicSession =
               topicConnection.createTopicSession(
                   false,
                   Session.AUTO_ACKNOWLEDGE);

           //lookup topic1
           Topic topic = (Topic) context.lookup("topic1");
                   //创建Topic subscriber
           TopicSubscriber topicSubscriber =
               topicSession.createSubscriber(topic);
           //收满10条订阅消息则退出
           for (int i=0; i<10; i++) {
               //同步消息接收,使用receive方法,堵塞等待,直到接收消息
               TextMessage message = (TextMessage) topicSubscriber.receive();
               System.out.println("接收订阅消息["+i+"]: " + message.getText());
           }
           //资源清除,代码略  ... ...
           System.out.println("订阅接收结束.");
       } catch (NamingException e) {
           e.printStackTrace();
       } catch (JMSException e) {
           e.printStackTrace();
       }*/
  } catch (Exception e) {
   e.printStackTrace();
  }
    }

 public void onMessage(Message m) {
  try {

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

            System.out.println("HelloSubscriber got message: " + msg);
            if("end".equals(msg))
            {
             System.out.print("要关闭了");
             close();
            }

     } catch (JMSException ex) {

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

            ex.printStackTrace();
            try {
    close();
   } catch (Exception e) {
    e.printStackTrace();
   }

     }
  
 }
  public void close() throws JMSException {

  System.out.println("关闭代码");
         topicSession.close();

         topicConnection.close();

  }
}

分享到:
评论

相关推荐

    一种基于JMS的实时推送技术.pdf

    将JMS与DWR相结合,可以在服务器端接收到新的消息时,通过DWR将这些消息实时地推送到客户端,确保数据的即时更新。 在实现过程中,首先需要设计不同的模块,并通过JMS消息服务订阅和发布消息。每个模块都可以作为一...

    jsp j2ee dwr ajax dwr登陆

    【标题】:“jsp j2ee dwr ajax dwr登陆”这一主题涉及的是在Web开发中使用Java Server Pages (JSP)、Java 2 Platform, Enterprise Edition...DWR)以及Asynchronous JavaScript and XML (AJAX)来实现用户登录验证的功能...

    一个SSH+DWR的小示例

    DWR(Direct Web Remoting)则是一种JavaScript到Java的远程调用技术,允许在客户端浏览器和服务器之间进行实时的、异步的数据交换。 首先,让我们深入了解一下SSH框架: 1. **Spring**:这是一个全面的Java应用...

    dwr入门

    DWR(Direct Web Remoting)是一个开源Java库,它允许Web应用程序在客户端JavaScript和服务器端Java之间进行直接的远程方法调用(RPC)。这使得开发者能够像操作本地对象一样操作远程服务,极大地简化了富互联网应用...

    GlassFish_Enterprise_WP.rar_wp

    本文将深入探讨GlassFish的特点,以及如何利用它来开发和部署Web应用程序,尤其是结合DWR(Direct Web Remoting)技术,实现Java与JavaScript之间的高效通信。 GlassFish,由Oracle公司维护,是Java EE平台的实现,...

    Struts2HiberSpring+简单的dwr整合

    DWR的引入可能使得用户能够直接在客户端与服务器进行交互,无需刷新页面即可获取或更新数据。这个例子可能包含了如何配置这三个框架的XML配置文件,以及如何编写相应的Action、DAO、Service和DWR配置文件。此外,...

    J2EE武功秘籍

    - 客户端发送 `SYN` 请求。 - 服务器回应 `SYN+ACK`。 - 客户端发送 `ACK` 确认。 **2. SSL 原理** - **非对称加密**:客户端使用服务器的公钥加密数据。 - **对称加密**:客户端和服务器使用相同的密钥加密和解密...

    J2EE办公自动化系统源码

    - **客户端脚本**:使用JavaScript编写AJAX请求,调用DWR暴露的服务器端方法,并处理返回的验证结果。 - **界面设计**:HTML/CSS/JS组合构建登录界面,AJAX请求的结果会影响界面的显示状态,如错误提示或成功登录后...

    java中常用英文简写全拼与中文意思 (2).docx

    29. DWR:Direct Web Remoting,允许JavaScript直接调用Java服务器端的方法,实现富客户端应用。 30. DTD:文档类型定义,定义了XML文档的结构和约束。 这些概念和工具构成了Java开发和IT行业的基石,理解和掌握...

    java的各种技术.pdf

    6. **JMS(Java Message Service)**:支持异步消息传递,提供可靠的消息队列和发布/订阅模型。 7. **JavaMail**:提供邮件服务的API,支持多种邮件协议。 8. **Web服务(WebService)**:基于XML和SOAP的跨平台通信...

    java软件开发简历模板.docx

    - **数字图像水印项目**:结合小波分解理论和MATLAB,实现数字图像水印的嵌入和提取,涉及图像处理和算法设计。 3. **技术栈**: - **开发环境**:MyEclipse、Tomcat、MySQL等。 - **框架和库**:Struts2.0、...

    java学习路线图

    - **网络编程**:深化对Socket、ServerSocket的理解,实现客户端与服务器间的通信。 - **反射注解**:深入研究Class类,熟练使用注解增强代码功能。 ### Java WEB开发 #### 重点内容: - **Servlet开发**:掌握...

    Java个人简历模板12.doc

    3. **企业级应用**:对EJB3.0技术(包括SessionBean、MDB、JPA、RMI、JTA)有了解,并理解EJB3.0的客户端视图和依赖注入,熟悉JNDI和JMS。此外,还具有使用JBoss BPM工作流引擎的经验,以及基于RBAC的授权认证知识。...

    java程序员简历模版

    11. **Ajax和JavaScript**:Ajax允许在不刷新整个页面的情况下更新部分网页内容,JavaScript是用于网页客户端的脚本语言,DWR(Direct Web Remoting)是一个Ajax框架,简化了服务器端调用。 12. **Struts1、...

    java学习路线

    - **网络编程**:掌握Socket编程,实现客户端和服务器间的通信。 **5. JDBC编程(重点)** - **JDBC原理**:理解JDBC的角色和工作流程。 - **JDBC连接库**:了解不同数据库驱动,如MySQL、Oracle等的使用。 - *...

Global site tag (gtag.js) - Google Analytics