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 {
|
||||
|
||||
private final RoomRepository roomRepository;
|
||||
private final PickerRepository pickerRepository;
|
||||
private final Map<String, Node> nodeMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
@ -26,6 +27,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
||||
}
|
||||
|
||||
nodeMap.put(node.id(), node);
|
||||
pickerRepository.create(node.id(), node.mode());
|
||||
}
|
||||
|
||||
roomRepository.onCreateNode(node);
|
||||
@ -35,6 +37,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
||||
public void delete(Node node) {
|
||||
synchronized (nodeMap) {
|
||||
nodeMap.remove(node.id());
|
||||
pickerRepository.remove(node.id());
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final PickerRepository pickerRepository;
|
||||
private final Map<Node, Rooms> node2roomsMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
@ -37,6 +38,7 @@ public class RoomRepositoryImpl implements RoomRepository {
|
||||
throw new IllegalArgumentException("Room already exists");
|
||||
}
|
||||
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());
|
||||
pickerRepository.find(room.getNodeId()).remove(room);
|
||||
}
|
||||
|
||||
userRepository.onRemoveRoom(room);
|
||||
@ -91,10 +94,14 @@ public class RoomRepositoryImpl implements RoomRepository {
|
||||
throw new IllegalArgumentException("Node '" + node.id() + "' does not exist");
|
||||
}
|
||||
|
||||
var requiredSlots = users.size();
|
||||
var container = node2roomsMap.get(node).values().stream() // TODO: pick room with used node balancing mode
|
||||
.filter(r -> r.isAvailable(requiredSlots))
|
||||
.findFirst();
|
||||
Room room = null;
|
||||
try {
|
||||
room = pickerRepository.pick(node.id(), users);
|
||||
} 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()) {
|
||||
var cont = container.get();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user