Каков хороший способ зарегистрировать смежные 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
. Я только хочу, чтобы эти звонки были в таком порядке.