创建schedule文件
该文件配置任务处理的bean,调度服务器配置bean以及事务配置bean
<beans default-autowire="byName"> <!-- 任务处理类 --> <bean id="taskSingle" class="schedule.TaskSingle" init-method="init" lazy-init="false" depends-on="tbScheduleManagerFactory"> <property name="dataSource"> <ref bean="schedule_source" /> </property> <property name="taskType" value="PamirsScheduleTest"></property> <property name="ownSign" value="BASE"></property> </bean> <!-- 调度服务器配置 --> <bean id="scheduleConfigCenter" class="com.taobao.pamirs.schedule.ScheduleConfigCenterClientByDatabase"> <property name="dataSource"> <ref bean="schedule_source" /> </property> <property name="tableMap"> <map> <entry key="pamirs_schedule_queue"> <value>PAMIRS_SCHEDULE_QUEUE</value> </entry> <entry key="pamirs_schedule_server"> <value>PAMIRS_SCHEDULE_SERVER</value> </entry> <entry key="pamirs_schedule_tasktype"> <value>PAMIRS_SCHEDULE_TASKTYPE</value> </entry> </map> </property> </bean> <bean id="tbScheduleManagerFactory" class="com.taobao.pamirs.schedule.TBScheduleManagerFactory" init-method="init" lazy-init="false"> <property name="scheduleConfigCenter"> <ref bean="scheduleConfigCenter" /> </property> </bean> </beans>
到这里schedule demo的配置基本已完成,最后需要统一配置文件将上述文件包含进来,对了就是spring.xml
(注:这里我们的任务bean id为taskSingle,这对应着我们数据库schedule的pamirs_schedule_tasktype字段DEAL_BEAN_NAME)
JUNIT单元测试运行任务
在部署应用前我们先进行junit单元测试,观察schedule执行任务的处理情况,我们在src/test/java原目录下创建PamirsScheduleTest.java
@ContextConfiguration(locations = { "classpath:spring.xml" }) public class PamirsScheduleTest extends AbstractJUnit4SpringContextTests { @Test public void testRunData() throws Exception { int threadNum = 0; for (int i = 0; i < threadNum; i++) { TBScheduleManagerFactory.createTBScheduleManager( "PamirsScheduleTest", "BASE"); } Thread.sleep(10000000); } }
执行JUNIT测试,控制台打印如下信息,可知schedule已在正常处理任务了。
运行应用程序
将应用程序发布到 Tomcat或者Jetty容器(80端口),再通过 http://localhost:5168 访问。
如果一切正常,我们将页面拉至最下可得到如下页面信息:
这也就是应用暴露的schedule的JMX入口了,我们可以实时控制调度服务的创建和停止。
到此最基础的schedule应用就已经完成了,如果多台机器部署了该应用,我们可以在数据观察schedule表的一些动态信息,感受schedule分布式处理任务的功能,这里主要讲述schedule应用实例,其他内容这里就不赘述了。
web service概念
Web服务是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。
为什么要让schedule提供web服务
schedule为多主机提供共同处理任务的能力,由于其应用承载着巨大的数据处理责任,我们有必要监控schedule的运行状态,实时跟踪运行的任务是否存在异常状况。Schedule2.0已经支持WEB服务,并专门提供了服务调用接口。下图为初步的监控设计。
下面简单接着上面的demo讲解如何把应用的schedule web服务接口暴露出来
web.xml增加CXF配置:
<!-- Apache CXFServlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- CXFServlet Mapping --> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
增加schedule-ws-server.xml文件
<?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:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- Import Apache CXF Bean Definition --> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <!-- Expose WebService --> <jaxws:server id="scheduleWebService" serviceClass="com.taobao.pamirs.schedule.IScheduleClient" address="/ScheduleWebService"> <jaxws:serviceBean> <ref bean="scheduleConfigCenter" /> <!-- 要暴露的 bean 的引用 --> </jaxws:serviceBean> </jaxws:server> </beans>
最后在spring.xml文件中将该文件引入即可。
<beans default-autowire="byName"> <import resource="db4MySql.xml" /> <import resource="mbean-config.xml" /> <import resource="schedule-ws-server.xml" /> <import resource="schedule.xml" /> </beans>
配置完成后我们运行应用,通过 http://localhost /ScheduleWebService?wsdl 访问。
如果一切正常,我们将看到xml形式暴露出来的schedule接口信息。
如果监控的web应用开启,那么监控页面上会出现我们部署schedule demo应用服务器的调度信息,如下图: