12 Ağustos 2014 Salı

Gömülü Proje - TransmissionQueue

Giriş
TransmissionQueue gönderme amacına göre birçok farklı şekil alabilen bir bileşen. Aşağıda bazı sınıflandırmalarda bulunmaya çalıştım.

Genel Tasarım
TransmissionQueue --(has)--TransmissionList--(has)--TransmissionNode--(has)--Data

TransmissionList bir LinkedList (ortadan silinen kuyruklar için) veya Dequeue (FIFO kuyruklar için) olabilir.

Gönderim Sırasına Göre
Periyodik Kuyruklar
Bir timer XGenerator sınıfını periyodik olarak tetikler. XGenerator TransmissionQueue kuyruğunu baştan sonra dolaşır ve zamanı gelen mesajları gönderir. Bu tür kuyruklar her 2 saniyede bir X gönderilecektir türündeki işler için kullanılır.

FIFO Kuyruklar
Kuyruğun sonuna yerleşen mesaj sırası gelince XGenerator tarafından kuyruktan çekilir ve hemen gönderilir.

Verinin Kopya veya Referans Olarak Kullanım Şekline Göre
Kopya Alan Kuyruk
Bazı kuyruklar eklenen verinin kopyasını alırlar. Böylece veri güncellenirse bir önce hali ile karşılaştırıp gönderim kuralını değiştirmeleri mümkün olur.

Reference Counting Yapan Kuyruk
Bazı kuyruklar reference counting yaparlar. Böylece verinin kopyasını almaya gerek kalmaz. Kuyrukta bekleyen veri değiştirilebilir.

Verinin Serialize Edilmesi
Gönderilecek veri bir XProtocolConverter sınıfına verilerek serialize edilir.

Periyodik Kuyruk aşağıdaki gibi olabilir
XProtocolConverter protocol (channel);
transmissionQueue.Walk (protocol);


FIFO kuyruğun serialize edilmesi aşağıdaki gibi olabilir. Eğer gönderilecek veri yoksa XProtocolConverter veri olmadığını belli eden bir mesaj gönderilir.

XProtocolConverter protocol;
TransmissionItem item = transmissionQueue.PopHead ();
if (item != NULL) {
  protocol.Serialize (stream, item);
}
else {
 protocol.SerializeEmptyMsg (stream);
}
channel.Send (stream);

Örnek
Aşağıda, serialization işlemini ve gönderim kuyruğunu gösteren basit bir tasarım örneği var.
Gönderilmek İstenen Mesajın Alınması
Gönderilmek istenen DomainObject, OutgoingMessageListener tarafından alınır. TransmissionQueue nesnesine verilir. 

Gönderilme Kurallarının Hazırlanması
Bu kuyruk, DomainObject nesnesinin nasıl parçalanması, kaç defa gönderilmesi gerektiğine karar veren bir Scheduler nesnesine verilir. Bu bilgiler TransmissionItem nesnesinde saklanır. 

Gönderme Zamanı
Kuyruğu periyodik olarak dolaş bir thread, gönderme zamanı gelen TransmissionItem nesnesini alır ve serialization işleminden geçirerek, kanaldan gönderir.

Veriyi TranmissionItem nesnesinin içine koyarak veriyi zarflama veya çalışılan platforma göre Big Endian, Little Endian göndermek gibi imkanlara da kavuşabiliriz.








Hiç yorum yok:

Yorum Gönder