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

本文介绍如何使用JMS API和OpenJMS实现消息队列(Queue)及主题(Topic)的发送与接收。通过具体代码示例展示了Queue和Topic两种消息传递模式的服务端与客户端实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们采用的技术是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();

  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值