private volatile boolean started = false;
private DefaultFuture startFuture, closeFuture;
protected Future send(final Object obj, Packet packet, final int priority) {
if (packet == null || packet.getContent() == null || !isStarted())
return new DefaultFuture(this, false);
final DefaultFuture future = new DefaultFuture(this);
getSessionFilterChain(new SessionFilterAdapter() {
public void packetSend(SessionFilterChain filterChain, Packet packet)
throws Exception {
if (packet == null || packet.getContent() == null) {
future.setSucceeded(false);
return;
}
Packet futurePacket = new FuturePacket(obj, packet, priority,
future);
boolean firstSend = false;
boolean sendFailed = false;
synchronized (sendQueue) {
firstSend = currentSendPacket == null
&& sendQueue.isEmpty();
// current session may be closed
if (!isStarted() || !sendQueue.offer(futurePacket))
sendFailed = true;
}
if (sendFailed)
future.setSucceeded(false);
else if (firstSend)
reactor.interest(handler, Reactor.OP_WRITE);
}
}, true).packetSend(packet);