У нас есть бизнес-требования, которые вынуждают нас обновлять запасы в Solr в реальном времени каждый раз после заказа пользователя. Я создал новое действие в нашем orderProcess.xml, которое установит блокировку, запустил наше задание cron, которое выполнит индексацию, подождал, пока задание cron завершится, а затем снял блокировку. Это вызвало проблему, из-за которой наши электронные письма с подтверждением заказа не отправлялись, поскольку блокировка зависла и были затронуты несколько бизнес-процессов, поскольку блокировка еще не была готова. Мы смогли решить эту проблему, временно введя новое определение динамического процесса без нового действия и установив его на уровне магазина.
Теперь мой вопрос: что мы можем сделать, чтобы улучшить наш процесс? ? Могу ли я по-прежнему использовать новый класс действий и просто изменить свою логику или пересмотреть весь процесс индексации обновлений? Надеюсь, вы поможете мне определить, что я делаю неправильно.
orderProcess.xml
All went wrong.
Order process finished.
ОбновитьSolrAction.java
@Override
public Transition executeAction(OrderProcessModel orderProcessModel) throws Exception {
if (Objects.nonNull(orderProcessModel.getOrder())) {
final OrderModel order = orderProcessModel.getOrder();
BaseStoreModel storeModel = order.getStore();
ReentrantLock lock = getStoreLock(storeModel.getUid());
lock.lock(); // Acquire the store-specific lock
try {
Optional updateCronJob = //Find cronjob based on cronjob code
// Perform the indexing operation within a lock to ensure sequential execution
if (updateCronJob.isPresent()) {
cronJobService.performCronJob(updateCronJob.get());
waitForCronJobCompletion(updateCronJob.get());
}
} finally {
lock.unlock(); // Release the lock
}
}
return Transition.OK;
}
private void waitForCronJobCompletion(SolrIndexerCronJobModel cronJob) throws InterruptedException {
while (!cronJobService.isFinished(cronJob)) {
Thread.sleep(10000); // Sleep for 10 seconds before checking again
}
}
private ReentrantLock getStoreLock(String storeUid) {
return storeLocks.computeIfAbsent(storeUid, k -> new ReentrantLock());
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... r-ordering