EAServer 使用ThreadManager创建服务组件

一、为什么要使用ThreadManager创建服务组件?

熟悉pb开发组件的人,肯定发现了,用pb就可以直接创建并发布服务类型组件,这种服务类型的组件实现了start(), stop(), run()三个借口方法,一旦这种类型的组件发布到eas,当eas服务器重新启动的时候,eas将自动创建这个组件的实例,然后调用start()方法,start()方法执行完毕,将自动调用run()方法,你可以在run()方法里写一个无限循环语句用来执行你想要的功能,但你还需要在每循环一次后,调用jagSleep()函数让当前线程休息一会时间,目的就是把cpu时间让给其他的组件或则线程,千万记住,不要在run方法中调用Yield方法,这会导致整个eas停止执行,导致灾难性的后果。

这种服务组件的一个最大缺点,就是一旦服务开始执行,你就没有办法停掉,因为pb的虚拟机是没有真正多线程的。这样一来,你就会在重新服务组件和同步服务器的时候,遇到麻烦,因为组件无法停止运行,会出现无法更新组件的问题。

当然,如果你确定你的组件一旦发布后,将来不需要更新,你完全可以使用这种类型的组件。尽管如此,我还是强烈建议你不要使用这种服务组件,而是改用ThreadManager来创建服务类型的组件。

二、如果来做?

使用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定期去调用我的这个组件,以实现服务组件的功能呢?

对了,就是使用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组件就会失败。

转载于:https://my.oschina.net/u/1464512/blog/916739

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值