- 浏览: 30049 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiaoyuwei:
我想参与进来,好好向浩东学学,呵呵
TJS上线了 -
spllot:
浩东哥终于更新博客啦
TJS上线了 -
HenryYu:
持久层是自己实现的(这个框架各个层次都是自实现的)
Beetle J2EE开发框架1.3.7版本发布 -
whaosoft:
请问lz 你的持久层 是hibernate那样的还是ib..那 ...
Beetle J2EE开发框架1.3.7版本发布
子程序(SubRoutine)在BJAF框架中的定义是专门用来处理某一次的任务计算,处理完就结束。它本质上也是一个线程,只是这个线程执行一次就结束。另外,BJAF框架了,针对子程序实际运行情况,还实现了一个针对子程序任务执行的超时处理机制,用来解决由于某个任务长时间运行(超过预估的时间,或者死循环,阻塞挂起等)而无法及时线程回收的技术难题。
对于子程序,BJAF框架提供了线程池来优化其执行效率,同时对子程序的执行方式做了封装,(RoutineExecutor)提供做多不同执行方式。参见下面类图:
子程序说明示例
SubRoutine类说明如下:
方法与属性 | 功能说明 |
SubRoutine(maxBlockTime : int) | 构造函数,调用此构造函数实例化一个子程序,代表此子程序自动参与后台线程超时机制的监控。参数:maxBlockTime就是允许最大阻塞时间,单位为秒(S);如果任务执行超过这个时间,框架会对这个子程序进行超时中断处理。 |
SubRoutine() | 构造函数,调用此构造函数实例化一个子程序,不参与后台线程超时机制监控。 |
routine() : void | 子程序运行,为抽象方法,子程序执行任务技术所必须实现。 |
setResult(result : Object) : void | 设置子程序返回结果 routine方法体内调用才有效。适合需要返回结果的子程序(带超时执行机制) 由RoutineExecutor.runRoutineForResult方法执行 |
例如,建一个简单子程序,处理任务是打印一下当前时间戳。代码如下:
package example.appsrv.routine; import com.beetle.framework.appsrv.SubRoutine; public class DemoRoutine extends SubRoutine { public DemoRoutine() { super(); } protected void routine() throws InterruptedException { System.out.println(System.currentTimeMillis() + "->do something..."); } }
利用RoutineExecutor子程序执行:
package example.appsrv.routine; import com.beetle.framework.appsrv.RoutineExecutor; public class TestClient { public static void main(String[] args) { RoutineExecutor.runRoutineInPool(new DemoRoutine()); } }
执行结果:
loaded /config/log4j.properties from file 1235541073513->do something...
下面演示一下,子程序超时回收功能。假设,上面的DemoRoutine在开发的时候不小心写了个死循环,导致子程序长时间吊死。此时,我们能够及时回收此子程序线程就显得很有必要了。
package example.appsrv.routine; import com.beetle.framework.appsrv.SubRoutine; public class DemoRoutine extends SubRoutine { public DemoRoutine(int maxBlockTime) { super(maxBlockTime);// 采取超时参数构造函数 } protected void routine() throws InterruptedException { while (true) {// 死循环 System.out.println(System.currentTimeMillis() + "->do something..."); } } }
执行此子程序:
package example.appsrv.routine; import com.beetle.framework.appsrv.RoutineExecutor; public class TestClient { public static void main(String[] args) { RoutineExecutor.runRoutineInPool(new DemoRoutine(5));// 最大阻塞时间为5秒 } }
执行结果:
loaded /config/log4j.properties from file 1235551942465->do something... .....//省略重复输出 1235551942465->do something... 1235551942465->do something... com.beetle.framework.appsrv.RoutineRunException: thread interrpting at com.beetle.framework.appsrv.SubRoutine.run(SubRoutine.java:114) at com.beetle.framework.appsrv.RoutinesPool$ThreadPoolExecutor$Worker.run(RoutinesPool.java:795) at java.lang.Thread.run(Thread.java:534) 5190 DEBUG [Thread-1] com.beetle.framework.appsrv.RoutinesPool$RoutineMonitor - Thread:[gcaHS0gnMy]killed!--
可见超过5秒,框架后台监控服务就会把这个死循环的子程序(线程)给及时中断回收。
执行方式说明及示例
从图1类图中,可知RoutineExecutor提供了以下执行方式:
方法与属性 | 功能说明 |
runRoutineDirect(subRoutine: SubRoutine) : void | 直接执行,为静态方法。不采取线程池,直接创建线程执行。除了直接执行方法外,执行器所有的执行方法都会将子程序放在线程池内执行 |
runRoutineInPool(subRoutine: SubRoutine) : void | 在线程池中,执行此子程序。 |
addSubRoutine(subRoutine: SubRoutine) : void | 往执行器中,添加一个子程序。(执行器,支持多个子程序一起执行) |
runRoutineEarly() : void | 提早执行子程序,后调用getResult方法获取运算结果 特别适合在主流程中提前先处理任务重部分,再处理其它任务,最后再获取重任务计算结果的场景。这样处理的最大好处是优化和节约主流程的执行时间 |
getResult() : Object | 获取此子程序的处理结果(此方法会阻塞) |
runRoutineForTime() : Object | 执行子程序并等待返回其计算结果。 根据此子程序设置最大阻塞时间来防止线程超时,则超出此时间会中断此子程序 并触发子程序的terminate()事件(方法) @return 子程序结果 |
runRoutineForTime(time : int) : Object | 同上。 只是支持自定义等待时间 |
runRoutineParalleJoin() : void | 并行执行子程序,并等待所有的子程序结束后再退出 (针对一组子程序,此方法会阻塞) (没有超时处理机制,即使子程序设置最大阻塞时间也无效) |
runRoutineInTurn() : void | 依次执行子程序(按照顺序前一个子程序运行完毕才接着运行下一个,直到所有的子程序执行完毕) (针对一组子程序) |
常规执行一个子程序前面代码已经演示过,下面示例一下其它特别执行方式:
Ø针对一组子程序,并行执行,并等待所有子程序结束后再返回
构建3个子程序,代码分别为,SR1代码
package example.appsrv.routine; import com.beetle.framework.appsrv.SubRoutine; public class SR1 extends SubRoutine { protected void routine() throws InterruptedException { System.out.println("sr1-begin"); sleep(3000); System.out.println("sr1-end"); } }
SR2代码:
package example.appsrv.routine; import com.beetle.framework.appsrv.SubRoutine; public class SR2 extends SubRoutine { protected void routine() throws InterruptedException { System.out.println("sr2-begin"); sleep(2000); System.out.println("sr2-end"); } }
SR3代码:
package example.appsrv.routine; import com.beetle.framework.appsrv.SubRoutine; public class SR3 extends SubRoutine { protected void routine() throws InterruptedException { System.out.println("sr3-begin"); sleep(1000); System.out.println("sr3-end"); } }
编写执行客户端代码:
package example.appsrv.routine; import com.beetle.framework.appsrv.RoutineExecutor; public class TestParalleClient { public static void main(String[] args) { // 构建一个子程序执行器 RoutineExecutor re = new RoutineExecutor(); re.addSubRoutine(new SR1());// 添加各个子程序到执行器队列 re.addSubRoutine(new SR2()); re.addSubRoutine(new SR3()); re.runRoutineParalleJoin();// 并行执行,并阻塞,等待队列中所有子程序都结束才返回 System.out.println("ok"); } }
执行结果:
sr1-begin sr3-begin sr2-begin sr3-end sr2-end sr1-end ok
此模型对于哪些计算量很巨大任务的处理很有帮助,我们可以把此任务按照一定的条件,分解成多个子任务,并行处理,从而加快任务处理速度。
Ø针对一组子程序,依次串行执行,并等待所有子程序结束后再返回
沿用前面的3个子程序,串行执行的客户端代码如下:
package example.appsrv.routine; import com.beetle.framework.appsrv.RoutineExecutor; public class TestInTurnClient { public static void main(String[] args) { // 构建一个子程序执行器 RoutineExecutor re = new RoutineExecutor(); re.addSubRoutine(new SR1());// 添加各个子程序到执行器队列 re.addSubRoutine(new SR2()); re.addSubRoutine(new SR3()); re.runRoutineInTurn();// 串行执行,并阻塞,等待队列中所有子程序都结束才返回 System.out.println("ok"); } }
执行结果:
sr1-begin sr1-end sr2-begin sr2-end sr3-begin sr3-end ok
执行器还提供了一个runRoutineInTurnNoBlock()方法,不会阻塞主流程,让其在后台串行执行。
Ø先执行,后拿结果
当我们在主流程中处理多个任务,若这些任务中,有某个计算量很大,十分消耗时间,为了提高主流程的处理速度,我们可以把这个任务封装成子程序,先执行,主流程处理完其它任务后,再获取这个任务的结果。
示例代码如下:
编写一个HardWorkSR子程序:
package example.appsrv.routine; import java.util.ArrayList; import java.util.List; import com.beetle.framework.appsrv.SubRoutine; public class HardWorkSR extends SubRoutine { protected void routine() throws InterruptedException { System.out.println("work-begin"); List data = new ArrayList(); sleep(10000);// 假设此任务要计算10秒 data.add("AAA"); data.add("BBB"); this.setResult(data);// 设置结果以便返回 System.out.println("word-end"); } }
编写客户端:
package example.appsrv.routine; import java.util.List; import com.beetle.framework.appsrv.RoutineExecutor; public class TestEarlyClient { public static void main(String[] args) { RoutineExecutor re = new RoutineExecutor(); re.addSubRoutine(new HardWorkSR()); re.runRoutineEarly();// 提早执行 // ...继续处理其它任务 System.out.println("do other work..."); // 处理完其它任务后,再来拿结果 List result = (List) re.getResult();// 会阻塞一定等到任务处理完毕有结果返回为止 System.out.println(result); System.out.println("ok"); } }
执行过程,参考一下顺序图:
执行结果如下:
do other work... work-begin word-end [AAA, BBB] ok
Ø具备超时保护并能获取结果的执行
沿用上面的HardWorkSR子程序(其计算时间为10s),参考以下执行方式的区别:
package example.appsrv.routine; import java.util.List; import com.beetle.framework.appsrv.RoutineExecutor; public class TestTimeoutClient { public static void main(String[] args) { RoutineExecutor re = new RoutineExecutor(); re.addSubRoutine(new HardWorkSR()); List result = (List) re.runRoutineForTime(11);//最大允许子程序执行11秒 System.out.println(result); System.out.println("ok"); } }
从代码可知,超时设置为11秒,HardWorkSR子程序会正常执行,不会做超时处理,此时,其运行结果如下:
work-begin word-end [AAA, BBB] ok
若把上面的时间设置为5秒,如:
List result = (List) re.runRoutineForTime(5);// 最大允许子程序执行5秒
由于HardWorkSR本身需要10秒才能计算完成,而我们5秒就要回收,所以其会被超时处理,此时,其运行结果如下:
work-begin com.beetle.framework.appsrv.RoutineRunException: thread timeout; cause exception is: EDU.oswego.cs.dl.util.concurrent.TimeoutException EDU.oswego.cs.dl.util.concurrent.TimeoutException at EDU.oswego.cs.dl.util.concurrent.FutureResult.timedGet(FutureResult.java:128) at com.beetle.framework.appsrv.RoutineExecutor.runRoutineForTime(RoutineExecutor.java:104) at example.appsrv.routine.TestTimeoutClient.main(TestTimeoutClient.java:12)
线程超时,执行中断。
发表评论
-
甲壳虫发布 1.4.1 版本
2010-11-21 16:09 1084甲壳虫,一个功能强大而简单易用的J2EE应用开发框架。它涵盖了 ... -
BJAF框架1.4.0版本发布
2010-08-30 09:55 1158BJAF框架1.4.0版本发布,更新内容有: *web--支 ... -
Beetle J2EE开发框架1.3.7版本发布
2009-10-01 06:31 1277http://www.beetlesoft.net/j2ee/ ... -
Beetle Web框架使用指南之--请求动态缓存功能
2009-07-14 22:58 1639BJAF Web框架利用Serv ... -
Beetle Web框架使用指南之--特定请求并发控制
2009-07-03 23:38 954在Web应用开发过程中,有时候我们希望对某些请求处理任务量很重 ... -
Beetle Web框架使用指南之--防止表单重复提交
2009-07-03 23:32 1472表单重复提交指的是,在输入数据并提交表单后,通过刷新浏览器或者 ... -
Beetle框架使用指南之--远程通信模块
2009-06-01 15:16 2441现在很多应用服务器都是网络通信的服务器,提供一个远程 ... -
Beetle框架使用指南之--复杂条件组合查询器
2009-06-01 00:49 3366在做数据库统计分析开发过程中,我们经常会碰到复杂条件组合查询的 ... -
Beetle J2EE开发框架1.3.6版本发布
2009-05-31 12:48 1260http://www.beetlesoft.net/j2ee/ ... -
Beetle框架使用指南之--Web Ajax开发
2009-05-10 11:48 2378Ajax是当前流行的Web开发 ... -
Beetle框架使用指南之--Web应用零配置编程
2009-05-03 11:28 1241在一个标准的BJAF框架Web应用中,一共涉及到3个配置文件, ... -
Beetle框架使用指南之--数据库分页查询
2009-05-03 10:56 2727当我们为了完成某个业 ... -
Beetle框架使用指南之--线程的简化编程模型
2009-04-24 23:27 1398应用程序服务子框架的实现了一个简单的线程编程模型来简化传统的线 ... -
Beetle J2EE开发框架1.3.5版本发布
2009-03-15 20:08 1112http://www.beetlesoft.net/j2ee/ ...
相关推荐
Beetle J2ee Application Framework(BJAF)一个功能强大而简单易用的J2EE应用开发框架。它涵盖了J2EE体系结构的表示层、业务层和持久层,为构建一个可靠、高性能、可扩展、灵活缩放的高质量企业应用系统提供了一套...
标题中的"Beetle.JT808-master.zip"表明这是一个关于JT808协议的开源项目,由Beetle框架实现,且基于C#编程语言。Beetle是一个通用的通讯框架,而JT808则是一种广泛应用于中国GPS监控系统中的通信协议。这个项目可能...
【标题】"beetle 开源框架书的源码"涉及的是一个名为"beetle"的开源框架的源代码,这通常意味着该框架可能是用于Java平台,因为J2EE(Java 2 Platform, Enterprise Edition)是Java领域广泛使用的开发企业级应用的...
BJAF(beetle-j2ee-application-framework)甲壳虫J2EE应用开发框架代码&开发指南 甲壳虫,一个功能强大而简单易用的J2EE应用开发框架。它涵盖了J2EE体系结构的表示层、业务层和持久层,为构建一个可靠、高性能、可...
### 德利多富(Wincor Nixdorf) BEETLE_XL_II 收款机说明书 #### 概述 德利多富(Wincor Nixdorf) BEETLE_XL_II是一款模块化的POS系统,专为零售业设计。这款收款机不仅功能强大,而且具备高度的灵活性和可扩展性,...
已经成功应用于多个高并发量的TCP、UDP框架通信接口,
在C#编程中,"Beetle"可能指的是一个自定义的框架或库,用于处理文件传输任务。这个框架可能是为了提高文件传输的效率而设计的。在标题中提到的"beetle类包含其他类",这暗示了Beetle可能是一个封装了多种功能的类库...
Beetle.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码Beetle.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码Beetle.zipscratch2.0 3.0编程项目源文件源码经典游戏案例素材源代码Beetle....
标题中的“c#_以Beetle为基础SOCKET服客端(WPF)与客户端(winphone\win8 metro)”指的是一个使用C#编程语言构建的网络通信应用,它基于Beetle框架,实现了SOCKET服务器端(WPF)以及Windows Phone和Windows 8 Metro...
"Popular Beetle"是一款专业的数据库比较和数据整合工具,专为软件测试人员设计,旨在提高工作效率并确保数据的一致性。该工具提供了强大的功能,能够帮助用户深入对比不同数据库之间的结构差异,同时支持数据的同步...
-dung_beetle.zip" 是一个压缩包,其中包含了一个名为 "dung_beetle-master" 的文件夹,这很可能是项目的源代码目录,通常包括教程的实例、脚本和其他相关资源。让我们逐步了解Python爬虫的基本概念和常用工具。 1....
甲壳虫 PSX 剧本Beetle PSX 是 Mednafen 的 PSX 模块到 libretro API 的端口/分支。 可以用C++98模式编译,不包括Vulkan渲染器,暂时是用C++11写的。 Beetle PSX 目前在 Linux、OSX 和 Windows 上运行。 这个分叉中...
至于“keracce-Beetle-9cc3275”,这可能是一个源代码库的特定版本标识,比如Git仓库的一个分支或者标签。这个名称可能指的是Beetle项目的作者或者一个特定的开发迭代。要深入理解这个项目,你需要解压这个压缩包并...
天牛须算法(Beetle Antennae Search Algorithm,简称BAS),是一种新型的智能优化算法,它以长角天牛的搜索行为为灵感而设计。长角天牛因其长长的触须而著名,这些触须常常比它们的身体还要长。BAS算法模拟了这些...
标题中的“加长版甲壳虫汽车外壳3D图纸”是指使用solidworks2014软件设计的一款经典甲壳虫汽车的加长版车型的三维模型。SolidWorks是一款广泛应用于机械设计领域的三维CAD(计算机辅助设计)软件,以其易用性和强大...
标注类别名称:["Cashew-anthracnose","Cashew-healthy","Cashew-leaf-miner","Cassava-bacterial-blight","Cassava-brown-spot","Cassava-healthy","Maize-healthy","Maize-leaf-beetle","Maize-leaf-blight",...
对于那些频繁使用GitHub、GitLab和Azure DevOps的开发者来说,Beetle无疑是一个非常实用的工具,值得尝试和贡献。通过探索和参与这个项目,不仅可以学习到如何与这些平台的API进行交互,还可以了解如何构建高效且...
beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列。除了队列上的支持组件还提供Buffer缓冲池和基于...
本压缩包“Beetle.zip”提供了一个基于Scratch的编程项目源代码,旨在帮助初学者通过一个有趣的“Beetle”游戏案例学习编程。 在“Beetle.sb3”文件中,包含了整个游戏的完整源代码,用户可以直接在Scratch环境中...
蜣螂优化算法(DBO,Dung Beetle Optimization Algorithm)是一种基于生物行为的新型全局优化算法,灵感来源于蜣螂(也称屎壳郎)在寻找食物过程中所展现出的探索和滚动粪球的行为。2022年底,该算法被首次提出,并...