💻
Orta
Message Queue Simulasyonu
100 puan
·
Java
LinkedList tabanlı basit bir message queue sistemi implement edin. Publish, subscribe, consume ve dead letter queue handling içermelidir.
📋 Talimatlar
Message Queue Simulasyonu
Bu ödevde LinkedList tabanlı basit bir Message Queue sistemi implement edeceksiniz. Sistem, mesaj yayınlama (publish), kuyruktan tüketme (consume), ve başarısız mesajları Dead Letter Queue'ya taşıma gibi temel messaging kavramlarını simüle eder.
Gereksinimler
Message sınıfı:
id(String) — Benzersiz mesaj IDbody(String) — Mesaj içeriğiretryCount(int) — Kaç kez denendiği (varsayılan: 0)
SimpleMessageQueue sınıfı:
void publish(String id, String body)— Yeni mesajı kuyruğa ekler (FIFO sırası).Message consume()— Kuyruktan bir mesaj alır (poll). Kuyruk boşsanulldöner.void nack(Message msg, int maxRetries)— Mesajı kuyruğun sonuna tekrar ekler ve retryCount'u artırır. Eğer retryCount >= maxRetries ise mesajı Dead Letter Queue'ya (DLQ) taşır.Message consumeDlq()— Dead Letter Queue'dan bir mesaj alır. Boşsanulldöner.int queueSize()— Ana kuyruğun boyutunu döner.int dlqSize()— DLQ boyutunu döner.
Girdi Formatı
Program stdin'den satır satır komutlar okur:
PUBLISH id body— Mesaj yayınlaCONSUME— Kuyruktan mesaj al ve yazdırNACK id maxRetries— Mesajı geri koy veya DLQ'ya taşı (son consume edilen mesajı kullanır)CONSUME_DLQ— DLQ'dan mesaj al ve yazdırSIZE— Ana kuyruk ve DLQ boyutlarını yazdırEXIT— Programı sonlandır
Çıktı
CONSUME/CONSUME_DLQ: Mesaj varsaid:bodyformatında yazdır, yoksaEMPTYyazdır.NACK: Mesaj DLQ'ya taşındıysaDLQ:idyazdır, tekrar kuyruğa eklendiyseREQUEUED:idyazdır.SIZE:queue=X, dlq=Yformatında yazdır.- Diğer komutlar çıktı üretmez.
Örnek
PUBLISH msg-1 OrderCreated
PUBLISH msg-2 PaymentReceived
CONSUME
→ msg-1:OrderCreated
NACK msg-1 3
→ REQUEUED:msg-1
SIZE
→ queue=2, dlq=0
Önemli Not
NACK komutu, en son CONSUME ile alınan mesajı işler. Program hangi mesajın consume edildiğini takip etmelidir. Eğer consume edilmiş bir mesaj yoksa veya ID eşleşmiyorsa, NACK'i göz ardı edin.
🧪 Örnek Test Senaryoları
Girdi
PUBLISH msg-1 OrderCreated PUBLISH msg-2 PaymentReceived CONSUME SIZE EXIT
Beklenen Çıktı
msg-1:OrderCreated queue=1, dlq=0
Girdi
PUBLISH msg-1 Hello CONSUME NACK msg-1 3 CONSUME NACK msg-1 3 CONSUME NACK msg-1 3 SIZE EXIT
Beklenen Çıktı
msg-1:Hello REQUEUED:msg-1 msg-1:Hello REQUEUED:msg-1 msg-1:Hello DLQ:msg-1 queue=0, dlq=1
Girdi
CONSUME CONSUME_DLQ EXIT
Beklenen Çıktı
EMPTY EMPTY
Girdi
PUBLISH m1 A CONSUME NACK m1 1 CONSUME_DLQ SIZE EXIT
Beklenen Çıktı
m1:A DLQ:m1 m1:A queue=0, dlq=0
Girdi
PUBLISH a First PUBLISH b Second PUBLISH c Third CONSUME CONSUME CONSUME CONSUME EXIT
Beklenen Çıktı
a:First b:Second c:Third EMPTY
💡 İpuçları
İpucu 1: LinkedList hem Queue hem List interface'ini implement eder — addLast() ve pollFirst() ile FIFO sırası elde edersiniz.
İpucu 2: nack() metodunda retryCount'u artırın, ardından maxRetries ile karşılaştırın.
İpucu 3: consume() null dönebilir — NACK komutunda null check yapmayı unutmayın.
İpucu 4: DLQ'dan consume edilen mesaj da normal bir Message nesnesidir — retryCount'u korunur.
☕
Main.java
✓ Çözüm yüklendi
puan
Testleri çalıştırmak için kodunuzu gönderin
✅ Tüm testler geçti! Tebrikler!
Beklenen:
Sonuç:
Ln 1, Col 1
·
JAVA
·
UTF-8
Wandbox