Exception handling 在Mule ESB中重新触发分散聚集流之外的异常

Exception handling 在Mule ESB中重新触发分散聚集流之外的异常,exception-handling,mule,mule-component,Exception Handling,Mule,Mule Component,我有一个非常具体的问题,我真的到处寻找答案。。。 以下是一种情况:我有一个具有自定义聚合策略的分散-聚集组件。 -子流的图像 这个过程的语义相当简单。请求带有基本身份验证头,上层调用空java处理器,返回原始有效负载,下层通过LDAP对用户进行身份验证,并返回此身份验证过程的布尔结果。自定义聚合类检查结果,如果身份验证正常,则返回原始有效负载,该负载来自road#1。如果不正常,则抛出异常。这里没什么问题,它很有效 有一点棘手的事情。若用户传递了错误的身份验证数据,则ldap:bind模块中会发

我有一个非常具体的问题,我真的到处寻找答案。。。 以下是一种情况:我有一个具有自定义聚合策略的分散-聚集组件。
-子流的图像
这个过程的语义相当简单。请求带有基本身份验证头,上层调用空java处理器,返回原始有效负载,下层通过LDAP对用户进行身份验证,并返回此身份验证过程的布尔结果。自定义聚合类检查结果,如果身份验证正常,则返回原始有效负载,该负载来自road#1。如果不正常,则抛出异常。这里没什么问题,它很有效

有一点棘手的事情。若用户传递了错误的身份验证数据,则ldap:bind模块中会发生异常。根据文档,异常会传播到散布聚集,因此我尝试使用以下方法捕捉它:

@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;
}
但是! 因此,我看到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

CompositeRoutingException
上,您可以调用:

exception.getExceptions().values()

获取从散布聚集中抛出的
可丢弃的
数组
。然后重新抛出相应的异常。

您可以尝试使用自定义异常策略,即为流定义自己的异常策略(创建java类,该类将扩展DefaultMessaginExceptionStrategy),并在doHandleException方法中传播此异常以供回复。真正的问题发生在异常块之外很远的地方。即使在自定义聚合器中,我也无法获得正确的异常,因为它更接近它的源,然后是异常块。