首页 文章

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

提问于
浏览
2

在完成“Camel in Action”之后,我对Apache Camel完全不熟悉,我对基本功能仍然不太清楚 . 有没有办法在没有在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 回答

  • 1

    只根据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);
            }
        }
    }
    
  • 2

    如果有人遇到这个问题,并且正在寻找有关如何在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);
    

相关问题