platform-imdg-api-hazelcast-impl рефакторинг ожидания дожидания http://git.mfd.msk/mfd/clearing/-/issues/29 и в backend-api дожидание готовности перед работой RequestInfoAccepter

This commit is contained in:
AKurakin 2023-09-21 13:17:30 +03:00
parent 8c7c88c84f
commit 565eb70988
2 changed files with 27 additions and 18 deletions

View file

@ -28,9 +28,11 @@ public class BackEndApiImdgConfig {
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
BackendApiSettings clientSetting BackendApiSettings clientSetting
) { ) {
return new HazelcastService(taskExecutorHazelcastClientInitializer, ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter, taskExecutorIdGeneratorAwaiter,
clientSetting.getHazelcast()); clientSetting.getHazelcast());
// todo корректное ожидание готовности imdg.waitAvailable();
return imdg;
} }

View file

@ -43,6 +43,9 @@ public abstract class HazelcastServiceBase
protected volatile boolean isAvailableNow; protected volatile boolean isAvailableNow;
private Environment environment; private Environment environment;
protected Object lockAvailable;
protected AtomicBoolean hzAvailable;
public HazelcastServiceBase( public HazelcastServiceBase(
ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
@ -239,28 +242,32 @@ public abstract class HazelcastServiceBase
return imdg; return imdg;
} }
@Override @Override
public void waitAvailable() { public synchronized void waitAvailable() {
Object lock = new Object(); if (lockAvailable == null) {
AtomicBoolean hzAvailable = new AtomicBoolean(); this.lockAvailable = new Object();
statusSubscribe(new IHazelcastClusterStatus() { this.hzAvailable = new AtomicBoolean();
@Override statusSubscribe(new IHazelcastClusterStatus() {
public void getAvailable(HazelcastInstance hazelcastNotInited) { @Override
synchronized (lock) { public void getAvailable(HazelcastInstance hazelcastNotInited) {
hzAvailable.set(true); synchronized (lockAvailable) {
lock.notifyAll(); hzAvailable.set(true);
lockAvailable.notifyAll();
}
} }
}
@Override @Override
public void getUnavailable(HazelcastInstance hazelcastNotInited) { public void getUnavailable(HazelcastInstance hazelcastNotInited) {
} }
}); });
synchronized (lock) { }
log.debug("Wait IMDG available");
synchronized (lockAvailable) {
try { try {
if (!hzAvailable.get()) { if (!hzAvailable.get()) {
lock.wait(); lockAvailable.wait();
} }
log.debug("IMDG ready");
} catch (InterruptedException e) { } catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
log.error(ExceptionUtils.getStackTrace(e)); log.error(ExceptionUtils.getStackTrace(e));