Tried to enable picking method
This commit is contained in:
parent
0834ae8030
commit
70f02c3841
@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
public class NodeRepositoryImpl implements NodeRepository {
|
public class NodeRepositoryImpl implements NodeRepository {
|
||||||
|
|
||||||
private final RoomRepository roomRepository;
|
private final RoomRepository roomRepository;
|
||||||
|
private final PickerRepository pickerRepository;
|
||||||
private final Map<String, Node> nodeMap = new ConcurrentHashMap<>();
|
private final Map<String, Node> nodeMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -26,6 +27,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nodeMap.put(node.id(), node);
|
nodeMap.put(node.id(), node);
|
||||||
|
pickerRepository.create(node.id(), node.mode());
|
||||||
}
|
}
|
||||||
|
|
||||||
roomRepository.onCreateNode(node);
|
roomRepository.onCreateNode(node);
|
||||||
@ -35,6 +37,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
|||||||
public void delete(Node node) {
|
public void delete(Node node) {
|
||||||
synchronized (nodeMap) {
|
synchronized (nodeMap) {
|
||||||
nodeMap.remove(node.id());
|
nodeMap.remove(node.id());
|
||||||
|
pickerRepository.remove(node.id());
|
||||||
}
|
}
|
||||||
|
|
||||||
roomRepository.onRemoveNode(node);
|
roomRepository.onRemoveNode(node);
|
||||||
|
|||||||
@ -0,0 +1,59 @@
|
|||||||
|
package ru.dragonestia.picker.repository.impl;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.dragonestia.picker.model.Room;
|
||||||
|
import ru.dragonestia.picker.model.User;
|
||||||
|
import ru.dragonestia.picker.model.type.PickingMode;
|
||||||
|
import ru.dragonestia.picker.repository.UserRepository;
|
||||||
|
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
|
||||||
|
import ru.dragonestia.picker.repository.impl.picker.Picker;
|
||||||
|
import ru.dragonestia.picker.repository.impl.picker.RoundRobinPicker;
|
||||||
|
import ru.dragonestia.picker.repository.impl.picker.SequentialFillingPicker;
|
||||||
|
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class PickerRepository {
|
||||||
|
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final Map<String, Picker<Room, User>> pickers = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public void create(String nodeId, PickingMode mode) {
|
||||||
|
pickers.put(nodeId, of(mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(String nodeId) {
|
||||||
|
pickers.remove(nodeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Picker<Room, User> find(String nodeId) {
|
||||||
|
return pickers.get(nodeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Room pick(String nodeId, Collection<User> users) {
|
||||||
|
return pickers.get(nodeId).pick(users);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Picker<Room, User> of(PickingMode mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case SEQUENTIAL_FILLING -> {
|
||||||
|
return new SequentialFillingPicker(userRepository);
|
||||||
|
}
|
||||||
|
|
||||||
|
case ROUND_ROBIN -> {
|
||||||
|
return new RoundRobinPicker(userRepository);
|
||||||
|
}
|
||||||
|
|
||||||
|
case LEAST_PICKED -> {
|
||||||
|
return new LeastPickedPicker(userRepository);
|
||||||
|
}
|
||||||
|
|
||||||
|
default -> throw new InvalidParameterException("Taken: " + mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
public class RoomRepositoryImpl implements RoomRepository {
|
public class RoomRepositoryImpl implements RoomRepository {
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
|
private final PickerRepository pickerRepository;
|
||||||
private final Map<Node, Rooms> node2roomsMap = new ConcurrentHashMap<>();
|
private final Map<Node, Rooms> node2roomsMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -37,6 +38,7 @@ public class RoomRepositoryImpl implements RoomRepository {
|
|||||||
throw new IllegalArgumentException("Room already exists");
|
throw new IllegalArgumentException("Room already exists");
|
||||||
}
|
}
|
||||||
rooms.put(room.getId(), new RoomContainer(room, new AtomicInteger(0)));
|
rooms.put(room.getId(), new RoomContainer(room, new AtomicInteger(0)));
|
||||||
|
pickerRepository.find(room.getNodeId()).add(room);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +55,7 @@ public class RoomRepositoryImpl implements RoomRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
node2roomsMap.get(node.get()).remove(room.getId());
|
node2roomsMap.get(node.get()).remove(room.getId());
|
||||||
|
pickerRepository.find(room.getNodeId()).remove(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
userRepository.onRemoveRoom(room);
|
userRepository.onRemoveRoom(room);
|
||||||
@ -91,10 +94,14 @@ public class RoomRepositoryImpl implements RoomRepository {
|
|||||||
throw new IllegalArgumentException("Node '" + node.id() + "' does not exist");
|
throw new IllegalArgumentException("Node '" + node.id() + "' does not exist");
|
||||||
}
|
}
|
||||||
|
|
||||||
var requiredSlots = users.size();
|
Room room = null;
|
||||||
var container = node2roomsMap.get(node).values().stream() // TODO: pick room with used node balancing mode
|
try {
|
||||||
.filter(r -> r.isAvailable(requiredSlots))
|
room = pickerRepository.pick(node.id(), users);
|
||||||
.findFirst();
|
} catch (RuntimeException ignore) {} // TODO: may be problem. Check it later
|
||||||
|
|
||||||
|
Optional<RoomContainer> container = room == null?
|
||||||
|
Optional.empty() :
|
||||||
|
Optional.of(node2roomsMap.get(node).get(room.getId()));
|
||||||
|
|
||||||
if (container.isPresent()) {
|
if (container.isPresent()) {
|
||||||
var cont = container.get();
|
var cont = container.get();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user