作为spring beans的工作流组件

 作为spring beans的工作流组件<o:p></o:p>
SpringApplicationContext是从接口BeanFactory继承的,它被用来作为在spring容器内实际的控制实体和容器。用来负责对一组作为spring beans的一组bean的初始化,配置和生命期管理。我们通过装配在一个基于XML的配置文件中的spring beans来配置ApplicationContext。这个配置文件说明了spring beans互相协作的本质特点。这样,用spring的术语来说,与其他spring beans交互的spring beans就被叫着协作者(collaborators)。缺省情况下,spring beans是作为单例存在于ApplicationContext中的,但是,单例的属性能够被设置为false,从而有效地改变他们在spring中调用原型模式时的行为。如下面的配置文件所示:<o:p></o:p>
    <bean id="defaultErrorHandler" <o:p></o:p>
       class="com.gsta.eshore.framework.jcf.JCFErrorHandler"/> <o:p></o:p>
<bean id="simpleProcessor" class="com.gsta.eshore.framework.jcf.SequenceProcessor" ><o:p></o:p>
       <property name="activities"><o:p></o:p>
           <list><o:p></o:p>
               <ref bean="command1"/><o:p></o:p>
              <ref bean="command2"/><o:p></o:p>
              <ref bean="command3"/><o:p></o:p>
           </list><o:p></o:p>
       </property><o:p></o:p>
       <property name="defaultErrorHandler"><o:p></o:p>
           <ref bean="defaultErrorHandler"></ref><o:p></o:p>
       </property><o:p></o:p>
    </bean><o:p></o:p>
<o:p> </o:p>
将工作流组件实施成spring beans有以下两种作用:<o:p></o:p>
一是容易进行单元测试和很大程度上可重用能力。IoC容器的特点明显地提供了有效的单元测试。使用像spring这样的Ioc容器,在测试期间,协作者之间的依赖能够容易的用假的替代者替代。<o:p></o:p>
二是可重用能力是通过像XSL转换这样的工作流活动实现的。一个被抽象成工作流活动的XSL转换现在能够被任何处理XSL转换的工作流所重用。<o:p></o:p>
Spring控制了一些操作者以一种工作流的方式交互。关键接口如下:<o:p></o:p>
Command: 封装了工作流中一个单步业务逻辑;<o:p></o:p>
Request:在工作流活动之间传递具参数的对象。实现了这个接口的对象负责维护对象在工作流转换中从一个活动转换到另一个活动的状态;<o:p></o:p>
Response:封装了执行Command后返回的结果;<o:p></o:p>
ErrorHandler:提供错误处理的回调方法;<o:p></o:p>
BaseProcessor:描述一个作为主工作流线程的执行者的bean<o:p></o:p>
<o:p> </o:p>
SequenceProcessor类是一个对顺序模式建模的具体子类。有3Command被连接到工作流处理器,工作流处理器将顺序执行这3Command。同样更多的BaseProcessor接口的实现也是可以想象得到的。可以开发其他工作流处理过程子类来控制不同的工作流类型,例如,另一种像并行切割模式那样有着变化的执行路径的工作流。对于简单工作流来说,因为活动的顺序是预先决定了的,所以SequenceProcessor是好的选择。<o:p></o:p>
对于使用基于spring的简单工作流的实现来说,排他选择模式是另一个好的选择。例如RunByResultProcessor类,根据Command执行的结果来决定下一个将要执行的Command,例如在执行完Command1之后可以决定执行哪一个Command<o:p></o:p>
下面看看SequenceProcessor做了些什么,由于RunByResultProcessor与之类似,在此省略介绍。<o:p></o:p>
public void doActivities(Request request,Response resp) throws Exception {<o:p></o:p>
        if (logger.isDebugEnabled())<o:p></o:p>
            logger.debug(getBeanName() + " SequenceProcessor is running..");<o:p></o:p>
       Map response = resp.getValues();<o:p></o:p>
       Map params = request.getValues();<o:p></o:p>
        List activities = getActivities();<o:p></o:p>
        for (Iterator it = activities.iterator(); it.hasNext();) {<o:p></o:p>
            Component component = (Component) it.next();<o:p></o:p>
            if (logger.isDebugEnabled())<o:p></o:p>
                logger.debug("正在运行中的活动是 : " + component.getBeanName());<o:p></o:p>
            try {<o:p></o:p>
              component.execute(params, response);<o:p></o:p>
            } catch (Throwable th) {<o:p></o:p>
                ErrorHandler errorHandler = component.getErrorHandler();<o:p></o:p>
                if (errorHandler == null) {<o:p></o:p>
                    logger.info("no Errorhandler for Command "+component.getBeanName() +", run default error handler and abort Command ");<o:p></o:p>
                    ErrorHandler processorerrorHandler=getDefaultErrorHandler();<o:p></o:p>
                    if(processorerrorHandler == null){<o:p></o:p>
                    logger.info("no error handler for this processor, run JCFErrorHandler " + "handler and abort processing ");<o:p></o:p>
                    //执行全局的default ErrorHandler;<o:p></o:p>
                    ((ErrorHandler)ContextServiceLocator.getInstance().getBean("defaultErrorHandler")).handleError(resp, th);<o:p></o:p>
                    }else{<o:p></o:p>
                        // 执行processor级的ErrorHandler;<o:p></o:p>
                       processorerrorHandler.handleError(resp, th);<o:p></o:p>
                    }<o:p></o:p>
                  <o:p></o:p>
                } else {<o:p></o:p>
                    logger.info("run Command Errorhandler and continue");<o:p></o:p>
//                  执行Component级的ErrorHandler;<o:p></o:p>
                    errorHandler.handleError(resp, th);<o:p></o:p>
                }<o:p></o:p>
            }<o:p></o:p>
        }<o:p></o:p>
        logger.debug(getBeanName() + " SequenceProcessor is done.");<o:p></o:p>
    }<o:p></o:p>
                   SequenceProcessor关键代码<o:p></o:p>
<o:p> </o:p>
由上面的代码可见,SequenceProcessor按照顺序执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值