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