【问题标题】:Rethrowing an exception out of Scatter-Gather flow in Mule ESB在 Mule ESB 中重新抛出 Scatter-Gather 流中的异常
【发布时间】:2015-01-09 23:28:27
【问题描述】:

我有一个非常具体的问题,我真的到处搜索答案...... 这是一种情况:我有一个具有自定义聚合策略的 Scatter-Gather 组件。
http://clip2net.com/s/j66jK8 - 子流的图像
这个过程的语义相当简单。请求带有Basic Authentication Header,上层只调用空的java处理器,返回原始payload,下层通过LDAP认证用户,并返回此认证过程的布尔结果。自定义聚合类检查结果,如果身份验证成功,则返回原始有效负载,该有效负载来自道路#1。如果不OK,则抛出异常。这里没有错,它可以工作。

有一点棘手的事情。如果用户传递了错误的身份验证数据,则会在 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;
}

但是! 结果,我看到堆栈跟踪没有 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

【问题讨论】:

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

标签: exception-handling mule mule-component


【解决方案1】:

CompositeRoutingException,您可以拨打:

exception.getExceptions().values()

从 scatter-gather 中获得 ArrayThrowables。然后重新抛出相应的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多