Commons-chain是apache commons中的一个子项目,主要被使用在"责任链"(执行链)的场景中,struts中action的调用过程,就是使用了"chain"框架做支撑.如果你的项目中,也有基于此种场景的需求,可以考虑使用它.
所谓"责任链"就是:一系列有序的command能够按照顺序执行,并能够互相交换或者传递执行结果;和我们常说的"责任链"模式类似.
commons-chain通过被用在web项目中,或者在基于"规则引擎"的其他模块中,commons-chain本身基于commons-digester作为"规则"的解析引擎,使用起来非常简单.
一.API简介:
1) Command: 顶级接口,一个可执行的"指令",多个command组成"责任链".只有一个方法:
- boolean execute(Context context):当"责任链"开始调用时,将会依次执行链上的所有Command对象的execute方法,直到结束,或者抛出异常,或者某个command返回true终止调用.context对象表示当前"责任链"的上下文信息,它可以用来保存一些临时变量.此方法如果返回false,表示继续责任链将会继续执行后续command,如果返回true,则表示终止调用,后续的command将不会被执行.
2) Chain: 顶级接口,表示组织多个Command,形成一个有序的"责任链",它保持了一个command的集合(数组),Chain接口本身也扩展了Command接口,它的实现类为ChainBase,我们通过会继承它来实现一些自定义的操作.
- void addCommand(Command command):向chain中添加Command节点.责任链中的command顺序将根据其被添加的时间有关.当Chain.execute()被执行时,将会依次执行链中的command.
- boolean execute(Context context): 依次调用当前chain中的所有command,直到结束,或者抛出异常,或者某个command返回true..command抛出的异常将会被捕获,并交给Chain中的Filter处理,如果Filter未能处理,异常将会被重新抛出.需要提醒,Chain中可以包括Filter组件,Filter的执行顺序为倒序.
3) Filter: 顶级接口,"过滤器",它本身也扩展了Command接口,能够和Command一样添加到Chain中,需要注意的是Filter.execute方法,仍然会像其他Command一样被"依次"执行;不过Filter中还提供了一个非常有用的方法:
- boolean postprocess(Context context, Exception exception) : 在Chain执行完Command之后(包括Filter.execute),将会从链的末端倒序依次执行所有的Filter.postprocess()方法,Filter中如果抛出异常将会被忽略;此方法的设计初衷为"清理Context"中参数或者执行结果,或者重置执行结果,如果在Command中存在创建"资源消耗"的对象(比如数据源连接,比如线程资源等),可以在Filter中考虑释放这些资源.当所有的Filter执行完成之后,Context中保持的数据,应该是可靠的.
4) Context:类似于"session",用来保存当前Chain中需要被保持的"变量参数"或者"Command执行的结果";Context内部存储结构为一个Map,它的数据可以被Chain中的Command操作;Context并非为线程安全的,也不期望此实例能够被重用;每次Chain被调用,都应该创建新的Context实例;其实现类为ContextBase.
5) Catalog:顶级接口,用来保存Chains列表,一个Catalog可以有多个Chain组成,可以通过"name"的方式获取当前Catalog中的chain.
二.代码样例:
1) 环境:commons-chain-1.2.jar,commons-digester-1.7.0.jar
2) catalog.xml: 位于/src/main/resources目录,我们可以使用digester引擎来解析此xml文件并获得catalog对象列表:
<?xml version="1.0" ?> <!-- @see ConfigRuleSet.java --> <catalog> <chain name="printChain"> <command name="printDate" className="com.test.chain.PrintDateCommand" /> <command name="printTimestamp" className="com.test.chain.PrintTimestampCommand" /> </chain> </catalog> <!-- you can have more catalogs,but everyone should have a unique name --> <!-- <catalog name="printCatalog"> <chain name="test"> <command name="printDate" className="com.test.chain.PrintDateCommand" /> <command name="printTimestamp" className="com.test.chain.PrintTimestampCommand" /> </chain> </catalog> -->
每个catalog元素,都可以指定"name"属性,不过name在全局应该是唯一的,上述xml结构为全限定名的样例.
3) 程序样例:
//ConfigRuleSet中定义了"规则" ConfigParser configParser = new ConfigParser(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //位于classpath位置 URL url = classLoader.getResource("catalog.xml"); configParser.parse(url); //获得默认的catalog //其中CatalogFactoryBase是单例模式,在parse是会触发CatalogFactory的实例化 Catalog catalog = CatalogFactoryBase.getInstance().getCatalog(); Command chain = catalog.getCommand("printChain"); Context context = new ContextBase();//A session map,can be useed by all commands //当前chain中,所有的command依次执行,直到结束,或者其中一个command返回true,或者抛出异常 chain.execute(context);
三.Chain与servlet
1) web.xml
<context-param> <param-name>org.apache.commons.chain.CONFIG_CLASS_RESOURCE</param-name> <!-- 注意自己的classpath配置--> <!-- 其他param,请参见ChainLisntener类 --> <param-value>catalog.xml</param-value> </context-param> <listener> <listener-class>org.apache.commons.chain.web.ChainListener</listener-class> </listener>
2) 获取Catalog:
//从ServletContext中获取Catalog,请注意并发环境下使用 //catalog,chain,command,filter的设计需要考虑到"并发"操作 Catalog catalog = (Catalog) request.getSession().getServletContext().getAttribute("catalog"); Command command = catalog.getCommand("printCatalog"); try{ Context context = new ContextBase(); //context.put("dataSource",dataSource);// boolean stop = command.execute(context); if(stop){ //如果某个Command执行异常,你可以尝试将"异常信息"放入context中,以便在此处处理 //Throwable exception = context.get("exception"); //... } //你应该把command的执行结果放在context中,以便在此处获取 //Object result = context.get("result"); if(result) }catch(Exception e){ //please check. }
--END--
相关推荐
总的来说,Apache Commons Chain 1.2 是一个用于构建命令链的工具,它简化了复杂流程的管理,提供了灵活的条件控制,并且可以方便地与其他Java库和框架集成。如果你正在寻找一种方式来组织和执行一系列相互依赖的...
Apache Commons Chain 是一个Java库,它提供了一种用于构建可配置、模块化的应用程序处理流程的框架。这个"commons-chain-1.2-src"是Apache Commons Chain项目的源代码包,版本为1.2。这个框架主要关注的是应用中的...
通过学习和研究Apache Commons Chain 1.2的源代码,开发者不仅可以掌握这个库的使用,还能深入了解责任链模式的实现,这对于构建复杂、模块化的应用程序非常有益。同时,对于那些需要维护使用Apache Chain的旧系统...
Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL ...
commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz 组成 commons-codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及...
antlr-2.7.2.jar,aopalliance-1.0.jar,asm-2.2.3...attributes-compiler.jar,commons-beanutils-1.7.0.jar,commons-chain-1.1.jar,commons-chain-1.1.jar,commons-collections-3.2.jar,commons-digester-1.8.jar
commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz 组成 commons-codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及...
struts-1.3.8 包( <br>antlr-2.7.2.jar bsf-2.3.0.jar commons-beanutils-1.7.0.jar commons-chain-1.1.jar commons-digester-1.8.jar commons-fileupload-1.1.1.jar commons-io-1.1.jar ...
Commons Chain 提供了一种声明式的方式来定义这些步骤(称为“链”),并允许动态地插入、删除或修改步骤。这种模块化的设计使得代码更易于维护和扩展,降低了耦合度。 3. **Commons Digester**: Commons ...
ffmpeg代码转换器 用于red5 / wowza(基于Java的rtmp服务器)的实时流的转码器 该项目 ffmpeg转码器是一个旨在为基于Java的rtmp服务器构建cli包装...commons-chain-命令链接实用程序 validation-api-自定义验证 hiberna
5. **Commons Chain** (commons-chain-1.2-src.zip): Chain 提供了一种可配置的命令链(Chain of Responsibility)模式实现,用于构建和执行复杂的业务流程。开发者可以定义一系列处理命令,并根据需要组合它们,...
4. `commons-chain.jar`:实现命令模式和责任链模式,用于业务流程控制。 5. `commons-collections.jar`:扩展了Java集合框架,提供额外的集合实现和工具类。 6. `commons-digester.jar`:XML到Java对象的转换工具,...
- Filter Chain:过滤器链,可以添加多个拦截器,实现不同功能。 4. **配置使用**: 在Spring或其他框架中配置DruidDataSource,设置连接池的基本属性,如最大连接数、最小连接数、初始化连接数等。同时,可以...
- Chain:实现责任链模式,用于组织复杂的处理流程。 - CLI:处理命令行参数和选项,提供简单易用的API。 - Codec:包含各种编码解码算法,如Hex、Base64和URL编码。 - Collections:扩展和增强Java集合框架,提供...
5. **commons-chain**:它提供了一种定义和执行命令链的方式,这在 Spring MVC 中可以用于实现复杂的业务逻辑流程,通过定义一系列处理步骤,按顺序或条件执行。 6. **commons-digester**:这是一个 XML 解析器,...
8. **commons-chain-1.1.jar**:实现了命令链模式,允许开发者定义和执行一系列相互关联的任务,常用于构建业务流程或处理工作流。 9. **commons-io.jar**:这个库提供了许多I/O操作的辅助类,如文件操作、流处理、...
11. commons-chain-1.2.jar:Apache Commons Chain库,实现命令模式和责任链模式,常用于业务流程控制。 12. 其他Jakarta Commons库:如commons-包含其他Apache Commons项目的组件,增强Java的功能。 五、总结: S2...
3. **Chain**: Chain组件实现了责任链模式,允许构建复杂的处理流程,其中每个处理者可以决定是否处理请求或将其传递给下一个处理者。 4. **CLI**: CLI组件提供了一种处理命令行参数、选项和选项组的简单API,简化...
4. **Commons Chain**: 实现了设计模式中的“责任链模式”,允许构建复杂的处理流程,每个处理者可以决定是否处理请求,或者传递给下一个处理者。 5. **Commons CLI**: 提供命令行参数、选项、选项组等的处理,简化...