BSTEK Development Framework2(BDF2) : 4.2.JOB集群

      标准的BDF2-JOB模块是不支持JOB集群的,如果我们的包含JOB的应用需要集群部署,同时又需要JOB能够集群环境下依次运行,那么我们可以将BDF2当中提供的BDF2-JOB-DAEMON模块加入到项目当中,这样我们的项目中的JOB在运行时就支持集群了。

      BDF2-JOB-DAEMON模块的JAR,我们可以到http://nexus.bsdn.org上下载,或从我们提供的在线项目向导中选择BDF2-JOB-DAEMON模块后再下载,同样,如果您采用的是Maven来管理您的项目,那么只需要将下面这段dependency加入到我们项目的pom.xm中即可:

JOB-DAEMON模块依赖的添加
<dependency>
  <groupId>com.bstek.bdf2</groupId>
  <artifactId>bdf2-job-daemon</artifactId>
  <version>2.0.0</version>
</dependency>

      打开WEB-INF/dorado-home目录下的configure.properties文件,在其中添加一名为bdf2.jobApplicationName的属性,这个属性的值决定当前JOB应用的名称,比如我们这里配置为bdf2.jobApplicationName=jobtestapp,表示当前包含JOB的应用名称为jobtestapp;同时还需要添加bdf2.runJobInCurrentInstance参数,将其值设置成false,表示JOB模块自己不启动服务,服务是否启动交由job-daemon模块负责。项目准备好之后,就可以启动了,包含BDF2-JOB-DAEMON模块的项目启动时我们可以在控制台看到如下所示的异常:

包含BDF2-JOB-DAEMON模块的项目启动时产生的异常信息
Caused by: java.lang.RuntimeException: You need config a named [jobtestapp.jobInstanceName] system property when use bdf2-job-daemon module!
	at com.bstek.bdf2.job.daemon.detection.InstanceDetection.afterPropertiesSet(InstanceDetection.java:97)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
	... 23 more

      从异常信息的描述来看,在使用BDF2-JOB-DAEMON模块前我们需要在配置一个名为jobtestapp.jobInstanceName的系统参数,也就是在当前运行的应用服务器当中配置一个JVM参数,可以看到这个参数名采用的是bdf2.jobApplicationName属性值+".jobInstanceName"的命名方式,这个参数配置好之后,在JAVA代码当中可以通过System.getProperty(propertyKey)来获取,对于在应用服务器当中配置一个JVM参数,对于不同应用服务器配置方法都不相同,所以在配置时我们需要查询该应用服务器手册,了解配置方法。

      我们这里采用的是Eclipse WTP中提供的Tomcat7作为应用服务器,它的配置方法是首先双击应用服务器名称,打开配置界面,如下图所示:

      如上图所示,打开配置窗口之后,我们需要单击上图中用红色框标记的链接,在弹出的窗口中添加如下图所示的配置信息即可。

      如上图所示,我们将这个名为jobtestapp.jobInstanceName的变量值定义为"jacky",变量配置完成之后,启动我们的应用,系统还是会抛出一个异常提示,如下所示:

异常提示消息
Caused by: java.lang.RuntimeException: Use [bdf2-job-daemon] module you need define a named [bdf2.jobDaemon.instanceNames] property!
	at com.bstek.bdf2.job.daemon.detection.InstanceDetection.initJobDetail(InstanceDetection.java:73)
	at com.bstek.bdf2.job.daemon.detection.InstanceDetection.startDaemonJob(InstanceDetection.java:49)
	at com.bstek.bdf2.job.daemon.detection.InstanceDetection.afterPropertiesSet(InstanceDetection.java:99)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
	... 23 more

      异常提示我们使用JOB-DAEMON模块我们还需要配置一个名为bdf2.jobDaemon.instanceNames的参数,这个参数的作用是告诉系统当前应用的集群中有多少个实例,各个实例的实例名又是什么,注意这里要填写的实例名就是我们之前在JVM环境中配置的名为jobInstanceName的变量值,比如我们刚定义的"jacky"。需要注意的是这里定义的实例名一定是一个以上,只有一个以上的实例才能算是集群。这里在定义多个实例名时要以逗号分隔,同时定义的实例名顺序,也就决定了集群JOB在运行时的顺序。打开WEB-INF\dorado-home下的configure.properties文件,在其中添加名为bdf2.jobDaemon.instanceNames属性,值为“jacky,tom”,如下图所示:

      我们将bdf2.jobDaemon.instanceNames属性值定义为“jacky,tom”,那就表示在集群当中名为jacky的实例上部署的JOB应用最先运行,一旦名为jacky的实例上部署的应用中JOB服务停了,那么实例名为tom上的JOB应用会将运行JOB的任务接过来继续运行,依次类推。

      JOB-DAEMON模块除了可以提供集群JOB服务的运行管理之外,它还可以提供单应用模式下,JOB服务守护的作用。默认JOB-DAEMON所起的是集群环境下JOB服务的心跳检测功能,如果我们需要它在单应用模式下来守护我们的JOB服务,那需要在configure.properties文件当中添加一个名为bdf2.jobDaemon.detectionMode的属性,并将其值设置为daemon,这个属性默认值为heartbeat,表示为集群环境下的JOB提供心跳检测服务,一旦改成daemon,那它只能为单应用中的JOB服务了,这样,一旦这个应用当中的JOB服务挂了,这个守护线程会马上检测到,并自动将JOB服务重启。当然一般情况下,对于单应用环境中,JOB服务的守护不是很有必要。

Attachments:

wtp-config.png (image/png)
jvm-parameter.png (image/png)
prop-config.png (image/png)
prop-config.png (image/png)
jvm-parameter.png (image/png)
prop-config.png (image/png)