设为首页 收藏本站
查看: 380|回复: 0

[经验分享] 在GWT中使用Jetty的Comet技术

[复制链接]

尚未签到

发表于 2017-2-27 09:29:07 | 显示全部楼层 |阅读模式
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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347724-1-1.html 上篇帖子: 关于springside中使用jetty打出ibatis的sql语句 下篇帖子: Maven+jetty+jrebel+m2eclipse+eclipse搭建struts2开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表