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

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值