- 浏览: 111939 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
ron.luo:
干货,必须得顶。
JAXB使用经验总结 -
csdn_zuoqiang:
能否看下DWR的配置情况?谢谢
结合webservice实现dwr推送 -
友友水:
。。。。不好意思,无心之失,删不掉前一条评论
JAXB使用经验总结 -
友友水:
[/flash][/flash][/flash][/flash ...
JAXB使用经验总结 -
lihong11:
大哥,加加注释好不?看不懂唉
小玩dwr实现服务器推送
情景:
客户端需要实时提醒服务,比如某个日程已过期的提醒,并且是刚刚过期的时间(所以是实时),
1. 日程对象放在数据库,由webservice调用得到
2. webservice在拿到数据后必须主动把数据给我的主程序端
3. 主程序端在拿到数据后开始推送数据到客户端
代码:
这是webservice端的一个Job, 由spring定时触发,看配置:
这个任务会定时触发刚那个Job的execute方法,在这个方法中,会调用webservice端的接口
SignoutNoticeService 中定义的方法,该接口的实现类在我们的主程序端,而不是webservice端。
看主程序端是如何实现webservice这个SignoutNoticeService 接口中的方法并实现推送的
可以看到这个实现类的头部注解,这个地方是关键,webservice端的数据给到了主程序端,虽然我还不明白,哈哈(可能是个长连接)。。。
实现类的方法中,调用了主程序端定义的服务器推送类SignoutNotice,这个类实现了dwr的服务器推送所需要的操作。
这个类需要在dwr.xml配置文件中进行配置,作为一个ajax类,dwr的ajax就不讲解了。
要实现dwr的reverseAjax,在上面这个类中已经用到了方法util.addFunctionCall("AlertSignoutNoticeTourBooking", bookId);其中AlertSignoutNoticeTourBooking就是在页面上定义的一个js方法,这个方法实现提醒服务,它是由服务器端调用的,就是说,服务器端调用客户端的方法。
在客户端,我们需要进行如下的初始化才能实现dwr的服务器推送功能:
dwr.engine.setActiveReverseAjax(true); 这句是dwr实现服务器推送必不可少的设置。
以前我有写过一个简单的dwr推送demo,可以去参考。
至此,webservice结合dwr实现服务器推送已经完成的差不多了,在客户端只要有过期的日程,就会被提醒。
客户端需要实时提醒服务,比如某个日程已过期的提醒,并且是刚刚过期的时间(所以是实时),
1. 日程对象放在数据库,由webservice调用得到
2. webservice在拿到数据后必须主动把数据给我的主程序端
3. 主程序端在拿到数据后开始推送数据到客户端
代码:
public class CheckUnsignedBookingJob { private static final Logger log = LoggerFactory.getLogger(CheckUnsignedBookingJob.class); private VisitBookingService visitBookingService; private TourBookingService tourBookingService; private SignoutNoticeService signoutNoticeService; public void execute() { log.debug("CheckUnsignedBookingJob start"); List<VisitBooking> visitBookings = visitBookingService.getUnsignoutedBookingInfo(); log.debug("unsignouted visit booking size: {}", visitBookings.size()); if (!visitBookings.isEmpty()) { for (VisitBooking visitBooking : visitBookings) { log.debug("visit booking number: {}", visitBooking.getBookingNumber()); signoutNoticeService.visitBookingNotSignouted(visitBooking); } } List<TourBooking> tourBookings = tourBookingService.getUnsignoutedBookingInfo(); log.debug("unsignouted tour booking size: {}", tourBookings.size()); if (!tourBookings.isEmpty()) { for (TourBooking tourBooking : tourBookings) { log.debug("tour booking number: {}", tourBooking.getBookingNumber()); signoutNoticeService.tourBookingNotSignouted(tourBooking); } } log.debug("CheckUnsignedBookingJob done"); } public void setVisitBookingService(VisitBookingService visitBookingService) { this.visitBookingService = visitBookingService; } public void setTourBookingService(TourBookingService tourBookingService) { this.tourBookingService = tourBookingService; } public void setSignoutNoticeService(SignoutNoticeService signoutNoticeService) { this.signoutNoticeService = signoutNoticeService; } }
这是webservice端的一个Job, 由spring定时触发,看配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-lazy-init="true"> <bean id="checkUnsignedBookingJobCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.XXX.tourbooking.job.CheckUnsignedBookingJob"> <property name="visitBookingService" ref="visitBookingServiceImpl" /> <property name="tourBookingService" ref="tourBookingServiceImpl" /> <property name="signoutNoticeService" ref="signoutNoticeService" /> </bean> </property> <property name="targetMethod"> <value>execute</value> </property> </bean> </property> <property name="cronExpression"> <value>0 0/30 * * * ?</value> </property> </bean> <!-- startQuertz --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="checkUnsignedBookingJobCronTrigger" /> </list> </property> </bean> </beans>
这个任务会定时触发刚那个Job的execute方法,在这个方法中,会调用webservice端的接口
SignoutNoticeService 中定义的方法,该接口的实现类在我们的主程序端,而不是webservice端。
@WebService public interface SignoutNoticeService { void visitBookingNotSignouted(VisitBooking visitBooking); void tourBookingNotSignouted(TourBooking tourBooking); }
看主程序端是如何实现webservice这个SignoutNoticeService 接口中的方法并实现推送的
@Service("signoutNoticeService") @WebService(endpointInterface = "com.XXX.tourbooking.service.SignoutNoticeService") public class SignoutNoticeServiceImpl implements SignoutNoticeService { private static final Logger log = LoggerFactory.getLogger(SignoutNoticeServiceImpl.class); public void visitBookingNotSignouted(final VisitBooking visitBooking) { log.info("signoutTimeoutVisitBookingPopup call.."); log.info("SignoutNotice size: {}", SignoutNotice.signoutNoticeList.size()); if (SignoutNotice.signoutNoticeList.size() > 0) { SignoutNotice notice = SignoutNotice.signoutNoticeList .get(SignoutNotice.signoutNoticeList.size() - 1); log.info("SignoutNotice: {}", notice); if (notice != null) { notice.signoutTimeoutVisitBookingPopup(visitBooking.getId()); } } } public void tourBookingNotSignouted(final TourBooking tourBooking) { log.info("signoutTimeoutTourBookingPopup call.."); log.info("signoutNoticeList size: {}", SignoutNotice.signoutNoticeList.size()); if (SignoutNotice.signoutNoticeList.size() > 0) { SignoutNotice notice = SignoutNotice.signoutNoticeList .get(SignoutNotice.signoutNoticeList.size() - 1); log.info("SignoutNotice: {}", notice); if (notice != null) { notice.signoutTimeoutTourBookingPopup(tourBooking.getId()); } } } }
可以看到这个实现类的头部注解,这个地方是关键,webservice端的数据给到了主程序端,虽然我还不明白,哈哈(可能是个长连接)。。。
实现类的方法中,调用了主程序端定义的服务器推送类SignoutNotice,这个类实现了dwr的服务器推送所需要的操作。
public class SignoutNotice { private static final Logger log = Logger.getLogger(SignoutNotice.class); public static List<SignoutNotice> signoutNoticeList = new ArrayList<SignoutNotice>(); private String[] pushRoleId = new String[] { "1", "2" }; private Collection<ScriptSession> sessions = new ArrayList<ScriptSession>(); public SignoutNotice() { log.info("new SignoutNotice..."); signoutNoticeList.add(this); } public void signoutTimeoutVisitBookingPopup(String bookId) { log.info("signoutTimeoutVisitBookingPopup ajax call....."); Collection filterSessions = filterScriptSessionByRoleId(sessions); log.info("signoutTimeoutVisitBookingPopup sessions.size(): " + sessions.size()+" filterSessions.size():"+filterSessions.size()); Util util = new Util(filterSessions); util.addFunctionCall("AlertSignoutNoticeVisitBooking", bookId); } public void signoutTimeoutTourBookingPopup(String bookId) { log.info("signoutTimeoutTourBookingPopup ajax call....."); Collection filterSessions = filterScriptSessionByRoleId(sessions); log.info("signoutTimeoutTourBookingPopup sessions.size(): " + sessions.size()+" filterSessions.size():"+filterSessions.size()); Util util = new Util(filterSessions); util.addFunctionCall("AlertSignoutNoticeTourBooking", bookId); } public void init(String roleId) { log.info("init ....."); WebContext wctx = WebContextFactory.get(); ScriptSession scriptSession = wctx.getScriptSession(); log.info("roleId: " + roleId); scriptSession.setAttribute("roleId", roleId); sessions.add(scriptSession); } public Collection filterScriptSessionByRoleId(Collection<ScriptSession> sessions) { Collection filterSessions = new ArrayList(); for (ScriptSession scriptSession : sessions) { String roleId = (String) scriptSession.getAttribute("roleId"); log.info("roleId:" + roleId); for (String id : pushRoleId) { if (id.equals(roleId)) { filterSessions.add(scriptSession); break; } } } return filterSessions; } }
这个类需要在dwr.xml配置文件中进行配置,作为一个ajax类,dwr的ajax就不讲解了。
要实现dwr的reverseAjax,在上面这个类中已经用到了方法util.addFunctionCall("AlertSignoutNoticeTourBooking", bookId);其中AlertSignoutNoticeTourBooking就是在页面上定义的一个js方法,这个方法实现提醒服务,它是由服务器端调用的,就是说,服务器端调用客户端的方法。
在客户端,我们需要进行如下的初始化才能实现dwr的服务器推送功能:
dwr.engine.setActiveReverseAjax(true); SignoutNotice.init(roleId);
dwr.engine.setActiveReverseAjax(true); 这句是dwr实现服务器推送必不可少的设置。
以前我有写过一个简单的dwr推送demo,可以去参考。
至此,webservice结合dwr实现服务器推送已经完成的差不多了,在客户端只要有过期的日程,就会被提醒。
发表评论
-
动态多数据源实现
2019-12-18 12:58 391背景: 目前基于连接了mobile库 从库的 项目(sprin ... -
http简易工具类
2018-09-21 09:20 408http简易工具类, 方便http调用 -
RPC调用之微博 motan
2018-02-23 16:42 1439这边文章将偏实战, 至于motan,可以去了解如何实现、比普通 ... -
微信JSSDK之添加微信卡券
2016-05-31 09:37 713微信卡券的使用,是在之前的微信jsapi基础上,再加上一次卡券 ... -
push数据结构设计
2016-03-14 16:23 1620根据目前使用的极光推送, 设计一个合理的服务端,而且满足一 ... -
安全性,加密
2016-03-07 15:55 611/** * 随机字符串集 */ pri ... -
redis实现并发资源控制--如抢红包、抢优惠券机制
2016-02-20 17:41 8795场景: 如 抢红包、 抢优惠券,都是先到先得 抢红包是把发 ... -
一致性hash算法测试
2014-12-17 18:40 1241因为用memcached集群缓存数据,所以增删服务器节点 对缓 ... -
hibernate延迟加载 与 web应用 独立缓存架构的冲突
2013-04-26 11:03 1087延迟加载(Lazy Loading)是 ... -
jquery验证框架使用
2013-03-27 16:57 12811.使用jquery的表单验证框架,需要导入jquery的库文 ... -
Myeclipse反向生成pojo及hibernate映射文件(由数据库表)
2013-03-18 14:38 1052在这之前请创建一个web工程,然后右键选择myeclipse- ... -
spring定时任务之cronJob
2012-08-21 14:13 1169情景: 数据库中的数据需要根据formula在一定时间上计 ... -
copy到粘贴板
2012-05-22 11:39 1141直接上代码,实现了IE和火狐下的copy content ... -
webService使用总结
2012-04-28 15:08 1218webService 是什么就不解释了,webservice有 ... -
小玩dwr实现服务器推送
2012-01-19 17:01 5548最近项目有需要用到‘推’,就是服务器端自动把消息推给客户端,就 ... -
jquery之事件error小提醒
2011-12-13 15:27 1371今天用到jquery的事件中的error方法,发现当标签img ... -
项目中很强大的两个DAO
2011-12-02 11:37 1251直接贴代码了 public class DaoBase& ... -
小想法
2011-10-17 16:48 0刚才有个想法,不知道是由什么联想而来,最近淘宝大战,看了些文章 ... -
原来这个如此容易 ---- 点击弹出确认框
2011-10-12 15:51 1271今天无意识的看到了点击按钮弹出确认框的 javascri ... -
groovy 小应用
2011-09-30 10:25 1135昨天使用groovy脚本生成大量的sql,实在是爽! 现 ...
相关推荐
基于dwr推送技术,结合jsp技术,webservice天气接口,以及发送表情技术的web聊天系统,识别电脑和手机设备,不足地方请指教,谢谢
dwr java 推送例子 免积分 课用于改造成webservice推送
Ajax结合webService实现的无刷新幻灯片源码
Ajax结合webService实现的无刷新幻灯片源码.zip
Ajax结合webService实现的无刷新幻灯片切换效果!绝对开源!包含完整的CS文件! <br>Ajax结合webService实现的无刷新幻灯片切换效果源码,有暂停、运行、翻页等按钮 数据库文件在DB_51aspx文件夹下,附加即可
参照这个网址http://zhangkui.blog.51cto.com/1796259/497324。实现C#调用WebService实现天气预报获取。完全能用。自己有编译通过。
ASP.NET--WebService实现支付功能
webservice实现的单点登录 webservice实现的单点登录 webservice实现的单点登录 webservice实现的单点登录
WebService实现天气预报,WebService最好的一个例子
调用webservice实现天气查询C#程序
WebService实现步骤(包括WEBSERVICE的demon)
通过idea实现webservice
WebService实现用户注册与登录,连接数据库,在Android端上测试
使用webservice输入城市名称既能插叙到该城市天气预报的功能,
使用Webservice实现大容量附件上传
基于WebService的手机APP消息推送机制研究与实现浅析.pdf
WEBSERVICE调试工具-ESB消息统一推送接口调用说明,内附调试工具,开发webservice接口的同学可以下载
iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下如何结合asp.net webservice实现文件上传下载。
php 实现 webservice