2013-11-18 3 views
1

У меня есть приложение, написанное на верблюде 2.10.6, которое использует EIP aggregator. Он получает в качестве входных 2 файлов: один заканчивается -information, а другой заканчивается -report. Я должен обрабатывать оба файла (отдельно), а после обработки я должен комбинировать (т. Е. aggregate) оба вместе.Агрегатор верблюдов с корреляцией Выражение

Для этого я использую EIP aggregator. Я определил маршруты, используя весенний DSL. У меня нет корреляционного выражения. То есть, мое выражение является константой true.

 <route> 
     <from uri="activemq:assemblingAll" /> 
     <log message="\n---------->>> @ASSEMBLEALL" /> 

     <aggregate strategyRef="myAggregator" completionSize="2"> 
      <correlationExpression> 
       <constant>true</constant> 
      </correlationExpression> 

      <to uri="activemq:toBeValidated" /> 
     </aggregate> 
    </route> 

Я хотел бы коррелируют файлы, которые принадлежат вместе, то есть файлы с же префиксом (префиксом является строка перед тем-information (соотв. .report). Я считаю, что это будет е также можно, установив некоторый идентификатор в заголовке.

Моя проблема заключается в том, что я не знаю, как это сделать. до сих пор все мои попытки породившей org.apache.camel.CamelExchangeException: Invalid correlation key.

Любой намек?

Заранее спасибо.

Мои маршруты (в упрощенном виде) выглядит следующим образом:

<camelContext xmlns="http://camel.apache.org/schema/spring"> 

    <!-- switchOnFilename" --> 
    <route> 
     <from uri="file:/inputdir" /> 

     <choice> 
      <when> 
       <simple>${header.CamelFileName} regex '.*-information$'</simple> 
       <log message="\n---------->>> -information" /> 
       <to uri="activemq:information" /> 
      </when> 

      <otherwise> 
       <!-- The default case --> 
       <log message="\n---------->>> DEFAULT CASE (*-report)" /> 
       <to uri="activemq:report" /> 
      </otherwise> 
     </choice> 
    </route> 

    <route> 
     <from uri="activemq:information" /> 
     <bean ref="myExtractInformation" /> 
     <to uri="xslt:ExtractInformation.xsl" />      
     <to uri="activemq:assemblingAll" /> 
    </route> 

    <route> 
     <from uri="activemq:report" /> 
     <bean ref="myExtractReports" />   
     <to uri="xslt:extractReports.xsl" /> 
     <to uri="activemq:assemblingAll" /> 
    </route> 

    <route> 
     <from uri="activemq:assemblingAll" /> 
     <log message="\n---------->>> @ASSEMBLEALL" /> 
     <aggregate strategyRef="myAggregator" completionSize="2"> 
      <correlationExpression> 
       <constant>true</constant> 
      </correlationExpression> 

      <to uri="activemq:toBeValidated" /> 
     </aggregate> 
    </route> 

    <route> 
     <from uri="activemq:toBeValidated" /> 

     <doTry> 
      <to uri="validator:validator.xsd" /> 
      <to uri="activemq:insertUpdateDB" /> 
      <doCatch> 
       <exception>org.apache.camel.ValidationException</exception> 
       <log message="INVALID " /> 

       <to uri="mock:invalid" /> 
      </doCatch> 
      <doFinally> 
       <log message="Finalizer...." /> 
       <to uri="mock:finally" /> 
       <to uri="mock:invalid" /> 
      </doFinally> 
     </doTry> 
    </route> 

    <route> 
     <from uri="activemq:insertUpdateDB" /> 
     <setHeader headerName="CamelHttpMethod"> 
      <constant>PUT</constant> 
     </setHeader> 
     <setHeader headerName="Content-Type" inheritErrorHandler="true" id="setHeader3"> 
      <constant>application/xml</constant> 
     </setHeader> 
     <setHeader headerName="Content-Encoding"> 
      <constant>UTF-8</constant> 
     </setHeader> 
     <to uri="http4://localhost:8181/rest/insertUpdateDB" /> 
    </route> 

ответ

0

Возможно использовать ссылку боба как выражение корреляции.

<correlationExpression> 
    <method ref="dataCorrelationExpression" method="getPrefixString" /> 
</correlationExpression> 

Затем написать боб, чтобы сделать это, например, так

public class DataCorrelationExpression { 
    public String getPrefixString(@Header("CamelFileName") String filename) throws Exception { 
     String[] parts = filename.split("\\."); 
     if (parts.length != 2) { 
      throw new Exception("Oh no!"); 
     } 
     return parts[0]; 
    } 
} 

Убедитесь, что боб конкретизируется в вашем контексте Spring.

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