Мое приложение запускает пару клиентов, которые общаются со steam. Есть два типа задач, которые я могу задать клиентам. Например, когда меня не интересует блокировка, спрашивай клиента о своих друзьях. Но во-вторых, есть задачи, которые я могу отправить только одному клиенту, и мне нужно подождать, когда он завершит его асинхронно. Поэтому я не уверен, есть ли уже какой-то шаблон проектирования, но вы можете увидеть, что я уже пробовал. Когда я запрашиваю второе задание, я удаляю его из очереди и возвращаю сюда после выполнения этого задания. Но я не знаю, является ли это хорошим решением, потому что я могу «потерять» некоторых клиентов, когда я делаю что-то не так
@Component
public class SteamClientWrapper {
private Queue<DotaClientImpl> clients = new LinkedList<>();
private final Object clientLock = new Object();
public SteamClientWrapper() {
}
@PostConstruct
public void init() {
// starting clients here clients.add();
}
public DotaClientImpl getClient() {
return getClient(false);
}
public DotaClientImpl getClient(boolean freeLast) {
synchronized (clients) {
if (!clients.isEmpty()) {
return freeLast ? clients.poll() : clients.peek();
}
}
return null;
}
public void postClient(DotaClientImpl client) {
if (client == null) {
return;
}
synchronized (clientLock) {
clients.offer(client);
clientLock.notify();
}
}
public void doSomethingBlocking() {
DotaClientImpl client = getClient(true);
client.doSomething();
}
}