2015-01-29 10 views
0

JSON 페이로드에서 문서를 뽑아 내고 위치에 따라 다른 프로세서로 보내고 싶습니다.Camel에서 스플리터를 커스터마이징 한 후 라우터를 연결하는 방법

JSON :

{ 
    "email" : { 
     "documents" : [{ 
       "name" : "Document 1", 
       "id" : "1111" 
      }, { 
       "name" : "Document 2", 
       "id" : "222" 
      } 
     ] 
    }, 
    "sms" : { 
     "documents" : [{ 
       "name" : "Document 3", 
       "id" : "3333" 
      }, { 
       "name" : "Document 4", 
       "id" : "4444" 
      } 
     ] 
    } 
} 

나는 이런 식으로 뭔가를 수행하여이를 달성하기 위해 생각했다 :

from("servlet:///doc").unmarshal() 
    .json(JsonLibrary.Jackson, DocumentRequest.class) 
    .split().method("docSplit", "split") 
    .choice() 
    .when().header("mode").isEqualTo("email") 
     .to("direct:email") 
    .when().header("mode").isEqualTo("sms") 
     .to("direct:sms"); 

DocumentRequest를 받고있는 모든 문서를 꺼내 ...하지만 내가 할 수있는 내 스플리터 미래의 라우팅을 위해 "모드"헤더를 설정하는 방법을 모른다.

어떻게 "모드"헤더를 설정할 수 있습니까?

더 좋은 방법이 있습니까?

답변

1
당신은 항상 예를 ​​들어 ProducerTemplate

을 사용자 정의 프로세서에 사용자 정의 분할 논리를 넣어 사용할 수 있습니다

:

from("servlet:///doc").unmarshal() 
       .json(JsonLibrary.Jackson, DocumentRequest.class) 
       .process(new Processor() { 
        @Override 
        public void process(Exchange exchange) throws Exception { 
         ProducerTemplate producer=exchange.getContext().createProducerTemplate(); 

         String mode; 
         for (Document doc: // split and set mode logic goes here) { 
          if (mode.compareToIgnoreCase("email") ==0) { 
           producer.sendBody("direct:email", doc); 
          } else 
          if (mode.compareToIgnoreCase("sms") ==0) { 
           producer.sendBody("direct:sms", doc); 
          } 
... 
         } 
        } 
       });