Skip to main content
Version: 1.0.1

Working With Events

Ignite, cluster’da meydana gelen çeşitli işlemler için eventler oluşturabilir ve uygulamanızı bu işlemler hakkında bilgilendirebilir. Cache eventleri, node discovery eventleri, distributed task execution eventleri ve çok daha fazlası dahil olmak üzere pek çok event türü vardır.

Enabling Events

Varsayılan olarak eventler devre dışıdır ve uygulamanızda kullanmak istiyorsanız her bir event tipini doğrudan etkinleştirmeniz gerekir. Belirli event türlerini etkinleştirmek için, bunları aşağıda gösterildiği gibi IgniteConfiguration'ın includeEventTypes property’sinde belirtin:

var cfg = new IgniteConfiguration
{
IncludedEventTypes = new[]
{
EventType.CacheObjectPut,
EventType.CacheObjectRead,
EventType.CacheObjectRemoved,
EventType.NodeJoined,
EventType.NodeLeft
}
};
var ignite = Ignition.Start(cfg);

Getting the Events Interface

Event işlevselliği, cluster eventlerini dinlemek için methodlar sağlayan event interface’i aracılığıyla kullanılabilir. Event interface’i, bir Ignite instance’ından aşağıdaki gibi elde edilebilir:

var ignite = Ignition.GetIgnite();
var events = ignite.GetEvents();

Event interface’i bir dizi node ile ilişkilendirilebilir. Bu, belirli bir node kümesinde meydana gelen eventlere erişebileceğiniz anlamına gelir. Aşağıdaki örnekte, Person cache’i için verileri barındıran node kümesi için event interface’i elde edilir.

var ignite = Ignition.GetIgnite();
var events = ignite.GetCluster().ForCacheNodes("person").GetEvents();

Listening to Events

Local veya remote eventleri dinleyebilirsiniz. Local eventler, listener’ın kayıtlı olduğu node’da oluşturulan eventlerdir. Remote eventler, diğer nodelarda meydana gelen eventlerdir.

Gerçek hayatta olay 1 kere bile gerçekleşse, bazı eventler birden fazla node’da tetiklenebilir. Örneğin, bir node kümeden ayrıldığında, kalan her nodeda EVT_NODE_LEFT olayı oluşturulur.

Başka bir örnek, bir cache’e bir nesne koyduğunuz zamandır. Bu durumda, put(…) methodunun çağrıldığı node’dan farklı olabilecek, nesnenin gerçekten yazıldığı birincil partititon’u barındıran düğümde EVT_CACHE_OBJECT_PUT eventi gerçekleşir. Ek olarak, event, yapılandırılmışsa cache için yedekleme partitionlarını tutan tüm node’larda tetiklenir.

Event interface’i, yalnızca local eventleri ve hem local hem de remote eventleri dinlemek için methodlar sağlar.

Listening to Local Events

Local eventleri dinlemek için aşağıda gösterildiği gibi localListen(listener, eventTypes…) methodunu kullanın. Method, local node’da verilen türde bir event her meydana geldiğinde çağrılan bir event listener kabul eder. Local listener’ın kaydını silmek için Invoke methodunda false döndürün.

class LocalListener : IEventListener<CacheEvent>
{
public bool Invoke(CacheEvent evt)
{
Console.WriteLine("Received event [evt=" + evt.Name + ", key=" + evt.Key + ", oldVal=" + evt.OldValue
+ ", newVal=" + evt.NewValue);
return true;
}
}

public static void LocalListenDemo()
{
var cfg = new IgniteConfiguration
{
IncludedEventTypes = new[]
{
EventType.CacheObjectPut,
EventType.CacheObjectRead,
EventType.CacheObjectRemoved,
}
};
var ignite = Ignition.Start(cfg);
var events = ignite.GetEvents();
events.LocalListen(new LocalListener(), EventType.CacheObjectPut, EventType.CacheObjectRead,
EventType.CacheObjectRemoved);

var cache = ignite.GetOrCreateCache<int, int>("myCache");
cache.Put(1, 1);
cache.Put(2, 2);
}

Listening to Remote Events

IgniteEvents.remoteListen(localListener, filter, types) methodu, hem remote hem de local eventleri dinleyen bir listener’ı kaydetmek için kullanılabilir. Local bir listener’ı, bir filtreyi ve dinlemek istediğiniz event türleri listesini kabul eder.

