您的位置:首页 > 编程语言

play框架如何重用代码及发现的问题

2015-11-26 10:47 274 查看
记得上个月读过一篇关于play框架如何重用代码的文章,后来怎么也找不到了。这个月做了一些尝试,效果还是比较明显的,今天做一下总结。

1、play框架默认分Control、models、views三部分,直接用,开发速度是挺快,但是存在一个大的问题:代码如何共用的问题。

首先可重用的代码一般变化频率是比较低的,这部分抽出来比较好,将来好维护,也容易重用。

(1)一些公共逻辑代码如果都放到Control里,很难重用,而且这里面的代码经常随着界面的变化而变化,修改频率很高。

(2)公共逻辑代码放到models里,对象太大,models里面的类经常性的变动,修改频率也很高。

我新建一个中间的逻辑层包,下面放逻辑类,然后把可重用的逻辑都放这里面,这样修改的频率小、可重用性高,比前面的两种办法都要好很多。

可是发现一问题:

这个中间逻辑类里面的函数,究竟是要不要弄成static,play框架本身将很多方法设成静态的,就是为了避免对象的频繁创建,这些方法都是被重复使用的,所以这些方法里面一般情况下是不能加锁的。特别是在controller的action中,使用锁和线程要特别小心,最好不要使用。这是因为play在处理多个请求时,实际上是复用一个线程,而不像很多平台框架,都是每个请求建一个线程。play框架就是为了避免对象、方法的频繁创建,节约这部分资源。

那么一个新问题又来了:我写的这个逻辑类,究竟要不要用static?

目前没有这方面的经验和资料,我先按照play的逻辑来处理吧,毕竟这样做,节约了频繁创建类和对象的步骤,速度绝对会快。

如果哪一天真需要加锁和开线程的话,那么我可以讲函数的static去掉,对象引用一下就OK了。这篇文章我先留在这里,再过几个月,看看这样做有多少好处。

备注一下另外的资料:以下这种方式在Controller就不能用。

public class TestC extends Controller{
public static void t(){
synchronized(TestC.class){
Thread.sleep(10000);
}
ok();
}

public static void t2(){
ok();
}
}


play框架在处理所有请求时,只是用了若干个有限的线程进行线程复用,个数一般和CPU核心相等,主要是为了提高性能,比较频繁的创建和销毁线程是比较重的行为。像上面的例子在play里不能那么写,需要换个方式。play引入了await方法和Promise对象,Promise继承了java并发框架中的Future。

await(new Job<Long>(){
@Override
public Long doJobWithResult() throws Exception {
synchronized(TestC.class){
Thread.sleep(10000);
}
return null;
}
}.now())
这样其实就开启了另外一个线程,本次请求被挂起但是线程并未阻塞,其他请求仍然可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: