Recaller 对象
业务流程管理解决方案支持以常规方式重试某些失败的对象方法调用。 解决方案通过 ExceptionHandler 业务流程中的 Recaller 对象执行此操作。 ExceptionHandler 业务流程使用 对象重试对象方法调用。 有关详细信息,请参阅 ExceptionHandler 业务流程。
Recaller 对象具有单个静态方法 Invoke。 因为它是静态的,因此永远不需要创建 Recaller 对象的实例。 可以通过三种方式使用 Invoke 方法:构造对象、为对象调用静态方法或为对象调用非静态方法。
备注
Invoke 方法充当 .NET Framework 类库中 Type.InvokeMember 方法的包装器。
下表描述了 Invoke 方法的参数:
参数 | 类型 | 说明 |
---|---|---|
t | 类型 | 对其调用该方法的对象的类型。 |
obj | Object | 要使用的对象的实例。 |
methodName | string | 要调用的方法的名称。 |
args | 数组 | Object 类型的数组,包含方法的参数。 |
若要调用 对象的构造函数,请使用空字符串 (“”“) 或 null 作为 methodName。
若要调用静态方法,请使用 null 作为 obj。
若要调用非静态方法,请提供所有参数。
备注
使用 null 作为 Type 参数 t 的值会导致 Invoke 引发 ArgumentNullException 异常。 参数 t 不应为 null,因为 Invoke 方法使用 Type.InvokeMember .NET Framework 方法。
在解决方案中,只有 ExceptionHandler 业务流程使用 Recaller 对象。 反过来,ExceptionHandler 又由其他业务流程使用。 传递给 Invoke 方法的值来自这些其他业务流程。 例如,以下代码显示在 InitialException 表达式形状的 Activate 业务流程中:
Ex = CodeEx;
ObjectType = orderHandler.GetType();
CalledObject = orderHandler;
Reason = "Standard Activate Failed";
MethodName = "Activate";
ParameterArray = System.Array.CreateInstance(typeof(System.Object),
3 );
ParameterArray.SetValue(ServiceType, 0);
ParameterArray.SetValue(OrderMsg.CustNum, 1);
ParameterArray.SetValue(OrderMsg.OrderNum, 2);
ReturnValue = null; // no return value expected
请注意代码如何使用 System.Array.CreateInstance 创建数组,并使用 SetValue 方法存储其中使用的值。
在“表达式”形状之后,激活业务流程调用 ExceptionHandler 业务流程。 以下代码显示了业务流程设计器是如何转换调用形状的:
call Microsoft.Samples.
BizTalk.SouthridgeVideo.
OrderManager.ExceptionHandlerOrch
(
Reason,
Ex,
CalledObject,
MethodName,
ParameterArray,
OrderCorrelation,
OrderMsg,
out ReturnValue,
ObjectType
);
在 ExceptionHandler 业务流程中,以下代码显示在 “调用原始代码 表达式”形状中:
ReturnValue =
Microsoft.Samples.
BizTalk.SouthridgeVideo.
Utilities.Recaller.
Invoke(
ObjectType,
CalledObject,
MethodName,
ParameterArray
);
请注意,尽管参数名称与 Activate 业务流程的调用中的名称相匹配,但在调用业务流程时,是按顺序匹配参数,而不是按名称匹配参数。