首先我们采用的技术是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与DWR相结合,可以在服务器端接收到新的消息时,通过DWR将这些消息实时地推送到客户端,确保数据的即时更新。 在实现过程中,首先需要设计不同的模块,并通过JMS消息服务订阅和发布消息。每个模块都可以作为一...
【标题】:“jsp j2ee dwr ajax dwr登陆”这一主题涉及的是在Web开发中使用Java Server Pages (JSP)、Java 2 Platform, Enterprise Edition...DWR)以及Asynchronous JavaScript and XML (AJAX)来实现用户登录验证的功能...
DWR(Direct Web Remoting)则是一种JavaScript到Java的远程调用技术,允许在客户端浏览器和服务器之间进行实时的、异步的数据交换。 首先,让我们深入了解一下SSH框架: 1. **Spring**:这是一个全面的Java应用...
DWR(Direct Web Remoting)是一个开源Java库,它允许Web应用程序在客户端JavaScript和服务器端Java之间进行直接的远程方法调用(RPC)。这使得开发者能够像操作本地对象一样操作远程服务,极大地简化了富互联网应用...
本文将深入探讨GlassFish的特点,以及如何利用它来开发和部署Web应用程序,尤其是结合DWR(Direct Web Remoting)技术,实现Java与JavaScript之间的高效通信。 GlassFish,由Oracle公司维护,是Java EE平台的实现,...
DWR的引入可能使得用户能够直接在客户端与服务器进行交互,无需刷新页面即可获取或更新数据。这个例子可能包含了如何配置这三个框架的XML配置文件,以及如何编写相应的Action、DAO、Service和DWR配置文件。此外,...
- **客户端脚本**:使用JavaScript编写AJAX请求,调用DWR暴露的服务器端方法,并处理返回的验证结果。 - **界面设计**:HTML/CSS/JS组合构建登录界面,AJAX请求的结果会影响界面的显示状态,如错误提示或成功登录后...
29. DWR:Direct Web Remoting,允许JavaScript直接调用Java服务器端的方法,实现富客户端应用。 30. DTD:文档类型定义,定义了XML文档的结构和约束。 这些概念和工具构成了Java开发和IT行业的基石,理解和掌握...
6. **JMS(Java Message Service)**:支持异步消息传递,提供可靠的消息队列和发布/订阅模型。 7. **JavaMail**:提供邮件服务的API,支持多种邮件协议。 8. **Web服务(WebService)**:基于XML和SOAP的跨平台通信...
- **数字图像水印项目**:结合小波分解理论和MATLAB,实现数字图像水印的嵌入和提取,涉及图像处理和算法设计。 3. **技术栈**: - **开发环境**:MyEclipse、Tomcat、MySQL等。 - **框架和库**:Struts2.0、...
- **网络编程**:深化对Socket、ServerSocket的理解,实现客户端与服务器间的通信。 - **反射注解**:深入研究Class类,熟练使用注解增强代码功能。 ### Java WEB开发 #### 重点内容: - **Servlet开发**:掌握...
3. **企业级应用**:对EJB3.0技术(包括SessionBean、MDB、JPA、RMI、JTA)有了解,并理解EJB3.0的客户端视图和依赖注入,熟悉JNDI和JMS。此外,还具有使用JBoss BPM工作流引擎的经验,以及基于RBAC的授权认证知识。...
11. **Ajax和JavaScript**:Ajax允许在不刷新整个页面的情况下更新部分网页内容,JavaScript是用于网页客户端的脚本语言,DWR(Direct Web Remoting)是一个Ajax框架,简化了服务器端调用。 12. **Struts1、...
- **网络编程**:掌握Socket编程,实现客户端和服务器间的通信。 **5. JDBC编程(重点)** - **JDBC原理**:理解JDBC的角色和工作流程。 - **JDBC连接库**:了解不同数据库驱动,如MySQL、Oracle等的使用。 - *...