залочил мапу при создании пользователя

This commit is contained in:
ialbert 2022-09-08 17:03:26 +03:00
parent 602c194db7
commit 2b8ee91f76
4 changed files with 82 additions and 22 deletions

View file

@ -1,17 +1,21 @@
package ru.spcex.clearing.backendapi.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.user.ClearingUser;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.log.ExceptionUtils;
import java.time.Instant;
import java.util.Map;
@Service
public class UserAutoCreateService {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<ClearingUser> userMap;
@ -22,15 +26,20 @@ public class UserAutoCreateService {
/**
* при необходимости переделать на отдельный поток
* todo transactional?
*/
public void createUserIfNeeded(String userName) {
ClearingUser username = userMap.getSingleObjectByFieldValues(Map.of("username", userName));
if (username == null) {
username = new ClearingUser();
username.setUsername(userName);
username.setCreated(Instant.now());
userMap.insert(username);
}
userMap.lockAndPerform(() -> {
try {
ClearingUser username = userMap.getSingleObjectByFieldValues(Map.of("username", userName));
if (username == null) {
username = new ClearingUser();
username.setUsername(userName);
username.setCreated(Instant.now());
userMap.insert(username);
}
} catch (Throwable e) {
log.error(ExceptionUtils.getStackTrace(e));
}
});
}
}

View file

@ -1,33 +1,27 @@
package ru.spcex.platform.imdg.iml.hazelcast.adapter;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ILock;
import com.hazelcast.core.IMap;
import com.hazelcast.core.IdGenerator;
import com.hazelcast.query.Predicate;
import com.hazelcast.query.Predicates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.utils.log.ExceptionUtils;
import java.util.*;
public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
private final Logger log = LoggerFactory.getLogger(getClass());
private IdGenerator idGenerator;
private IMap<Long, T> map;
public IMap<Long, T> getMap() {
return map;
}
private String mapName;
public void setMap(IMap<Long, T> map) {
this.map = map;
}
public IdGenerator getIdGenerator() {
return idGenerator;
}
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
private HazelcastInstance hzInstance;
@Override
public void insert(T paramT) {
@ -35,6 +29,25 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
map.put(paramT.getId(), paramT);
}
@Override
public void lockAndPerform(Runnable operation) {
ILock hzLock = null;
try {
//в качестве альтернативы getCPSubsystem, поддерживается только при 3+ нодах хазелкаста
hzLock = hzInstance.getLock(mapName);
hzLock.lock();
operation.run();
} finally {
if (hzLock != null) {
try {
hzLock.unlock();
} catch (Throwable e) {
log.error("{} {}", mapName, ExceptionUtils.getStackTrace(e));
}
}
}
}
@Override
public void update(T paramT) {
map.put(paramT.getId(), paramT);
@ -97,4 +110,36 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
}
return searchResult;
}
public IMap<Long, T> getMap() {
return map;
}
public void setMap(IMap<Long, T> map) {
this.map = map;
}
public IdGenerator getIdGenerator() {
return idGenerator;
}
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public HazelcastInstance getHzInstance() {
return hzInstance;
}
public void setHzInstance(HazelcastInstance hzInstance) {
this.hzInstance = hzInstance;
}
public String getMapName() {
return mapName;
}
public void setMapName(String mapName) {
this.mapName = mapName;
}
}

View file

@ -223,6 +223,8 @@ public abstract class HazelcastServiceBase
public void getAvailable(HazelcastInstance hazelcastNotInited) {
IdGenerator generator = hazelcastInstance.getIdGenerator(IMDGDistributedNames.MAP_SEQUENCE_NAME);
imdg.setMap(hazelcastInstance.getMap(key));
imdg.setMapName(key);
imdg.setHzInstance(hazelcastInstance);
imdg.setIdGenerator(generator);
}

View file

@ -10,6 +10,10 @@ public interface Imdg<T extends SpcexObjectBase> {
throw new UnsupportedOperationException("not implemented insert");
}
default void lockAndPerform(Runnable operation) {
throw new UnsupportedOperationException("not implemented lockAndPerform");
}
default void update(T paramT) {
throw new UnsupportedOperationException("not implemented update");
}