`
yonglin4605
  • 浏览: 183609 次
  • 性别: 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-GWT2.0.1+API+DOC gwtdesigner Gwt-Ext基础-中级-进阶 GWT快速开发 GWT入门 GWT中文教程

    GWT安装和使用

    Ajax技术是当前开发web应用的非常热门的技术,也是Web 2.0的一个重要的组成部分。然而如果用传统的方式Javascript进行Ajax开发的话,就会使得应用程序非常难以进行调试,从而降低了生产效率。Google最近推出的GWT...

    Gwt中文手册,GWt入门

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

    GWT中文教程 .

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

    GWT中文教程(入门进阶)

    GWT中文教程(入门进阶) 通过实例详细介绍GWT

    gxt.jar(gwt开发使用)

    gwt 开发

    GWT中的xmlHttpRequest

    填《GWT揭秘》中8.1节中--GWT中的XMLHTTPRequest:请求动态数据的代码,

    GWT揭秘(书签整理版)

    5. 在GWT中使用XML 6. GWT控件详解 7. 使用GWT控件 8. GWT-RPC 9. Ext GWT 10. (实战)俄罗斯方块游戏 11. (实战)费用申请审批流程 12. GWT与Flex整合 13. 图片缓存 CSS Sprite 14. 本地化 15. 其他高级功能

    GWT技术文档详细解说

    比较不错的关于GWT的技术文档。内容较基础~

    vue-gwt, 在使用GWT的Java中,Vue.js 组件/自定义元素 在https开发.zip

    vue-gwt, 在使用GWT的Java中,Vue.js 组件/自定义元素 在https开发 Vue使用 JsInterop 和 Elemental2将 Vue.js 与 GWT集成。 它允许你在Java中编写Vue组件。 特性用英镑为代价的Vue.js 组件,带有的Java控制器模板...

    GWT技术介绍

    GWT技术介绍

    gwt 练习 gwt学习

    gwt 练习gwt 练习gwt 练习gwt 练习

    gwt技术介绍

    GWT 是一款后台java人员开发 的技术框架,无需前台开发工程师。

    GWT框架和Echarts 使用

    GoogleWebToolkit(GWT)是一个Java软件开发框架用于开发类似于GoogleMaps和Gmail的AJAX应用程序。GWT的设计参考JavaAWT包设计,类命名规则、接口...在 GWT框架中使用 Echarts 。 注意: 本项目jar包已删除,请新建项目。

    gwt使用手册

    gwt使用手册,详细介绍gwt使用手册和各种组件的调用配置

    [GWT揭秘].徐彬.扫描版

    本书内容全面,不仅详细介绍了 GWT 的主要模块和控件、GWT 与 JavaScript 对象的交互、在 GWT 中使用 XML、开发自定义 GWT 控件、GWT-RPC 和 Ext GWT 等必备的基础知识,而且还深入讲解了 GWT 与 Flex整合、图片缓存...

    gwt 中实现简单的树状菜单

    1.gwt中实现tree状菜单,tree是一次性加载 2。其中还用源代码。

Global site tag (gtag.js) - Google Analytics