2011-12-21 24 views
1

我完全不熟悉Apache Camel,在完成「駱駝行動」之後,我仍然不太清楚基本功能。有沒有什麼方法可以將消息設置爲錯誤消息,而無需在bean方法中注入交換。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可以完成自己的工作,而不使用任何駱駝特定的API,但是一旦交換被注入,優勢就消失了。

有人可以幫我解決這個問題嗎?非常感謝。

+0

包括你用來稱這個豆的路線...... – 2011-12-22 00:18:41

回答

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); 
     } 
    } 
} 
+0

非常感謝。我認爲這是一個更好的解決方案。 – Javen 2011-12-22 01:58:57

1

如果任何人碰到這個問題,運行方式,並且尋找以瞭解如何從CXF設置SOAP錯誤的POJO,消息或負載模式,看看從了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); 
相關問題