Apache Camel:有没有办法在没有在bean方法中注入交换的情况下将消息设置为错误?

时间:2011-12-21 15:58:09

标签: java apache-camel

我对Apache Camel完全不熟悉,在完成“Camel in Action”之后,我仍然不太清楚基本功能。有没有办法在没有用bean方法注入交换的情况下将消息设置为错误消息。

我在这里可以提供一个例子:

class HttpBean{
    public void parseIP(@Properties Map properties,@XPath("//ip") String ip){
        properties.put("IP", ip);
    }
}

名为“parseIP”的方法用于使用xpath解析正文中的ip并将其值保存在属性映射中。但是如果在主体中根本没有ip标签,我想创建一个错误消息并终止进程(不只是抛出一个异常,它将被视为可恢复的错误,这里我想要一个不可恢复的错误)。为了实现这一目标,我可以使用以下代码:

class HttpBean{
    public void parseIP(@Properties Map properties,@XPath("//ip") String ip, Exchange exchange){
        if(ip == null){
            exchange.getIn().setFault(true);
            exchange.getIn().setBody("Ip is missing");
        }
        properties.put("IP", ip);
    }
}

但这是最好的解决方案吗?因为一旦我将交换注入bean方法,我认为它与骆驼处理器没有什么不同,我失去了它的大部分优势。骆驼中的bean可以在不使用任何Camel特定API的情况下完成自己的工作,但是一旦注入交换,优势就会消失。

有人可以帮我解决这个问题吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

根据bean的结果从路径设置错误...如果属性IP为null,则设置错误等...

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {

            from("direct:route1")
                .bean(new HttpBean())
                .filter(property("IP").isNull()).setFaultBody(constant("Ip is missing")).end()
                .to("mock:mock");
        }
    };
}

public static class HttpBean {
    public void parseIP(@Properties Map properties, @XPath("//ip") String ip){
        if(ip != null && ip.length() > 0){
            properties.put("IP", ip);
        }
    }
}

答案 1 :(得分:1)

如果有人遇到这个问题并且正在寻找有关如何在POJO,消息或有效负载模式下从CXF设置Soap故障的详细信息,请查看Talend中的此链接:

https://help.talend.com/display/TalendESBMediationDeveloperGuide54EN/3.8.10+How+to+throw+a+SOAP+Fault+from+Camel

以下是代码段:

    SoapFault fault = new SoapFault("unable to process request", SoapFault.FAULT_CODE_SERVER);
    Element detail = fault.getOrCreateDetail();

    Document detailPayload = getYourDetailHere();
    detail.appendChild(detail.getOwnerDocument().importNode(detailPayload.getDocumentElement(), true));

    Message outMessage = exchange.getOut();
    outMessage.setHeader(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
    outMessage.setFault(true);

    outMessage.setBody(fault);