2

使用下面的 Mule 配置和 Java 代码,我无法让 Mule 通过组件绑定传播异常。如何让远程服务上抛出的异常传播到调用组件?骡 EE 3.2.2

谢谢

骡子配置

<mule ...>
    <flow name="Test">
    <vm:inbound-endpoint path="Test" exchange-pattern="request-response" />
    <component class="foo.Component">
        <binding interface="foo.Interface" method="bar">
                <vm:outbound-endpoint path="Interface.bar"
                    exchange-pattern="request-response" />
        </binding>
        </component>
    </flow>

    <flow name="Interface.bar">
        <vm:inbound-endpoint path="Interface.bar" 
            exchange-pattern="request-response" />
        <scripting:component>
            <scripting:script engine="groovy">
                throw new Exception();
            </scripting:script>
        </scripting:component>
    </flow>
</mule>

Java 代码

组件.java

package foo;

public class Component {

    private Interface theInterface;

    public void foo(final String unused) throws Exception {
        theInterface.bar();
    }

    public void set(final Interface anInterface) {
        theInterface = anInterface;
    }

}

接口.java

package foo;

public interface Interface {

    String bar() throws Exception;

}

司机

package foo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.mule.api.MuleException;
import org.mule.api.client.MuleClient;
import org.mule.tck.junit4.FunctionalTestCase;


@RunWith(MockitoJUnitRunner.class)
public class ATest extends FunctionalTestCase {

    @Test(expected = Exception.class)
    public void willItThrowException() throws MuleException {
        final MuleClient client = muleContext.getClient();
        client.send("vm://Test", "", null, RECEIVE_TIMEOUT);
    }

    @Override
    protected String getConfigResources() {
        return "app/mule-config.xml";
    }

}
4

1 回答 1

2

异常不会通过消息交换作为“抛出的异常”传播,而是作为运行中消息的异常有效负载传播。

因此,调用的响应vm://Interface.bar应该是一条消息,该消息的异常有效负载设置为您抛出的异常。因为绑定将主要负载绑定到接口,所以无法从组件访问它。

一种选择是在Interface.bar流中添加一个响应转换器,它将异常有效负载(如果有)复制到主有效负载并允许 bar() 返回 Object(有时它是一个字符串,有时是一个异常)。或者使用 String 并将返回错误的约定定义为 String。

于 2012-06-07T22:05:22.670 回答