Что такое хороший способ для регистрации смежных HTTP-запросов с потоком интеграции Spring - PullRequest
0 голосов
/ 01 октября 2018

Каков хороший способ регистрации соседних HTTP-запросов в потоке интеграции Spring?

Мое приложение:

Для каждого клиента (имеет собственный поток, запуск которого запланирован опрашивающим устройством)

  • Операция GET 1 в исходном приложениии результатом является JSON_1
  • POST JSON_1 для удаленной системы, а результатом является JSON_1B
  • POST JSON_1B для исходного приложения, а результатом является операция JSON_1C
  • GET 2 в операцииисходное приложение и результат JSON_2
  • POST JSON_2 для удаленной системы, а результат JSON_2B
  • POST JSON_2B для исходного приложения и результат JSON_2C

...

  • Операция GET n в исходном приложении и результат JSON_N
  • POST JSON_N для удаленной системы, а результат JSON_NB
  • POST JSON_NB дляисходное приложение и результат: JSON_NC

Операции 1, 2, ..., n должны быть в порядке

Вот мой пример программы (для простоты всеREST звонки для ттот же класс)

@Configuration
public class ApplicationConfiguration {

@Autowired
private IntegrationFlowContext flowContext;

@Bean
public MethodInvokingMessageSource integerMessageSource() {
    final MethodInvokingMessageSource source = new MethodInvokingMessageSource();
    source.setObject(new AtomicInteger());
    source.setMethodName("getAndIncrement");
    return source;
}

@PostConstruct
public void createAndRegisterFlows() {
    IntegrationFlowBuilder integrationFlowBuilder = createFlowBuilder();
    for (int i = 1; i <= 2; i++) {
        integrationFlowBuilder = flowBuilder(integrationFlowBuilder, i);
    }
    integrationFlowBuilder.handle(CharacterStreamWritingMessageHandler.stdout());
    flowContext.registration(integrationFlowBuilder.get()).register();
}

private IntegrationFlowBuilder createFlowBuilder() {
    return IntegrationFlows.from(this.integerMessageSource(), c -> c.poller(Pollers.fixedRate(5000)));
}

private IntegrationFlowBuilder flowBuilder(final IntegrationFlowBuilder integrationFlowBuilder, final int number) {
    return integrationFlowBuilder
            .handle(Http.outboundGateway("http://localhost:8055/greeting" + number).httpMethod(HttpMethod.GET)
                    .expectedResponseType(String.class))
            .channel("getReceive" + number)
            .handle(Http.outboundGateway("http://localhost:8055/greeting" + number).httpMethod(HttpMethod.POST)
                    .expectedResponseType(String.class))
            .channel("postReceive" + number)
            .handle(Http.outboundGateway("http://localhost:8055/greeting-final" + number)
                    .httpMethod(HttpMethod.POST).expectedResponseType(String.class))
            .channel("postReceiveFinal" + number);
}
}

Эта программа выполняет интеграционный поток

GET http://localhost:8055/greeting1
POST http://localhost:8055/greeting1 (previous result as an input)
POST http://localhost:8055/greeting-final1 (previous result as an input)
GET http://localhost:8055/greeting2
POST http://localhost:8055/greeting2 (previous result as an input)
POST http://localhost:8055/greeting-final2 (previous result as an input)

Это работает, как и ожидалось.Но мне интересно, это хороший способ сделать это, потому что ответ на звонок POST http://localhost:8055/greeting-final1 не используется в звонке GET http://localhost:8055/greeting2.Я только хочу, чтобы эти звонки были в таком порядке.

1 Ответ

0 голосов
/ 01 октября 2018

На самом деле у вас есть все, что вам нужно с этим циклом для создания подпотоковых вызовов к сервисам REST.Только то, что вам не хватает, - это payload в результате greeting-final1, который будет опубликован с сообщением .channel("postReceiveFinal" + number).Вторая итерация подпишет greeting2" на этот канал, и payload доступен для обработки здесь.Не уверен, как переработать ваш метод flowBuilder(), но вам просто нужно использовать payload из сообщения для любых ваших требований, например, вы можете использовать его как:

/**
 * Specify an {@link Expression} to evaluate a value for the uri template variable.
 * @param variable the uri template variable.
 * @param expression the expression to evaluate value for te uri template variable.
 * @return the current Spec.
 * @see AbstractHttpRequestExecutingMessageHandler#setUriVariableExpressions(Map)
 * @see ValueExpression
 * @see org.springframework.expression.common.LiteralExpression
 */
public S uriVariable(String variable, Expression expression) {

, чтобы ввестиполезная нагрузка для некоторого параметра запроса, так как это просто HttpMethod.GET:

handle(Http.outboundGateway("http://localhost:8055/greeting2?param1={param1}")
        .httpMethod(HttpMethod.GET)
        .uriVariable("param1", "payload")
        .expectedResponseType(String.class))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...