`
QING____
  • 浏览: 2245805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Commons-chain:责任链框架

    博客分类:
  • JAVA
 
阅读更多

    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--

分享到:
评论

相关推荐

    commons-chain-1.2-bin

    总的来说,Apache Commons Chain 1.2 是一个用于构建命令链的工具,它简化了复杂流程的管理,提供了灵活的条件控制,并且可以方便地与其他Java库和框架集成。如果你正在寻找一种方式来组织和执行一系列相互依赖的...

    commons-chain-1.2-src

    Apache Commons Chain 是一个Java库,它提供了一种用于构建可配置、模块化的应用程序处理流程的框架。这个"commons-chain-1.2-src"是Apache Commons Chain项目的源代码包,版本为1.2。这个框架主要关注的是应用中的...

    commons-chain-1.2-src.tar.gz

    通过学习和研究Apache Commons Chain 1.2的源代码,开发者不仅可以掌握这个库的使用,还能深入了解责任链模式的实现,这对于构建复杂、模块化的应用程序非常有益。同时,对于那些需要维护使用Apache Chain的旧系统...

    apache-commons源码及jar文件

    Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL ...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz 组成 commons-codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及...

    eclipse下的所有SSH需要的jar包

    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

    Jakarta commons docs API CHM 格式

    commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz 组成 commons-codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及...

    struts框架jar包

    struts-1.3.8 包( &lt;br&gt;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-beanutils+chain+digester_jar包

    Commons Chain 提供了一种声明式的方式来定义这些步骤(称为“链”),并允许动态地插入、删除或修改步骤。这种模块化的设计使得代码更易于维护和扩展,降低了耦合度。 3. **Commons Digester**: Commons ...

    poor-man-transcoder:用于red5 wowza(基于Java的rtmp服务器)的实时流转码器

    ffmpeg代码转换器 用于red5 / wowza(基于Java的rtmp服务器)的实时流的转码器 该项目 ffmpeg转码器是一个旨在为基于Java的rtmp服务器构建cli包装...commons-chain-命令链接实用程序 validation-api-自定义验证 hiberna

    org.apache.commons 系列源文件

    5. **Commons Chain** (commons-chain-1.2-src.zip): Chain 提供了一种可配置的命令链(Chain of Responsibility)模式实现,用于构建和执行复杂的业务流程。开发者可以定义一系列处理命令,并根据需要组合它们,...

    SSH整合类库分析spring3.0.4+hibernate3.5.5+struts2.2.1

    4. `commons-chain.jar`:实现命令模式和责任链模式,用于业务流程控制。 5. `commons-collections.jar`:扩展了Java集合框架,提供额外的集合实现和工具类。 6. `commons-digester.jar`:XML到Java对象的转换工具,...

    druid连接池jar包

    - Filter Chain:过滤器链,可以添加多个拦截器,实现不同功能。 4. **配置使用**: 在Spring或其他框架中配置DruidDataSource,设置连接池的基本属性,如最大连接数、最小连接数、初始化连接数等。同时,可以...

    Java常用开源库(附源码地址).docx

    - Chain:实现责任链模式,用于组织复杂的处理流程。 - CLI:处理命令行参数和选项,提供简单易用的API。 - Codec:包含各种编码解码算法,如Hex、Base64和URL编码。 - Collections:扩展和增强Java集合框架,提供...

    SpringMVC依赖包

    5. **commons-chain**:它提供了一种定义和执行命令链的方式,这在 Spring MVC 中可以用于实现复杂的业务逻辑流程,通过定义一系列处理步骤,按顺序或条件执行。 6. **commons-digester**:这是一个 XML 解析器,...

    apache commons一系列的jar包

    8. **commons-chain-1.1.jar**:实现了命令链模式,允许开发者定义和执行一系列相互关联的任务,常用于构建业务流程或处理工作流。 9. **commons-io.jar**:这个库提供了许多I/O操作的辅助类,如文件操作、流处理、...

    commons包介绍1

    3. **Chain**: Chain组件实现了责任链模式,允许构建复杂的处理流程,其中每个处理者可以决定是否处理请求或将其传递给下一个处理者。 4. **CLI**: CLI组件提供了一种处理命令行参数、选项和选项组的简单API,简化...

    JAKARTA COMMONS

    4. **Commons Chain**: 实现了设计模式中的“责任链模式”,允许构建复杂的处理流程,每个处理者可以决定是否处理请求,或者传递给下一个处理者。 5. **Commons CLI**: 提供命令行参数、选项、选项组等的处理,简化...

Global site tag (gtag.js) - Google Analytics