залочил мапу при создании пользователя
This commit is contained in:
parent
602c194db7
commit
2b8ee91f76
4 changed files with 82 additions and 22 deletions
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue