← Kursa Dön
💻

Message Queue Simulasyonu

Orta
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 ID
  • body (String) — Mesaj içeriği
  • retryCount (int) — Kaç kez denendiği (varsayılan: 0)

SimpleMessageQueue sınıfı:

  1. void publish(String id, String body) — Yeni mesajı kuyruğa ekler (FIFO sırası).
  2. Message consume() — Kuyruktan bir mesaj alır (poll). Kuyruk boşsa null döner.
  3. 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.
  4. Message consumeDlq() — Dead Letter Queue'dan bir mesaj alır. Boşsa null döner.
  5. int queueSize() — Ana kuyruğun boyutunu döner.
  6. int dlqSize() — DLQ boyutunu döner.

Girdi Formatı

Program stdin'den satır satır komutlar okur:

  • PUBLISH id body — Mesaj yayınla
  • CONSUME — Kuyruktan mesaj al ve yazdır
  • NACK id maxRetries — Mesajı geri koy veya DLQ'ya taşı (son consume edilen mesajı kullanır)
  • CONSUME_DLQ — DLQ'dan mesaj al ve yazdır
  • SIZE — Ana kuyruk ve DLQ boyutlarını yazdır
  • EXIT — Programı sonlandır

Çıktı

  • CONSUME / CONSUME_DLQ: Mesaj varsa id:body formatında yazdır, yoksa EMPTY yazdır.
  • NACK: Mesaj DLQ'ya taşındıysa DLQ:id yazdır, tekrar kuyruğa eklendiyse REQUEUED:id yazdır.
  • SIZE: queue=X, dlq=Y formatı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ı

Main.java
✓ Çözüm yüklendi
puan

                    
Ln 1, Col 1 · JAVA · UTF-8
Wandbox