X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FFcpReplySequence.java;h=106bd8abceec60bd1054615215f0f9449247a930;hb=dbd390e996a8b0d94d5e57906b996a95f4a22f4e;hp=25db84713e8689caa87fa28e38fa329672cf5447;hpb=28e284e354ca3825675010f36c2b16b11c5f70ef;p=jFCPlib.git diff --git a/src/main/java/net/pterodactylus/fcp/quelaton/FcpReplySequence.java b/src/main/java/net/pterodactylus/fcp/quelaton/FcpReplySequence.java index 25db847..106bd8a 100644 --- a/src/main/java/net/pterodactylus/fcp/quelaton/FcpReplySequence.java +++ b/src/main/java/net/pterodactylus/fcp/quelaton/FcpReplySequence.java @@ -1,8 +1,9 @@ package net.pterodactylus.fcp.quelaton; import java.io.IOException; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; import java.util.function.Consumer; import net.pterodactylus.fcp.AllData; @@ -46,6 +47,10 @@ import net.pterodactylus.fcp.URIGenerated; import net.pterodactylus.fcp.UnknownNodeIdentifier; import net.pterodactylus.fcp.UnknownPeerNoteType; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + /** * An FCP reply sequence enables you to conveniently wait for a specific set of FCP replies. * @@ -54,27 +59,30 @@ import net.pterodactylus.fcp.UnknownPeerNoteType; public abstract class FcpReplySequence implements AutoCloseable, FcpListener { private final Object syncObject = new Object(); - private final ExecutorService executorService; + private final ListeningExecutorService executorService; private final FcpConnection fcpConnection; + private final Queue messages = new ConcurrentLinkedQueue<>(); public FcpReplySequence(ExecutorService executorService, FcpConnection fcpConnection) { - this.executorService = executorService; + this.executorService = MoreExecutors.listeningDecorator(executorService); this.fcpConnection = fcpConnection; } protected abstract boolean isFinished(); - public Future send(FcpMessage fcpMessage) throws IOException { - try { + public ListenableFuture send(FcpMessage fcpMessage) throws IOException { fcpConnection.addFcpListener(this); - - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - fcpConnection.sendMessage(fcpMessage); + messages.add(fcpMessage); return executorService.submit(() -> { synchronized (syncObject) { - while (!isFinished()) { + while (!isFinished() || !messages.isEmpty()) { + while (messages.peek() != null) { + FcpMessage message = messages.poll(); + fcpConnection.sendMessage(message); + } + if (isFinished()) { + continue; + } syncObject.wait(); } } @@ -82,6 +90,17 @@ public abstract class FcpReplySequence implements AutoCloseable, FcpListener }); } + protected void sendMessage(FcpMessage fcpMessage) { + messages.add(fcpMessage); + notifySyncObject(); + } + + private void notifySyncObject() { + synchronized (syncObject) { + syncObject.notifyAll(); + } + } + protected R getResult() { return null; } @@ -93,23 +112,17 @@ public abstract class FcpReplySequence implements AutoCloseable, FcpListener private void consume(Consumer consumer, M message) { consumer.accept(message); - synchronized (syncObject) { - syncObject.notifyAll(); - } + notifySyncObject(); } private void consumeUnknown(FcpMessage fcpMessage) { consumeUnknownMessage(fcpMessage); - synchronized (syncObject) { - syncObject.notifyAll(); - } + notifySyncObject(); } private void consumeClose(Throwable throwable) { consumeConnectionClosed(throwable); - synchronized (syncObject) { - syncObject.notifyAll(); - } + notifySyncObject(); } @Override