- 浏览: 115502 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 447背景: 目前基于连接了mobile库 从库的 项目(sprin ... -
http简易工具类
2018-09-21 09:20 456http简易工具类, 方便http调用 -
RPC调用之微博 motan
2018-02-23 16:42 1512这边文章将偏实战, 至于motan,可以去了解如何实现、比普通 ... -
微信JSSDK之添加微信卡券
2016-05-31 09:37 778微信卡券的使用,是在之前的微信jsapi基础上,再加上一次卡券 ... -
push数据结构设计
2016-03-14 16:23 1707根据目前使用的极光推送, 设计一个合理的服务端,而且满足一 ... -
安全性,加密
2016-03-07 15:55 660/** * 随机字符串集 */ pri ... -
redis实现并发资源控制--如抢红包、抢优惠券机制
2016-02-20 17:41 8856场景: 如 抢红包、 抢优惠券,都是先到先得 抢红包是把发 ... -
一致性hash算法测试
2014-12-17 18:40 1314因为用memcached集群缓存数据,所以增删服务器节点 对缓 ... -
hibernate延迟加载 与 web应用 独立缓存架构的冲突
2013-04-26 11:03 1134延迟加载(Lazy Loading)是 ... -
jquery验证框架使用
2013-03-27 16:57 13231.使用jquery的表单验证框架,需要导入jquery的库文 ... -
Myeclipse反向生成pojo及hibernate映射文件(由数据库表)
2013-03-18 14:38 1088在这之前请创建一个web工程,然后右键选择myeclipse- ... -
spring定时任务之cronJob
2012-08-21 14:13 1213情景: 数据库中的数据需要根据formula在一定时间上计 ... -
copy到粘贴板
2012-05-22 11:39 1183直接上代码,实现了IE和火狐下的copy content ... -
webService使用总结
2012-04-28 15:08 1269webService 是什么就不解释了,webservice有 ... -
小玩dwr实现服务器推送
2012-01-19 17:01 5607最近项目有需要用到‘推’,就是服务器端自动把消息推给客户端,就 ... -
jquery之事件error小提醒
2011-12-13 15:27 1418今天用到jquery的事件中的error方法,发现当标签img ... -
项目中很强大的两个DAO
2011-12-02 11:37 1297直接贴代码了 public class DaoBase& ... -
小想法
2011-10-17 16:48 0刚才有个想法,不知道是由什么联想而来,最近淘宝大战,看了些文章 ... -
原来这个如此容易 ---- 点击弹出确认框
2011-10-12 15:51 1302今天无意识的看到了点击按钮弹出确认框的 javascri ... -
groovy 小应用
2011-09-30 10:25 1184昨天使用groovy脚本生成大量的sql,实在是爽! 现 ...
相关推荐
通过DWR,它可以实现实时的聊天消息推送,无需用户手动刷新页面;JSP负责后台逻辑和页面生成;Webservice接口则扩展了服务功能,增加了天气查询;而发送表情和设备识别则提升了用户交互性和适应性。这样的系统对于...
泛微Ecology9.0平台提供了Webservice接口推送机制,允许开发者通过Webservice调用该接口,实现消息的推送和处理。该接口提供了发送消息、修改消息业务状态和删除消息等功能,满足业务系统的需求。 五、 消息来源...
WEBSERVICE调试工具-ESB消息统一推送接口调用说明 本文档主要介绍了WEBSERVICE调试工具的使用,旨在帮助开发WEBSERVICE接口的同学更好地理解和使用ESB消息统一推送接口。该接口用于短信、微信等渠道的消息统一推送...
Ajax结合webService实现的无刷新幻灯片切换效果!绝对开源!包含完整的CS文件! <br>Ajax结合webService实现的无刷新幻灯片切换效果源码,有暂停、运行、翻页等按钮 数据库文件在DB_51aspx文件夹下,附加即可
**Ajax与WebService结合实现无刷新幻灯片技术详解** 在Web开发中,用户界面的交互性和用户体验是至关重要的。传统的网页交互方式往往需要通过页面的完整刷新来更新内容,这可能导致用户界面的瞬间跳转,影响用户...
【基于WebService的手机APP消息推送机制】是一种在智能手机应用程序中实现信息实时传递的技术。随着智能移动终端的广泛应用,用户对于获取校园信息和办理业务的需求日益增强。传统的信息化门户已无法满足这种需求,...
ASP.NET--WebService实现支付功能
论文中提到的基于WebService的消息推送机制,旨在通过WebService的异构系统间交互技术,实现在移动电话应用程序之间传输消息,构建一站式服务,便于校园网络服务平台的运营。WebService是一个平台独立、低耦合、自我...
WebService 实现步骤(包括 WEBSERVICE 的 DEMO) WebService 是一种基于网络的软件系统,使用标准的 Web protocols 进行通信,能够提供跨语言、跨平台的软件应用程序之间的交互,使得不同的应用程序能够相互调用和...
本示例中,我们将探讨如何利用C#调用WebService来获取天气预报信息。这个过程涉及到网络通信、XML数据解析以及对第三方API的集成。 首先,我们需要理解WebService的工作原理。WebService是一种基于HTTP协议的远程...
【WebService实现天气预报】 在IT领域,WebService是一种基于标准的、平台无关的、可以在互联网上进行通信的技术。它允许不同的应用程序之间交换数据和服务,从而打破了系统间的壁垒,实现了跨平台的信息共享。本...
虽然WebService被广泛认为是SOA的一个实现方式,但它并不是SOA的全部。SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-...
本文将深入探讨如何使用C#语言调用WebService来实现天气查询功能。 首先,我们需要理解什么是WebService。WebService是一种基于互联网的、平台无关的分布式计算模型,它允许不同的应用程序之间通过HTTP协议交换数据...
"JDK 6.0 自带 Webservice 实现实例" JDK 6.0 自带 Webservice 实现实例是使用 JDK 自带的功能来实现 Webservice 的一个示例。这个示例展示了如何使用 JDK 6.0 中自带的轻量级 Webservice 服务器来发布一个简单的 ...
### 使用WebService实现对数据库进行操作(添加、删除、修改) #### 概述 在现代软件开发过程中,Web服务(WebService)被广泛应用于不同系统之间的数据交互和服务调用。通过WebService,客户端可以远程调用服务器...
"Java实现WebService实例" WebService是基于XML的、分布式的、跨语言的应用程序通信协议。它允许不同的应用程序之间进行交互和集成,从而实现业务逻辑的复杂交互。Java是其中一种常用的实现WebService的语言。 在...
通过以上步骤,我们可以成功地使用WebService技术实现一个增删查改的接口服务,并结合C3P0和MySQL数据库进行实际操作。这个服务可以被任何支持SOAP协议的客户端调用,实现了不同系统间的数据交换。在实际应用中,...
如果是代码示例,里面可能包含了Android客户端调用Webservice的实现细节,如请求构建、数据解析等;如果是数据库文件,可能存储了号码归属地数据,供本地查询使用;如果是一个类库,可能是封装了网络请求和解析逻辑...
【标题】:Idea实现WebService实例 在Java开发中,WebService是一种常见的跨平台、跨语言的通信方式,它允许不同的应用程序之间交换数据。IntelliJ IDEA(简称Idea)是广受欢迎的Java集成开发环境,提供了强大的...