2015-03-04 2 views
1

Я использую весенний маршрутизатор, чтобы решить, какой из двух каналов пройти. Я не перейду на службу, которая возвращает ответ на одно из значений полезной нагрузки, а не на полезную нагрузку. Как я могу это сделать? Я действительно не нашел такой случай, я подумал, что, возможно, это можно сделать, используя обогатитель. Какие-либо предложения?spring: добавление параметров для маршрутизатора

Мой код:

<int:router id="aggregationRouter" 
      input-channel="aggregationPathRouterInputChannel" 
      ref="decideAggregationByName" 
     > 
    <int:mapping value="true" channel="SumAggregatorChannel" /> 
    <int:mapping value="false" channel="AvgAggregatorChannel"/> 
</int:router> 

decideAggregationByName получает ввод, который является строка (имя) и возвращает логическое значение. я не знаю, как передать строковый аргумент, который является членом внутри полезной нагрузки я получаю на этом этапе

ответ

1

Большинство компонентов Spring Integration обеспечивают expression вариант в противоречии с ref и method. Так что, если ваш payload является Map (к примеру), но ваш decideAggregationByName требует String в качестве аргумента, и вы знаете, какой key представляет value для этого арга вы можете сделать это так:

<int:router id="aggregationRouter" 
     input-channel="aggregationPathRouterInputChannel" 
     expression="@decideAggregationByName.doDecision(payload['key'])" 
    > 

С другой стороны, вы может переработать этот целевой метод для принятия целого объекта payload и извлечь желаемый String из кода вручную.

В противном случае я не уверен, в чем проблема, перед вами.

+0

Спасибо, это похоже на работу :) – user2512231

0

Попробуйте этот путь. Мы можем использовать выражение, чтобы решить канал:

<int:router input-channel="aggregationPathRouterInputChannel" 
    expression="payload ? 'SumAggregatorChannel' : 'AvgAggregatorChannel'" /> 
0

Если я не ошибаюсь, то, что вы хотите достигнуть, выберите соответствующий канал на основе какой-то ключ в полезной нагрузке, а затем передать только ту часть полезной нагрузки на службу а не полная полезная нагрузка. Решение bilan по-прежнему будет передавать полную полезную нагрузку, а затем в конце вашего обслуживания вы должны будете вынуть это значение (что не похоже на хороший шаблон, поскольку это не ваша работа с серийными методами). что бы я предложил : Шаг1: Напишите разделитель, в котором вы создадите список MessageObjects для разных значений в полезной нагрузке.

public List<Message<?>> spitPayload(your payload) { 

List<Message<?>> result = new ArrayList<Message<?>>(); 

final Message<?> message1 = MessageBuilder 
        .withPayload("values from payload for sum") 
        .setHeader('routerId', 
          "sum").build(); 
final Message<?> message2 = MessageBuilder 
        .withPayload("values from payload for avg") 
        .setHeader('routerId', 
          "avg").build(); 

result.add(message1);result.add(message2); 
return message; 

}

Шаг2: Router судить соответствующий канал на основе ключа paylod.

<si:header-value-router header-name="routerid" 
     input-channel="aggregationPathRouterInputChannel"> 
    <si:mapping value="sum" channel="sumchannel" /> 
    <si:mapping value="avg" channel="avgchannel" /> 
</si:header-value-router> 

Как только ключ будет согласован, только необходимая часть платного модуля будет перенесена в конечную точку канала.

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