从Mule ESB中的Scatter-Gather流中重新排除异常

时间:2014-10-16 08:47:55

标签: exception-handling mule mule-component

我有一个非常具体的问题,我真的在整个地方搜索了答案...... 这是一种情况:我有一个带有自定义聚合策略的Scatter-Gather组件 http://clip2net.com/s/j66jK8 - 子流的图像
这个过程的语义相当简单。请求附带基本身份验证标头,上层呼叫只是空的Java处理器,它返回原始有效负载,下层路径通过LDAP对用户进行身份验证,并返回此身份验证过程的布尔结果。自定义聚合类检查结果,如果验证正常,则返回原始有效负载,这是由路#1产生的。如果不行,则抛出异常。这里没有错,它有效。

有点棘手的事情。如果用户传递了错误的身份验证数据,则ldap:bind模块中会发生异常。根据文档,异常传播到Scatter-Gather,所以我试图用它捕获它:

@Override
public MuleEvent aggregate(AggregationContext context) throws MuleException {
    for (MuleEvent event: context.collectEventsWithExceptions()) {
        event.getMessage().getExceptionPayload().getException().printStackTrace();
        throw new RuntimeException(event.getMessage().getExceptionPayload().getException());
    }

    MuleEvent result = DefaultMuleEvent.copy(context.getEvents().get(0));       
    if (!(Boolean) context.getEvents().get(1).getMessage().getPayload()) {
        throw new SecurityException();
    }       

    return result;
}

BUT! 结果,我看到了异常,其中stacktrace没有javax.naming.AuthenticationException由ldap:bind组件引发,并被打印为自动记录(见下文)。

所以,我的问题是:如何从自定义聚合类中获取并重新抛出此javax.naming.AuthenticationException异常?

我感谢所有的想法和帮助。提前谢谢。

WARN  2014-10-15 20:51:18,552 [[minkult].ScatterGatherWorkManager.02] org.mule.module.ldap.api.jndi.LDAPJNDIConnection: Bind failed.
ERROR 2014-10-15 20:51:18,559 [[minkult].ScatterGatherWorkManager.02] org.mule.retry.notifiers.ConnectNotifier: Failed to connect/reconnect: Work Descriptor. Root Exception was: javax.naming.AuthenticationException: [LDAP: error code 49 - INVALID_CREDENTIALS: Bind failed: Attempt to lookup non-existant entry: cn=sim,ou=people,dc=example,dc=com]; resolved object com.sun.jndi.ldap.LdapCtx@5de37d66. Type: class javax.naming.AuthenticationException
COUNT: 1
org.mule.api.transport.DispatchException: route number 1 failed to be executed. Failed to route event via endpoint: InterceptingChainLifecycleWrapper 'wrapper for processor chain 'null'' 
[ 
  ScriptComponent{CheckAuth.component.553657235}, 
  org.mule.module.ldap.processors.BindMessageProcessor@647af13d, 
  org.mule.module.ldap.processors.SearchMessageProcessor@2aac6fa7, 
  InvokerMessageProcessor [name=ldapUtils, object=com.at.mkrf.aggregate.LDAPUtils@5714c7da, methodName=findGroupByName, argExpressions=[#[payload], #[systemName]], argTypes=[Ljava.lang.Class;@5af349a6]
]. Message payload is of type: NullPayload

1 个答案:

答案 0 :(得分:0)

CompositeRoutingException上,您可以致电:

exception.getExceptions().values()

从分散 - 聚集中获取Array Throwable个{{1}}。然后重新抛出相应的异常。