第三部分(第47行)——为我们的流程配置三个POJO活动。
ActivityFilterInterceptor——它所做的所有事情就是调用底层POJO活动并把该活动返回的事实进行注册(第53 行),并且可以让POJO活动对事实注册表(Fact Registry)或流程的任何其他底层架构组件的地点保持未知(请见下面代码片断)。可是正如我们后面将要看到的,这一拦截器本身的调用是根据每个拦截器配置中所描述的事实规则由AspectJ advice所控制的(第二个AOP层),从而控制各个活动的执行。
各个POJO活动简单地返回它们要注册的所有事实的String数组,然后由自己的拦截器将其注册到事实注册表中(见上面代码片断)。
TransitionGovernorAspect——是一个AspectJ组件,拦截对每个Spring AOP拦截器(代表各个活动)的调用。它是通过使用Around advise做到这一点的,在其中它对事实规则和当前事实注册表进行比较,就执行或跳过下面的活动拦截器调用做出决策。可以通过调用它自己的invocation对象(ProceedingJoinPoint thisJoinPoint)的proceed(..)方法做到这一点,或者调用拦截过滤器的invocation对象(MethodInvocation proxyMethodInvocation)的proceed(..)方法来做到这一点。
由于它是用AspectJ aspect实现的,我们需要在META-INF/aop.xml中提供配置(见下面配置片断)。
因为我们要使用装载时AOP,我们需要在Spring配置中注册编织器。我们通过使用context名字空间来做到这一点:
此时,我们已经做好测试准备了。正如你所见,测试没有什么特殊的,其步骤是:
·获得ApplicationContext
·获得GenericProcess对象
·创建一个事实注册列表
·创建对象(在我们的用例中是Map),代表输入数据以及执行上下文
调用process方法
由于我们使用的是AspectJ装载时编织,因此需要提供-javaagent选项作为我们的VM参数。
VM参数是:
-javaagent:lib/spring-agent.jar
spring-agient.jar已经存在于lib目录中了。
在执行之后你应该看到类似下面的输出:
正如你从该测试所看到的,初始的事实列表是空的,但是如果你用已有事实填充它,那么流程流将被改变。
试着把给注册表增加事实这行代码的注释去掉。
在你的测试中的把如下代码行注释去掉:
// factRegistry.add("VALIDATED_ITEM");
你的输出将变为: