Apache Camel: Есть ли способ установить сообщение как неисправное, не вводя обмен в метод бина? - PullRequest
2 голосов
/ 21 декабря 2011

Я совершенно новичок в Apache Camel, после того, как я закончил «Верблюд в действии», я до сих пор не очень разбираюсь в основных функциях. Есть ли способ установить сообщение как сообщение об ошибке, не вводя обмен в метод bean.

Здесь я могу привести пример:

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

Метод с именем "parseIP" предназначен для синтаксического анализа ip в теле с использованием xpath и сохранения его значения в карте свойств. Но если в теле вообще нет тега 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);
    }
}

Но разве это лучшее решение? Потому что, как только я внедряю обмен в бобовый метод, я думаю, что он ничем не отличается от верблюжьего процессора, и я теряю большую часть его преимущества. Боб в верблюде может завершить свою собственную работу без использования какого-либо специального API для Camel, но как только обмен введен, преимущество исчезает.

Кто-то может помочь мне с вопросом? Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

просто установить ошибку из маршрута на основе результатов 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 голос
/ 11 апреля 2014

Если кто-то сталкивался с этим вопросом и ищет подробности о том, как установить ошибки мыла из CXF в режимах POJO, Message или Payload, взгляните на эту ссылку из 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...