Filtre, local node’da dahil olmak üzere event interface’i ile ilişkili tüm node’lara dağıtılır. Filtreyi geçen eventler local listener’a gönderilir.

Methoda, listener’ın ve filtrelerin kaydını silmek için kullanılabilecek benzersiz bir tanımlayıcı döndürür. Bunu yapmak için IgniteEvents.stopRemoteListen(uuid) methodunu çağırın. Listener’ın kaydını silmenin başka bir yolu da Apply() yönteminde false döndürmektir.

IgniteEvents events = ignite.events();

IgnitePredicate<CacheEvent> filter = evt -> {
System.out.println("remote event: " + evt.name());
return true;
};

// Subscribe to the cache events on all nodes where the cache is hosted.
UUID uuid = events.remoteListen(new IgniteBiPredicate<UUID, CacheEvent>() {

@Override
public boolean apply(UUID uuid, CacheEvent e) {

// process the event

return true; //continue listening
}
}, filter, EventType.EVT_CACHE_OBJECT_PUT);

Batching Events

Bir cacheteki her etkinlik, bir event bildiriminin oluşturulmasına ve gönderilmesine neden olabilir. Yüksek cache etkinliğine sahip sistemler için, her event için bildirim almak ağ açısından yoğun olabilir ve muhtemelen cache işlemlerinin performansının düşmesine neden olabilir.

Etkinlik bildirimleri birlikte gruplandırılabilir ve performans üzerindeki etkiyi azaltmak için toplu olarak veya belirli aralıklarla gönderilebilir. İşte bunun nasıl yapılabileceğine dair bir örnek:

Ignite ignite = Ignition.ignite();

// Get an instance of the cache.
final IgniteCache<Integer, String> cache = ignite.cache("cacheName");

// Sample remote filter which only accepts events for the keys
// that are greater than or equal to 10.
IgnitePredicate<CacheEvent> rmtLsnr = new IgnitePredicate<CacheEvent>() {
@Override
public boolean apply(CacheEvent evt) {
System.out.println("Cache event: " + evt);

int key = evt.key();

return key >= 10;
}
};

// Subscribe to the cache events that are triggered on all nodes
// that host the cache.
// Send notifications in batches of 10.
ignite.events(ignite.cluster().forCacheNodes("cacheName")).remoteListen(10 /* batch size */,
0 /* time intervals */, false, null, rmtLsnr, EventType.EVTS_CACHE);

// Generate cache events.
for (int i = 0; i < 20; i++)
cache.put(i, Integer.toString(i));

Storing and Querying Events

Eventleri meydana geldikleri node’larda tutacak bir event deposu yapılandırabilirsiniz. Daha sonra uygulamanızdaki eventleri sorgulayabilirsiniz.

Event deposu, eventleri belirli bir süre boyunca tutacak, yalnızca en son eventleri tutacak veya belirli bir filtreyi karşılayan eventleri tutacak şekilde yapılandırılabilir. Ayrıntılar için [MemoryEventStorageSpi](https://ignite.apache.org/releases/2.14.0/javadoc/org/apache/ignite/spi/eventstorage/memory/MemoryEventStorageSpi.html) javadoc'a bakın.

Aşağıda bir event depolama yapılandırması örneği verilmiştir:

var cfg = new IgniteConfiguration
{
EventStorageSpi = new MemoryEventStorageSpi()
{
ExpirationTimeout = TimeSpan.FromMilliseconds(600000)
},
IncludedEventTypes = new[]
{
EventType.CacheObjectPut,
EventType.CacheObjectRead,
EventType.CacheObjectRemoved,
}
};
var ignite = Ignition.Start(cfg);

Querying Local Events

Aşağıdaki örnek, event deposunda saklanan local EVT_CACHE_OBJECT_PUT eventlerini nasıl sorgulayabileceğinizi gösterir.

var events = ignite.GetEvents();
var cacheEvents = events.LocalQuery(EventType.CacheObjectPut);

Querying Remote Events

Aşağıdaki örnek, remote event deposunda saklanan EVT_CACHE_OBJECT_PUT eventlerini nasıl sorgulayabileceğinizi gösterir.