верблюд расщепляется / агрегирует и объединяет Список <A>, который содержит Список <B>, который содержит Список <C> - PullRequest
0 голосов
/ 05 февраля 2019

Учитывая структуру, подобную этой:

@Data
public class A {
    //..other fields..

    private List<B> bs;
}

@Data
public class B {
    //..other fields..

    private List<C> cs;
}

Я должен обработать список типа A в несколько шагов / маршрутов.Некоторые операции находятся на уровне A, другие на других уровнях, таких как C.

Проблема, которую я пытаюсь решить, заключается в обработке каждого C, получающего A, а затем некоторая логика должна работать с обновленным Aмодель.

Я могу успешно разделить и агрегировать обратно list<C>, но теперь я застрял, пытаясь восстановить A, учитывая выходные данные для B и C.

Это то, что у меня сейчас:

from("direct:my-A-Item")
    .id("direct-a")
    .autoStartup(true)
    .split(ExpressionBuilder.beanExpression(new CSplitter(), "getBs"), new MyAggregationStrategy())
        .streaming()
        .split(ExpressionBuilder.beanExpression(new CSplitter(), "getCs"), new MyAggregationStrategy())
            .streaming()
            .bean(processor, "doStuff")//Working on a since C instance
        .end()
        .bean(processor, "test") //Here I get the worked List<C>
    .end()
    //.bean(processor, "thisProcessorNeedsA").end(); //TODO get the original A and the output List<C> so i can make further work on them

Как я могу обновить экземпляры B новым списком C, а затем сделать то же самое для обновления A?

public class CSplitter {

    public List<B> getBs(A a) {
        return a.getBs();
    }

    public List<C> getCs(B b) {
        return b.getCs();
    }
}

public class MyAggregationStrategy implements AggregationStrategy {

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        Object newBody = newExchange.getIn().getBody();
        ArrayList<Object> list = null;
        if (oldExchange == null) {
            list = new ArrayList<Object>();
            list.add(newBody);
            newExchange.getIn().setBody(list);
            return newExchange;
        } else {
            list = oldExchange.getIn().getBody(ArrayList.class);
            list.add(newBody);
            return oldExchange;
        }
    }
}

Проверка документации и онлайн-ресурсов я не смогнайдите любой пример агрегации, имеющий также тело из предыдущего шага ... любые советы приветствуются:)

1 Ответ

0 голосов
/ 05 февраля 2019

Я бы захватил тело A как свойство обмена до разделения, тогда оно будет доступно позже.

from("direct:my-A-Item")
    .id("direct-a")
    .autoStartup(true)
    .setProperty("originalA", body())
    .split
      // etc.
    .end()
    .bean(processor, "myMethod(${property.originalA}, ${body})").end(); 
...