У нас есть такой код, который трижды повторяет вызов API в рамках механизма опроса. Если он не завершится, он создаст дело, вызвав другой API. Происходит следующее: в журналах я вижу два потока — основной и пул потоков, создающие новые дела. Таким образом, идентификатор отслеживания из пула потоков thead принимает значение null и, таким образом, создает дублирующиеся потоки.
Вот соответствующая часть кода. LLM предлагает мне добавить тайм-аут ниже вызова отмены, однако с этим сталкивается другой API, в котором нет тайм-аута. Основной поток
// Add a small delay to ensure the polling thread has stopped
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
for (int i = 0; i < maxAttemptForCeaseLine; i++) {
// Check if thread has been interrupted/cancelled
if (Thread.currentThread().isInterrupted()) {
log.info("Polling cancelled for trackingId: {}", trackingId);
return null;
}
У нас есть такой код, который трижды повторяет вызов API в рамках механизма опроса. Если он не завершится, он создаст дело, вызвав другой API. Происходит следующее: в журналах я вижу два потока — основной и пул потоков, создающие новые дела. Таким образом, идентификатор отслеживания из пула потоков thead принимает значение null и, таким образом, создает дублирующиеся потоки. Вот соответствующая часть кода. LLM предлагает мне добавить тайм-аут ниже вызова отмены, однако с этим сталкивается другой API, в котором нет тайм-аута. [b]Основной поток[/b] [code]if (entity != null && entity.getId() != null) { Future future = null; try { log.info("Waiting for polling result for id : {} trackingId: {}", entity.getId(), trackingId); OrderRequest finalEntity = entity; String finalProductOrderId = productOrderId; Callable task = () -> checkGetStatusAPIForCeaseLine(customerId, finalProductOrderId, routeEnv, sc, trackingId, finalEntity, req); future = executor.submit(task); CeaseLineResponse result = future.get(futureTimeoutSecondsForCeaseLine, TimeUnit.SECONDS); return result; } catch (TimeoutException te) { log.warn("Polling did not complete in time for id: {} trackingId: {}", entity.getId(), trackingId); future.cancel(true); return handleAmaCaseForCeaseLineTimeout(customerId, entity, productOrderId, req, httpHeaders, trackingId); } catch (Exception e) { log.error("Error while waiting for poll result", e); return CeaseLineResponse.builder() .httpCode(500) .message("FAILED") .orderNo(entity.getBillerOrderNo()) .orderActionId(entity.getBillerOrderActionNo()) .build(); } } [/code] Вызов исполнителя [code]@Transactional public CeaseLineResponse checkGetStatusAPIForCeaseLine(String customerId, String productOrderId, String routeEnv, String sc, String trackingId, OrderRequest entity, CreateAndSubmitSuspendResumeCeaseOrderRequest req) {
entity.setRejectReason("Order created but still processing - case Number: " + caseNumber); entity.setStatus(OrderStatus.SUBMITTED); final OrderRequest save = ceaseOrderRepo.save(entity); log.info("SUBMITTED (polling finished) for cease line. Updated row: {} trackingId: {}", save, entity.getTrackingId());
return buildAcceptedOrderResponse202(entity.getBillerOrderNo(), entity.getBillerOrderActionNo(), "Order created but still processing", caseNumber); } [/code] Это то, что происходит в запросе и создании нового дела с использованием API [code]u_correlation_id\":\"null:9001962483:9001962484[/code] Вот что LLM предложила мне добавить после вызова отмены: [code]// Add a small delay to ensure the polling thread has stopped try { Thread.sleep(100); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } [/code] и прерванная проверка здесь" [code]for (int i = 0; i < maxAttemptForCeaseLine; i++) { // Check if thread has been interrupted/cancelled if (Thread.currentThread().isInterrupted()) { log.info("Polling cancelled for trackingId: {}", trackingId); return null; } [/code] Что здесь не так? Есть мысли?