Allows all messages to the browser to be sent without waiting for a response.
This prevents any one message from holding up the browser from receiving additional insructions.
This commit is contained in:
@@ -43,6 +43,10 @@ public class BrowserLink implements Runnable
|
|||||||
* This queue serves as a cache for objects we need to send.
|
* This queue serves as a cache for objects we need to send.
|
||||||
*/
|
*/
|
||||||
private final LinkedList<MessagePacket> sendQueue = new LinkedList<>();
|
private final LinkedList<MessagePacket> sendQueue = new LinkedList<>();
|
||||||
|
/**
|
||||||
|
* This queue serves as a cache for objects that are waiting for a response.
|
||||||
|
*/
|
||||||
|
private final LinkedList<MessagePacket> sentQueue = new LinkedList<>();
|
||||||
|
|
||||||
private boolean running;
|
private boolean running;
|
||||||
|
|
||||||
@@ -69,24 +73,14 @@ public class BrowserLink implements Runnable
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
logger.debug("Writing message {} {}", packet.message[0], packet.message[1]);
|
||||||
this.browserOut.write(packet.message[0]);
|
this.browserOut.write(packet.message[0]);
|
||||||
this.browserOut.write(packet.message[1]);
|
this.browserOut.write(packet.message[1]);
|
||||||
this.browserOut.flush();
|
this.browserOut.flush();
|
||||||
|
|
||||||
/*
|
synchronized (this.sentQueue)
|
||||||
* Wait for a response from the browser.
|
|
||||||
*/
|
|
||||||
byte[][] returnMessage = this.readMessage();
|
|
||||||
packet.returnMessage = returnMessage;
|
|
||||||
if (returnMessage == null)
|
|
||||||
{
|
{
|
||||||
logger.info("Browser connection closed.");
|
this.sentQueue.add(packet);
|
||||||
this.running = false;
|
|
||||||
}
|
|
||||||
synchronized (this.readLock)
|
|
||||||
{
|
|
||||||
logger.trace("Received message, notifying futures.");
|
|
||||||
this.readLock.notifyAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
@@ -94,6 +88,55 @@ public class BrowserLink implements Runnable
|
|||||||
logger.error("Could not send message " + new String(packet.message[1], StandardCharsets.UTF_8), e);
|
logger.error("Could not send message " + new String(packet.message[1], StandardCharsets.UTF_8), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
packet = null;
|
||||||
|
synchronized (this.sentQueue)
|
||||||
|
{
|
||||||
|
if (this.sentQueue.size() > 0)
|
||||||
|
{
|
||||||
|
packet = this.sentQueue.poll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (packet != null)
|
||||||
|
{
|
||||||
|
if (this.browserIn.available() > 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Wait for a response from the browser.
|
||||||
|
*/
|
||||||
|
byte[][] returnMessage = this.readMessage();
|
||||||
|
if (returnMessage == null)
|
||||||
|
{
|
||||||
|
logger.info("Browser connection closed.");
|
||||||
|
this.running = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.debug("Reading message {} {}", returnMessage[0], returnMessage[1]);
|
||||||
|
packet.returnMessage = returnMessage;
|
||||||
|
synchronized (this.readLock)
|
||||||
|
{
|
||||||
|
logger.trace("Received message, notifying futures.");
|
||||||
|
this.readLock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
synchronized (this.sentQueue)
|
||||||
|
{
|
||||||
|
this.sentQueue.addFirst(packet);
|
||||||
|
}
|
||||||
|
logger.trace("There are no new messages");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
logger.error("Could not retrieve message", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -200,7 +243,6 @@ public class BrowserLink implements Runnable
|
|||||||
*/
|
*/
|
||||||
header.order(ByteOrder.nativeOrder());
|
header.order(ByteOrder.nativeOrder());
|
||||||
header.putInt(messageData.length);
|
header.putInt(messageData.length);
|
||||||
logger.debug("Writing message {} {}", header.array(), messageJson);
|
|
||||||
|
|
||||||
packetEntry = new MessagePacket(new byte[][] {header.array(), messageData});
|
packetEntry = new MessagePacket(new byte[][] {header.array(), messageData});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user