1、为何要使用ThreadManager建立服务组件?java
熟悉pb开发组件的人,确定发现了,用pb就能够直接建立并发布服务类型组件,这种服务类型的组件实现了start(), stop(), run()三个借口方法,一旦这种类型的组件发布到eas,当eas服务器从新启动的时候,eas将自动建立这个组件的实例,而后调用start()方法,start()方法执行完毕,将自动调用run()方法,你能够在run()方法里写一个无限循环语句用来执行你想要的功能,但你还须要在每循环一次后,调用jagSleep()函数让当前线程休息一会时间,目的就是把cpu时间让给其余的组件或则线程,千万记住,不要在run方法中调用Yield方法,这会致使整个eas中止执行,致使灾难性的后果。服务器
这种服务组件的一个最大缺点,就是一旦服务开始执行,你就没有办法停掉,由于pb的虚拟机是没有真正多线程的。这样一来,你就会在从新服务组件和同步服务器的时候,遇到麻烦,由于组件没法中止运行,会出现没法更新组件的问题。多线程
固然,若是你肯定你的组件一旦发布后,未来不须要更新,你彻底可使用这种类型的组件。尽管如此,我仍是强烈建议你不要使用这种服务组件,而是改用ThreadManager来建立服务类型的组件。并发
2、若是来作?函数
使用ThreadManager建立服务组件,你必需要建立一个普通组件,这个组件必须实现ctsComponents/ThreadBase接口,这个接口只有一个方法,就是void run()方法,和pb的上面说的服务组件不一样的是,你不用在这个run方法里写无限循环代码用来不停执行你想要的业务处理,你要写业务处理过程,ThreadManager会自动按照你设置的时间间隔循环调用run方法。线程
好了,下面就跟我来作,开始建立实现ctsComponents/ThreadBase接口的组件。在pb中点新建eas组件,组件类型要选标准组件,在向导的Specify Interface Implementation中选择Implement an Existing EAServer Remote Interface,而后在Select Remote Interface中找到ctsComponents包下的ThreadBase,后面的根据你的状况,能够作适当调整,向导完成后,将会建立pb组件对象,双击开打编辑这个对象,你会发现,这个对象里只有一个函数,就是run。你只要在这里写上你想要的业务逻辑代码就能够了,再次提醒你,不要再这个run里写无限循环代码,保证代码执行一次就能够正常退出run函数。完成后,发布组件就能够了。对象
还有一个方法,就是本身随便新建一个组件,而后在组件里添加void run()方法,也是能够的,这样是否是更简单一些?接口
好了,有了组件了,那如何能让ThreadManager按期去调用个人这个组件,以实现服务组件的功能呢?ci
对了,就是使用ThreadManager这个组件的方法,这个组件一样在ctsComponents这个包里。查看ctsComponents/ThreadManager的接口定义,能够看到,这个组件实现了以下几个方法,基本上能够说成对出现的:开发
start和stop,这两个函数用来开始和中止一个线程,也就是咱们上面说的服务组件
suspend和resume,这两个函数用来挂起和继续执行线程
getRunInterval和setRunInterval,这两个函数用来得到和设置两次调用run方法之间的间隔,单位是秒
getThreadCount和setThreadCount,这两个函数用来设置线程的个数,也就是同时有多少个线程
其中,setRunInterval方法须要提供一个时间间隔,单位是秒,这个参数的解释以下:
大于0,表示每隔这么多秒执行一次run方法
等于0,表示不停地调用run方法,没有时间间隔
等于-1,表示run方法仅调用一次
上述几个函数中,还有一个参数的含义是同样的,就是线程组。
例如:setRunInterval(string group, long seconds)第一个参数就是线程组,ctsComponents/ThreadManager就是经过这个线程组来表示某一个线程的。因此,这个线程组名称必定要惟一,不能冲突。
好了,到这里,咱们也该正式开始实现咱们的服务组件了
这里,咱们假设上面那个想做为服务组件运行的组件的组件名称为n_work,组件包名为TM_pkg,咱们接下将讲解如何实现服务组件的方法。
既然要调用ctsComponents/ThreadManager的方法,咱们就必需要建立ctsComponents/ThreadManager的实例,建立ctsComponents/ThreadManager组件实例和建立普通组件方法同样,你能够在客户端建立组件实例,也能够在其余的组件内部经过组件间调用来建立ctsComponents/ThreadManager组件实例,如今咱们假设无论经过什么方法,你已经建立了ctsComponents/ThreadManager组件实例,这个组件实例的变量叫 tm。
你只须要添加如下代码:
//建立n_work的组件实例,变量名叫in_work,你一样能够经过组件间调用建立这个实例
tm.setThreadCount("my_first", 1)
tm.setRunInterval("my_first", 10)
tm.start("my_first", in_work)
上述代码的含义以下:
tm.setThreadCount("my_first", 1),这句代码设置同时启动的线程个数,由于pb虚拟机没有真正的多线程,因此,这里的第二个参数只能是1,切记!!!若是是java或则C++实现的组件,你能够设置第二个参数大于1
tm.setRunInterval("my_first", 10),这句代码设置两次执行run方法的时间间隔为10秒
tm.start("my_first", in_work),这句代码就是将组件n_work做为线程的执行对象进行执行。
你可能会问了,既然使用pb组件,tm.setThreadCount("my_first", 1)的第二个参数只能为1,那若是我想启动多个线程怎么办呢?答案是很容易,上面不是说到ctsComponents/ThreadManager是经过线程组来肯定某一个线程的吗?既然对于pb组件,一个线程组只能启动一个线程,那咱们就能够启动多个线程组来实现pb组件的多线程话,方法就是建立多个n_work组件的实例,例如in_work[10],而后
int i
for i=1 to 10
tm.setThreadCount("my_first_"+string(i), 1)
tm.setRunInterval("my_first_"+string(i), 10)
tm.start("my_first_"+string(i), in_work[i])
next
就能够了!
好了,如今,你就能够动手实现你本身的真正多线程的服务组件了。
最后,须要注意的是,要实例化ctsComponents/ThreadManager组件,你必须具备admin的权限,默认状况下,jagadmin用户具备admin权限,另外,若是ctsComponents/ThreadManager是在另一个组件中经过组件间调用实例化的,则默认也是具备admin权限的。这点要记住,不然实例化ctsComponents/ThreadManager组件就会失败。