залочил мапу при создании пользователя
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;
|
package ru.spcex.clearing.backendapi.service;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.user.ClearingUser;
|
import ru.clearing.classes.statics.data.user.ClearingUser;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class UserAutoCreateService {
|
public class UserAutoCreateService {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private final Imdg<ClearingUser> userMap;
|
private final Imdg<ClearingUser> userMap;
|
||||||
|
|
||||||
|
|
@ -22,15 +26,20 @@ public class UserAutoCreateService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* при необходимости переделать на отдельный поток
|
* при необходимости переделать на отдельный поток
|
||||||
* todo transactional?
|
|
||||||
*/
|
*/
|
||||||
public void createUserIfNeeded(String userName) {
|
public void createUserIfNeeded(String userName) {
|
||||||
ClearingUser username = userMap.getSingleObjectByFieldValues(Map.of("username", userName));
|
userMap.lockAndPerform(() -> {
|
||||||
if (username == null) {
|
try {
|
||||||
username = new ClearingUser();
|
ClearingUser username = userMap.getSingleObjectByFieldValues(Map.of("username", userName));
|
||||||
username.setUsername(userName);
|
if (username == null) {
|
||||||
username.setCreated(Instant.now());
|
username = new ClearingUser();
|
||||||
userMap.insert(username);
|
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;
|
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.IMap;
|
||||||
import com.hazelcast.core.IdGenerator;
|
import com.hazelcast.core.IdGenerator;
|
||||||
import com.hazelcast.query.Predicate;
|
import com.hazelcast.query.Predicate;
|
||||||
import com.hazelcast.query.Predicates;
|
import com.hazelcast.query.Predicates;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private IdGenerator idGenerator;
|
private IdGenerator idGenerator;
|
||||||
|
|
||||||
private IMap<Long, T> map;
|
private IMap<Long, T> map;
|
||||||
|
|
||||||
public IMap<Long, T> getMap() {
|
private String mapName;
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMap(IMap<Long, T> map) {
|
private HazelcastInstance hzInstance;
|
||||||
this.map = map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IdGenerator getIdGenerator() {
|
|
||||||
return idGenerator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIdGenerator(IdGenerator idGenerator) {
|
|
||||||
this.idGenerator = idGenerator;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insert(T paramT) {
|
public void insert(T paramT) {
|
||||||
|
|
@ -35,6 +29,25 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
||||||
map.put(paramT.getId(), paramT);
|
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
|
@Override
|
||||||
public void update(T paramT) {
|
public void update(T paramT) {
|
||||||
map.put(paramT.getId(), paramT);
|
map.put(paramT.getId(), paramT);
|
||||||
|
|
@ -97,4 +110,36 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
||||||
}
|
}
|
||||||
return searchResult;
|
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) {
|
public void getAvailable(HazelcastInstance hazelcastNotInited) {
|
||||||
IdGenerator generator = hazelcastInstance.getIdGenerator(IMDGDistributedNames.MAP_SEQUENCE_NAME);
|
IdGenerator generator = hazelcastInstance.getIdGenerator(IMDGDistributedNames.MAP_SEQUENCE_NAME);
|
||||||
imdg.setMap(hazelcastInstance.getMap(key));
|
imdg.setMap(hazelcastInstance.getMap(key));
|
||||||
|
imdg.setMapName(key);
|
||||||
|
imdg.setHzInstance(hazelcastInstance);
|
||||||
imdg.setIdGenerator(generator);
|
imdg.setIdGenerator(generator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,10 @@ public interface Imdg<T extends SpcexObjectBase> {
|
||||||
throw new UnsupportedOperationException("not implemented insert");
|
throw new UnsupportedOperationException("not implemented insert");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default void lockAndPerform(Runnable operation) {
|
||||||
|
throw new UnsupportedOperationException("not implemented lockAndPerform");
|
||||||
|
}
|
||||||
|
|
||||||
default void update(T paramT) {
|
default void update(T paramT) {
|
||||||
throw new UnsupportedOperationException("not implemented update");
|
throw new UnsupportedOperationException("not implemented update");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue