Агрегация верблюдовСтратегия - PullRequest
0 голосов
/ 03 декабря 2018

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


.enrich("direct:step1-processing", new AggregationStrategy() {<br/>
   @Override<br/>
      public Exchange aggregate(final Exchange oldExchange, <br/>
                                final Exchange newExchange) {<br/>
       copyHeader(SomeBean.SpecificHeader_1, <br/>
                     newExchange, <br/>
                     oldExchange);<br/>
          return oldExchange;<br/>
      }<br/>
     })

.enrich("direct:step2-processing", new AggregationStrategy() {<br/>
    @Override<br/>
      public Exchange aggregate(final Exchange oldExchange, <br/>
                                final Exchange newExchange) {<br/>
       copyHeader(SomeBean.SpecificHeader_2, <br/>
                     newExchange, <br/>
                     oldExchange);<br/>
          return oldExchange;<br/>
      }<br/>
     })

void copyHeader(final String headerName, <br/>
                final Exchange newExchange, <br/>
                final Exchange oldExchange) {<br/>
        oldExchange.getIn().setHeader(
             headerName, <br/>
             newExchange.getIn().getHeader(headerName));<br/>
}

Моя цель - переместить код AggregationStrategy в свой собственный класс, а не встраивать код в код.Это само по себе не является проблемой, вопрос состоит в том, как передать этот параметр ( SomeBean.SpecificHeader_1 или SomeBean.SpecificHeader_2 ), который указывает, какое значение заголовка следует скопировать из старого обмена вnew exchange.

Насколько я могу судить, метод public Aggregate () не позволяет передавать параметр, отличный от old & new exchange.

1 Ответ

0 голосов
/ 03 декабря 2018

Решение 1: Определите свою собственную стратегию

Вы можете иметь отдельный экземпляр AggregationStrategy для каждого конкретного заголовка:

public class MyAggregationStrategy implements AggregationStrategy {

    private String headerName;

    public MyAggregationStrategy(String headerName) {
        this.headerName = headerName;
    }

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        copyHeader(newExchange, oldExchange);
        return oldExchange;
    }

    void copyHeader(final Exchange newExchange,
                    final Exchange oldExchange) {
        oldExchange.getIn().setHeader(
                headerName,
                newExchange.getIn().getHeader(headerName));
    }

}

Затем используйте эти стратегиикак это:

.enrich("direct:step1-processing", new MyAggregationStrategy(SomeBean.SpecificHeader_1))
.enrich("direct:step2-processing", new MyAggregationStrategy(SomeBean.SpecificHeader_2))

Решение 2: Используйте лямбда

С вашим слегка адаптированным исходным copyHeaders() методом:

Exchange copyHeader(final String headerName,
                final Exchange newExchange,
                final Exchange oldExchange) {
    oldExchange.getIn().setHeader(
            headerName,
            newExchange.getIn().getHeader(headerName));
    return oldExchange;
}

Затем определитенеобходимые стратегии:

AggregationStrategy header1Strategy = (oldExchange, newExchange) -> copyHeader("my-header-1", oldExchange, newExchange);
AggregationStrategy header2Strategy = (oldExchange, newExchange) -> copyHeader("my-header-2", oldExchange, newExchange);

Наконец, используйте их:

.enrich("direct:step1-processing", header1Strategy)
.enrich("direct:step2-processing", header2Strategy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...