2016-01-05 3 views
-1

Что касается вопроса: Apache camel returns multiple exceptions during a routeApache верблюд агрегат дает исключение

Его показали, что я не могу получить список строк с раздельным способом, так что я попробовал совокупный метод следующим образом:

public class lowestRates implements AggregationStrategy { 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    String oldStr = oldExchange.getIn().getBody(String.class); 
    String newStr = newExchange.getIn().getBody(String.class); 
    Pattern p = Pattern.compile("(\\w+)\\s(\\d+)"); 
    Matcher m1 = p.matcher(oldStr); 
    Matcher m2 = p.matcher(newStr); 
    String finalStr = ""; 
    if(m1.group(2).equalsIgnoreCase(m2.group(2))) 
     finalStr = m1.group(1) + Integer.toString(Integer.parseInt(m1.group(2)) > Integer.parseInt(m2.group(2)) ? Integer.parseInt(m2.group(2)) : Integer.parseInt(m1.group(2))); 
    else 
     finalStr = oldStr + "\n" + newStr; 
    oldExchange.getIn().setBody(finalStr); 
    return oldExchange; 
} 

}

и новый главный код:

from("file://files") 
        .split() 
        .tokenize("\n") 
        .aggregate(new lowestRates()) 
        .body() 
        .completionTimeout(5000) 
        .to("file://files/result.txt") 

но это дает я:

org.apache.camel.CamelExchangeException: Error occurred during aggregation. Exchange[][Message: Good1 450]. Caused by: [java.lang.NullPointerException - null] 

Теперь вопрос в том, как написать правильный метод агрегирования, потому что я не вижу ничего сделать здесь не так :(.

+0

'String oldStr = oldExchange.getIn(). GetBody (String.class);' oldStr будет иметь значение null для первого сообщения. –

+0

Вы имели в виду строку или обмен? Также вы можете предложить исправить это? – lkn2993

+0

Пожалуйста, посмотрите мой пример. Я думаю, вы можете сделать это лучше :) –

ответ

1
String oldStr = oldExchange.getIn().getBody(String.class); 
String newStr = newExchange.getIn().getBody(String.class); 

Вы должны проверить строки для нулевой здесь .. oldStr будет нулевым для первого сообщения. IMHO вы получаете исключение, а затем пытаетесь разобрать нулевую строку. И да, проверка обмен на нуль

if (oldExchange == null) { 
     return newExchange; 
    } 

Обновлено: Попробуйте так:

public class lowestRates implements AggregationStrategy { 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    if (oldExchange == null) { 
     return newExchange; 
    } 
    if (newExchange.getIn().getBody()!=null){ 
     Pattern p = Pattern.compile("(\\w+)\\s(\\d+)"); 
     String finalStr = ""; 
     String oldStr = oldExchange.getIn().getBody(String.class); 
     String newStr = newExchange.getIn().getBody(String.class); 
     if (oldStr!=null&&newStr!=null){ 
     Matcher m1 = p.matcher(oldStr); 
     Matcher m2 = p.matcher(newStr); 

      if(m1.group(2).equalsIgnoreCase(m2.group(2))) 
      finalStr = m1.group(1) + Integer.toString(Integer.parseInt(m1.group(2)) > Integer.parseInt(m2.group(2)) ? Integer.parseInt(m2.group(2)) : Integer.parseInt(m1.group(2))); 
      else 
      finalStr = oldStr + "\n" + newStr; 
      } 

     oldExchange.getIn().setBody(finalStr); 
     } 
     return oldExchange; 
    } 
} 

Кроме того, необходимо изменить агрегацию следующим образом,

От:

Aggregate(new strategy()).body() //This is where things go wrong 

Кому:

Aggregate(constant(true), new strategy()).completionFromBatchConsumer() 
+0

К сожалению, его неправильный ответ, поскольку агрегирование или метод split имеют в них что-то неправильное, oldexchange ВСЕГДА NULL. – lkn2993

+0

Ну, на самом деле новый ответ правильный, извините, если комментарий ведет к недоразумениям. – lkn2993

Смежные вопросы