8 Kasım 2019 Cuma

Netty EventLoop Arayüzü

Giriş
Kalıtım şöyle
EventLoopGroup <- EventLoop <- NioEventLoop

EventLoop Arayüzü
newPromise metodu
Şöyle yaparız.
Promise<ReturnType> promise = channel.eventLoop().newPromise<ReturnType>();
scheduleAtFixedRate metodu
Channel kapatılınca timer da otomatik olarak kapatılır deniliyor ancak ben bu davranışı görmedim.  ScheduledFuture nesnesinin cancel(true) metodunun çağrılması gerekti. Açıklaması şöyle
As the EventExecutor is shared across different Channels it has notion of closed Channel.
Örnek
Şöyle yaparız
Channel channel = ctx.channel();
ctx.executor().scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {   
    ...
  }, 0, 60, TimeUnit.SECONDS);
Örnek
Eğer bu işi kendimiz yapmak istersek şöyle yaparız
CopyOnWriteArrayList<ScheduledFuture<?>> userTaskFutures = new CopyOnWriteArrayList<>();

public void scheduleAtFixedRate(Runnable task, long initialDelay, long period,
TimeUnit unit) { ScheduledFuture<?> future = channel.eventLoop().scheduleAtFixedRate(task, initialDelay,
period, unit); userTaskFutures.add(future); } public void disconnect() { ... if (!userTaskFutures.isEmpty()) { userTaskFutures.forEach(future -> future.cancel(true)); userTaskFutures.clear(); } }
NioEventLoop Sınıfı
Giriş
Şu satırı dahil ederiz.
import io.netty.channel.nio.NioEventLoop;
Tek thread ile çalışır.
Kalıtım
Şöyle
java.util.concurrent.AbstractExecutionService
 |
io.netty.util.concurrent.AbstractEventExecutor
 |
io.netty.util.concurrent.AbstractScheduledEventExecutor -> Kuyruk
 |
io.netty.util.concurrent.SingleThreadEventExecutor
 |
io.netty.channel.SingleThreadEventLoop -> Kuyruk
 |
io.netty.channel.nio.NioEventLoop
Kuyruklar
Bu sınıfın içinde iki tane kuyruk var. 

1. java.netty.util.concurrent.AbstractScheduledEventExecutor sınıfında 
PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue;

2. java.netty.util.concurrent.SingleThreadEventExecutor sınıfında
Queue<Runnable> taskQueue


Hiç yorum yok:

Yorum Gönder