Fixed incorrect event order on channel closure when OrderedMemoryAwareThreadPoolExecutor is in a pipeline.
This commit is contained in:
parent
b0f39dc687
commit
66b1960979
@ -31,6 +31,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
import org.jboss.netty.channel.Channel;
|
import org.jboss.netty.channel.Channel;
|
||||||
import org.jboss.netty.channel.ChannelEvent;
|
import org.jboss.netty.channel.ChannelEvent;
|
||||||
|
import org.jboss.netty.channel.ChannelState;
|
||||||
|
import org.jboss.netty.channel.ChannelStateEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link MemoryAwareThreadPoolExecutor} which maintains the
|
* A {@link MemoryAwareThreadPoolExecutor} which maintains the
|
||||||
@ -148,11 +150,12 @@ public class OrderedMemoryAwareThreadPoolExecutor extends
|
|||||||
doUnorderedExecute(task);
|
doUnorderedExecute(task);
|
||||||
} else {
|
} else {
|
||||||
ChannelEventRunnable r = (ChannelEventRunnable) task;
|
ChannelEventRunnable r = (ChannelEventRunnable) task;
|
||||||
getOrderedExecutor(r.getEvent().getChannel()).execute(task);
|
getOrderedExecutor(r.getEvent()).execute(task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Executor getOrderedExecutor(Channel channel) {
|
private Executor getOrderedExecutor(ChannelEvent e) {
|
||||||
|
Channel channel = e.getChannel();
|
||||||
Executor executor = childExecutors.get(channel);
|
Executor executor = childExecutors.get(channel);
|
||||||
if (executor == null) {
|
if (executor == null) {
|
||||||
executor = new ChildExecutor();
|
executor = new ChildExecutor();
|
||||||
@ -163,8 +166,12 @@ public class OrderedMemoryAwareThreadPoolExecutor extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the entry when the channel closes.
|
// Remove the entry when the channel closes.
|
||||||
if (!channel.isOpen()) {
|
if (e instanceof ChannelStateEvent) {
|
||||||
childExecutors.remove(channel);
|
ChannelStateEvent se = (ChannelStateEvent) e;
|
||||||
|
if (se.getState() == ChannelState.OPEN &&
|
||||||
|
!channel.isOpen()) {
|
||||||
|
childExecutors.remove(channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return executor;
|
return executor;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user