`
yonglin4605
  • 浏览: 188532 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在GWT中使用Jetty的Comet技术

    博客分类:
  • GXT
阅读更多
web.xml中配置ContinuationFilter
<filter>
	<filter-name>jetty</filter-name>
	<filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class>
	<init-param >
		<param-name>faux</param-name>
		<param-value>true</param-value>
	</init-param>
		
</filter>
<filter-mapping>
	<filter-name>jetty</filter-name>
	<servlet-name>comet</servlet-name>
</filter-mapping>


GWT Service中的设置

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;


import net.sf.hibernate4gwt.core.HibernateBeanManager;
import net.sf.hibernate4gwt.gwt.HibernateRemoteService;

import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationThrowable;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.ModelData;
import com.google.gwt.user.server.rpc.UnexpectedException;
import com.single.desktopoa.client.event.CometEvents;
import com.single.desktopoa.common.person.Person;
import com.single.desktopoa.exception.RetryException;

public class BaseService extends HibernateRemoteService {

	public static final String PAYLOAD = "com.google.gwt.payload";

	public static final String PERSON = "person";
	public static final String COMET_UTIL = "CometUtil";

	 public static final CometUtil cometUtil=new CometUtil();

	protected Person person;

	protected WebApplicationContext springContext;

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		springContext = WebApplicationContextUtils.getWebApplicationContext(
				config.getServletContext(),
				WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		setBeanManager((HibernateBeanManager) springContext
				.getBean("hibernateBeanManager"));
	}

	@Override
	protected String readContent(HttpServletRequest request)
			throws ServletException, IOException {
		String payload = (String) request.getAttribute(PAYLOAD);
		if (payload == null) {
			payload = super.readContent(request);
			request.setAttribute(PAYLOAD, payload);
		}

		return payload;
	}

	@Override
	protected void doUnexpectedFailure(Throwable e) {
		throwIfRetryRequest(e);
		super.doUnexpectedFailure(e);
	}
//如果我们的异常不想被GWT捕获,在该方法中向上抛出
	protected void throwIfRetryRequest(Throwable caught) {
		if (caught instanceof UnexpectedException) {
			caught = caught.getCause();
		}
//如果抛出的是自定义的,为了Hold request的异常,则继续往上抛出 ContinuationThrowable() 
//此ContinuationThrowable() 是一个Error,ContinuationFilter会捕获这个Error,为了能让Filter捕获,我手动向上抛出,很笨拙的方法,期待以后改进
		if(caught instanceof RetryException){
			throw new ContinuationThrowable();
		}
		
	}

	@Override
	protected void onBeforeRequestDeserialized(String serializedRequest) {
		person = (Person) getThreadLocalRequest().getSession().getAttribute(
				PERSON);
		super.onBeforeRequestDeserialized(serializedRequest);
	}

	public class CometMember {
		public Person person;
		public Continuation continuation;
		public Queue<ModelData> queue = new LinkedList<ModelData>();

		public void addEvent(String event,Object data) {
			boolean isContain = false;
			for (Iterator<ModelData> it = queue.iterator(); it.hasNext();) {
				if (it.next().get("event").equals(event)) {
					isContain = true;
					break;
				}
			}
			if (!isContain) {
				ModelData modeldata=new BaseModelData();
				modeldata.set("event", event);
				if(data!=null)
					modeldata.set("data", data);
				queue.add(modeldata);
			}
			synchronized (this) {
//				if (continuation != null) {
//					continuation.resume();
//				}
			}
		}
	}

	public static class CometUtil {
		protected HashMap<Long, CometMember> memberMap = new HashMap<Long, CometMember>();

		public List<Person> getOnlineList(){
			List<Person> onlines=new ArrayList<Person>();
			for(CometMember member:memberMap.values()){
				onlines.add(member.person);
			}
			return onlines;
		}
		public boolean addEvent(Person receiver, String event,Object data) {
			if (isContain(receiver)) {
				CometMember member = memberMap.get(receiver.getId());
				member.addEvent(event,data);
				return true;
			}
			return false;
		}

		public void addMember(CometMember member) {
			for(Iterator<CometMember> it=memberMap.values().iterator();it.hasNext();){
				CometMember mem=it.next();
				mem.addEvent(CometEvents.WORKTALK_newlogin, null);
			}
			memberMap.put(member.person.getId(), member);
			//test
			member.addEvent(CometEvents.WORKTALK_newlogin, null);
		}

		private boolean isContain(Person receiver) {
			if (memberMap.get(receiver.getId()) == null) {
				return false;
			}
			return true;
		}
	}

}



处理Comet请求

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationSupport;
import org.mortbay.jetty.RetryRequest;

import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.ModelData;
import com.single.desktopoa.exception.RetryException;
import com.single.desktopoa.module.comet.CometService;
import com.single.desktopoa.server.BaseService;

public class CometServiceImpl extends BaseService implements CometService {

	
	
	

	
	public List<ModelData> getEvents() {
		HttpServletRequest request=getThreadLocalRequest();
		HttpServletResponse response=getThreadLocalResponse();
		
		
		CometMember member=(CometMember)request.getSession().getAttribute(MEMBER);
		if(member==null){
			member=new CometMember();
			member.person=person;
			
			request.getSession().setAttribute(MEMBER, member);
			cometUtil.addMember(member);
		}
		if(member.queue.size()>0){
			List<ModelData> result=new ArrayList<ModelData>();
			while(member.queue.size()>0){
				result.add(member.queue.poll());
			}
			return result;
		}else {
			Continuation continuation=ContinuationSupport.getContinuation(request);
			if(continuation.isInitial()){
				//如果是新创建的
				continuation.suspend(response);
				member.continuation=continuation;
			}else{
				return new ArrayList<ModelData>();
			}
		}
		
		//手动抛出异常,表明此请求需要Hold住,待以后唤醒
		throw new RetryException();
		
		
	}

	

}

分享到:
评论
1 楼 java_doc 2010-05-27  
可以在tomcat里面用吗?

相关推荐

    gwt-comet-jar包+实例+source.jar包,

    里面东西很多,都是关于GWT-COMET的内容,实现gwt的服务器推技术,包括gwt-comet-examples-1.2.3:google官网上的Test实例;gwt-comet-1.2.3.jar:jar包,gwt-example:聊天实例源代码(.java的),gwt-event-source...

    Jetty中文手册

    在Jetty中部署应用 部署管理器 部署绑定 热部署 Context提供者 如何部署web应用 webApp提供者 如何部署第三方产品 部署展开形式的web应用 使用Jetty进行开发 如何使用Jetty进行开发 如何编写Jetty中的Handlers 使用...

    GWT入门 GWT中文教程

    EXT-GWT的API和DOC文档对于学习和使用EXT-GWT至关重要,它们详尽地介绍了各个组件的用法和功能,帮助开发者了解如何在项目中集成和使用这些组件。 接下来,“Gwt-Ext基础-中级-进阶”这部分教程可能涵盖了从基础到...

    GWT中文教程(入门进阶)

    3. **Widget库**:GWT提供了一套丰富的Widget库,包括按钮、文本框、面板等基本UI组件,以及表单、日期选择器等复杂控件,这些都是用Java封装的,可以直接在Java代码中使用。 4. **事件处理**:GWT中的事件模型基于...

    GWT安装和使用

    在 Eclipse 工程 `myProject` 中使用 `applicationCreator.cmd` 创建 GWT 应用程序框架。此命令同样接受参数以指定目标 Eclipse 工程。 **步骤四:导入 Eclipse 工程** 完成以上步骤后,将创建好的 Eclipse 工程...

    GWT中的xmlHttpRequest

    在《GWT揭秘》一书的8.1节中,详细讲解了如何在GWT中使用XMLHttpRequest来请求动态数据。本篇文章将深入探讨这一主题。 首先,XMLHttpRequest是Web开发中的一个基础组件,它允许浏览器在不刷新整个页面的情况下向...

    Gwt中文手册,GWt入门

    Gwt中文手册,GWt入门Gwt中文手册,GWt入门Gwt中文手册,GWt入门

    gwt技术介绍

    1. 在IDE中添加GWT库,使用Java编写和调试应用程序。 2. 利用GWT自带的编译器将Java代码编译成JavaScript和HTML。 3. 将编译后的代码发布到Web服务器上,并检查是否兼容主流浏览器。 4. 在Eclipse中创建工程,使用...

    GWT技术文档详细解说

    GWT使用宿主模型(Host Model)和Web模型(Web Model)的概念,宿主模型是Java代码运行的环境,而Web模型是JavaScript代码在浏览器中的运行环境。GWT提供了`GWT.isClient()`方法判断当前代码是在哪一侧运行。 4.6 ...

    GWT中文教程 .

    EXT-GWT2.0.1+API+DOC Gwt-Ext基础-中级-进阶GWT中文教程

    进阶GWT,属于GWT的详细描述

    在Eclipse中添加GWT插件是使用GWT开发的第一步。可以通过安装Eclipse插件来实现这一步骤。安装插件的源地址可以从Google官方网站下载,例如Eclipse 3.5(Galileo)、Eclipse 3.4(Ganymede)和Eclipse 3.3(Europa)...

    gwt 练习 gwt学习

    GWT允许开发者使用Java语言编写客户端代码,然后通过编译器将其转换为优化过的JavaScript,以便在各种浏览器上运行。这个“gwt 练习 gwt学习”项目可能是为了帮助用户熟悉GWT的基本概念、开发流程和最佳实践。 在...

    gwt反射 http://code.google.com/p/google-gin/wiki/GinTutorial

    在GWT中,反射是一个强大的工具,允许程序在运行时检查类、接口、字段和方法的信息,甚至可以在客户端创建和操作未知类型的对象,这对于动态加载和处理数据非常有用。 ...

    gxt.jar(gwt开发使用)

    gwt 开发

    GWT技术介绍

    1. **创建项目**:使用特定的命令或工具在集成开发环境中创建GWT项目。 2. **编写代码**:利用Java语言编写业务逻辑和用户界面。 3. **编译**:使用GWT编译器将Java代码编译为JavaScript和HTML。 4. **部署与测试**...

    gwt学习资料和实例项目

    这通常会涵盖GWT的异步编程模型,例如使用RequestFactory或者GWT的 Comet 技术来实现长轮询,以获取实时数据更新。 **Tutorial-hellomvp-2.1.zip** MVP(Model-View-Presenter)是GWT中推荐的一种设计模式,用于...

    Google plugin sdk GWT

    5. **创建GWT项目**:在Eclipse中,使用新安装的插件创建一个新的GWT项目。选择“File” &gt; “New” &gt; “Other” &gt; “Google” &gt; “Google Web Application Project”。在向导中,指定项目名和选择使用的GWT SDK版本...

Global site tag (gtag.js) - Google Analytics