2016-06-02 7 views
0

//はCamelTestSupport集団を分割するにはどうすればいいですか?

@Produce 
private ProducerTemplate template; 

@EndpointInject(uri = "mock:out") 
private MockEndpoint mock; 

@Test 
public void testSplitAggregateConvertOrder(){ 
    List<InOrder> inOrderList = new ArrayList<InOrder>(); 

    InOrder inOrder1 = new InOrder(); 
    inOrder1.setId("1"); 
    inOrderList.add(inOrder1); 

    InOrder inOrder2 = new InOrder(); 
    inOrder2.setId("2"); 
    inOrderList.add(inOrder2); 

    InOrder inOrder3 = new InOrder(); 
    inOrder3.setId("3"); 
    inOrderList.add(inOrder3); 

    template.sendBody("direct:start", inOrderList); 

    Exchange outList = mock.getReceivedExchanges().get(0); 
    List<OutOrder> outOrderList = outList.getIn().getBody(List.class); 
    for(OutOrder outOrder : outOrderList){ 
     System.out.println("####### mockResult id : "+outOrder.getId()); 
    } 
} 

@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    return new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 

      context.getTypeConverterRegistry().addTypeConverter(OutOrder.class, InOrder.class, new MyOrderTypeConverter()); 

      from("direct:start") 
      .split(body(), new AggregationStrategy() { 
       @Override 
       public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
        if (oldExchange == null) { 
         List<OutOrder> orders = new ArrayList<OutOrder>(); 
         OutOrder newOrder = newExchange.getIn().getBody(OutOrder.class); 
         orders.add(newOrder); 
         newExchange.getIn().setBody(orders); 
         return newExchange; 
        } 
        List<OutOrder> orders = oldExchange.getIn().getBody(List.class); 
        OutOrder newOutOrder = newExchange.getIn().getBody(OutOrder.class); 
        orders.add(newOutOrder); 
        oldExchange.getIn().setBody(orders); 
        return oldExchange; 
       } 
      }) 
      .convertBodyTo(OutOrder.class) 
      .end() //splitter ends here and the exchange body is now List<OutOrder> 
      .to("mock:out"); 
     } 
    }; 
} 

private static class MyOrderTypeConverter extends TypeConverterSupport { 

    @SuppressWarnings("unchecked") 
    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) { 
     // converter from inorder to outorder bean 
     OutOrder order = new OutOrder(); 
     order.setId(Integer.parseInt(((InOrder) value).getId())); 
     return (T) order; 
    } 
} 

private static class OutOrder { 
    private int id; 

    public void setId(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 
} 

private static class InOrder { 
    private String id; 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 
} 

を拡張私はすべてが返された、結果は{1,2,3}であった{1,2}のように、固定されたリスト・サイズを必要とするが、結果。

結果のサイズが2の場合は、集約を解除します。どんな体が私を助けますか?

答えて

0

集計方式のスプリッタは、常に分割されたすべてのサブメッセージを集約します。したがって、3つのサブメッセージがある場合、3つの集計が得られます。しかし、そのJavaコードのため、あなたは自分自身を追跡することができます。すでに2つのメッセージを集約している場合は、呼び出されたときに3番目のメッセージを無視できます。

+0

ご協力ありがとうございますが、関数MyOrderTypeConverter.convertToは実際に一度に1分以上必要です。私の心の中で、正しい結果が得られたらすぐに壊れます。それを解決するための他の提案があるのでしょうか? – steven

関連する問題