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

结合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实现服务器推送已经完成的差不多了,在客户端只要有过期的日程,就会被提醒。
分享到:
评论
1 楼 csdn_zuoqiang 2014-03-10  
能否看下DWR的配置情况?谢谢

相关推荐

    基于DWR推送的web聊天系统

    通过DWR,它可以实现实时的聊天消息推送,无需用户手动刷新页面;JSP负责后台逻辑和页面生成;Webservice接口则扩展了服务功能,增加了天气查询;而发送表情和设备识别则提升了用户交互性和适应性。这样的系统对于...

    泛微 ecology9.0 第三方系统消息推送接口调用文档 .docx

    泛微Ecology9.0平台提供了Webservice接口推送机制,允许开发者通过Webservice调用该接口,实现消息的推送和处理。该接口提供了发送消息、修改消息业务状态和删除消息等功能,满足业务系统的需求。 五、 消息来源...

    WEBSERVICE调试工具-ESB消息统一推送接口调用说明.doc

    WEBSERVICE调试工具-ESB消息统一推送接口调用说明 本文档主要介绍了WEBSERVICE调试工具的使用,旨在帮助开发WEBSERVICE接口的同学更好地理解和使用ESB消息统一推送接口。该接口用于短信、微信等渠道的消息统一推送...

    Ajax结合webService实现的无刷新幻灯片切换效果

    Ajax结合webService实现的无刷新幻灯片切换效果!绝对开源!包含完整的CS文件! &lt;br&gt;Ajax结合webService实现的无刷新幻灯片切换效果源码,有暂停、运行、翻页等按钮 数据库文件在DB_51aspx文件夹下,附加即可

    Ajax结合webService实现的无刷新幻灯片源码.zip

    **Ajax与WebService结合实现无刷新幻灯片技术详解** 在Web开发中,用户界面的交互性和用户体验是至关重要的。传统的网页交互方式往往需要通过页面的完整刷新来更新内容,这可能导致用户界面的瞬间跳转,影响用户...

    基于WebService的手机APP消息推送机制研究与实现浅析.pdf

    【基于WebService的手机APP消息推送机制】是一种在智能手机应用程序中实现信息实时传递的技术。随着智能移动终端的广泛应用,用户对于获取校园信息和办理业务的需求日益增强。传统的信息化门户已无法满足这种需求,...

    WebService实现支付功能(ASP.NET)

    ASP.NET--WebService实现支付功能

    基于WebService的手机APP消息推送机制研究.pdf

    论文中提到的基于WebService的消息推送机制,旨在通过WebService的异构系统间交互技术,实现在移动电话应用程序之间传输消息,构建一站式服务,便于校园网络服务平台的运营。WebService是一个平台独立、低耦合、自我...

    WebService实现步骤(包括WEBSERVICE的demon)

    WebService 实现步骤(包括 WEBSERVICE 的 DEMO) WebService 是一种基于网络的软件系统,使用标准的 Web protocols 进行通信,能够提供跨语言、跨平台的软件应用程序之间的交互,使得不同的应用程序能够相互调用和...

    C#调用WebService实现天气预报

    本示例中,我们将探讨如何利用C#调用WebService来获取天气预报信息。这个过程涉及到网络通信、XML数据解析以及对第三方API的集成。 首先,我们需要理解WebService的工作原理。WebService是一种基于HTTP协议的远程...

    WebService实现天气预报

    【WebService实现天气预报】 在IT领域,WebService是一种基于标准的、平台无关的、可以在互联网上进行通信的技术。它允许不同的应用程序之间交换数据和服务,从而打破了系统间的壁垒,实现了跨平台的信息共享。本...

    WebService的几种不同实现方式

    虽然WebService被广泛认为是SOA的一个实现方式,但它并不是SOA的全部。SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-...

    调用webservice实现天气查询C#程序

    本文将深入探讨如何使用C#语言调用WebService来实现天气查询功能。 首先,我们需要理解什么是WebService。WebService是一种基于互联网的、平台无关的分布式计算模型,它允许不同的应用程序之间通过HTTP协议交换数据...

    jdk 6.0 自带webservice实现 实例

    "JDK 6.0 自带 Webservice 实现实例" JDK 6.0 自带 Webservice 实现实例是使用 JDK 自带的功能来实现 Webservice 的一个示例。这个示例展示了如何使用 JDK 6.0 中自带的轻量级 Webservice 服务器来发布一个简单的 ...

    用WebService实现对数据库进行操作(添加+删除+修改)

    ### 使用WebService实现对数据库进行操作(添加、删除、修改) #### 概述 在现代软件开发过程中,Web服务(WebService)被广泛应用于不同系统之间的数据交互和服务调用。通过WebService,客户端可以远程调用服务器...

    java实现webservice实例.doc

    "Java实现WebService实例" WebService是基于XML的、分布式的、跨语言的应用程序通信协议。它允许不同的应用程序之间进行交互和集成,从而实现业务逻辑的复杂交互。Java是其中一种常用的实现WebService的语言。 在...

    WebService实现一个增删查改的接口服务(亲测可用)

    通过以上步骤,我们可以成功地使用WebService技术实现一个增删查改的接口服务,并结合C3P0和MySQL数据库进行实际操作。这个服务可以被任何支持SOAP协议的客户端调用,实现了不同系统间的数据交换。在实际应用中,...

    Android中调用Webservice实现号码归属地查询案例

    如果是代码示例,里面可能包含了Android客户端调用Webservice的实现细节,如请求构建、数据解析等;如果是数据库文件,可能存储了号码归属地数据,供本地查询使用;如果是一个类库,可能是封装了网络请求和解析逻辑...

    Idea实现WebService实例

    【标题】:Idea实现WebService实例 在Java开发中,WebService是一种常见的跨平台、跨语言的通信方式,它允许不同的应用程序之间交换数据。IntelliJ IDEA(简称Idea)是广受欢迎的Java集成开发环境,提供了强大的...

Global site tag (gtag.js) - Google Analytics