Teorik bilginin ardından sıra geldi basit; ama bir o kadar teorik bilgimizi kapsayacak bir örnek vermeye. Eğer konulara dikkat ederseniz elimizde topic ve queue olmak üzere iki ayrı yapının olduğunu görüyoruz. Dolayısıyla bunlar için iki ayrı örnek vermem faydalı olacaktır. Yazının pdf formatını buradan indirebilirsiniz. Önce queue için örnek verelim.

package jms.queue;import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Alici {

public static void main(String[] args) {
Context jndiContext;
QueueConnectionFactory queueConnectionFactory;
QueueConnection queueConnection = null;
QueueSession queueSession;
Queue queue;
QueueReceiver queueAlici;
TextMessage textMesaj;

try
{
jndiContext = new InitialContext();
queueConnectionFactory =
(QueueConnectionFactory)jndiContext.lookup(“queueFactory”);
queue = (Queue)jndiContext.lookup(“queueDestination”);
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
queueAlici = queueSession.createReceiver(queue);
queueConnection.start();
while(true)
{
Message message = queueAlici.receive(1);
if(message != null)
{
if(message instanceof TextMessage)
{
textMesaj = (TextMessage)message;
System.out.println(“Mesaj okunuyor>>>” + textMesaj.getText());
}
else
break;
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(queueConnection != null)
queueConnection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}

İlk önce alıcı için sınıf tanımladık. Import kısmının ardından değişkenlerimizi tanımlıyoruz ve try – catch bloğu içerisinde işlemleri yapıyoruz. İlk adımlarda JNDI ile ön tanımlı ayarları alıyoruz. Bu ayarlar aracılığı ile haberleşme sağlanmış olunacak. Burada dikkat etmemiz gereken nokta, ConnectionFactory ve Destination oluştururken parametre olarak verilen string ifadelerin birebir sunucuda bulunuyor olmasıdır. Aksi takdirde uygulama çalışmayıp hata verecektir. Daha sonra ise kuyruktan mesajlar çekilmektedir. Şimdi de gönderici için kodumuza bakalım.

package jms.queue;import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Gonderici {

public static void main(String[] args) {
Context jndiContext;
QueueConnectionFactory queueConnectionFactory;
QueueConnection queueConnection = null;
QueueSession queueSession;
Queue queue;
QueueSender queueGonderici;
TextMessage textMesaj;
int mesajSayisi= 5;

try
{
jndiContext = new InitialContext();
queueConnectionFactory =
(QueueConnectionFactory)jndiContext.lookup(“queueFactory”);
queue = (Queue)jndiContext.lookup(“queueDestination”);
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
queueGonderici = queueSession.createSender(queue);
textMesaj = queueSession.createTextMessage();
for(int i = 0; i < mesajSayisi; i++) { textMesaj.setText(“Mesaj>>>” + i);
System.out.println(“Mesaj gonderiliyor>>>” + textMesaj.getText());
queueGonderici.send(textMesaj);
}
queueGonderici.send(queueSession.createMessage());
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(queueConnection != null)
queueConnection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}

Alıcı ile gönderici arasındaki fark, ayar alımlarından sonraki bölümde meydana gelmektedir. Şimdi topic ile ilgili örnek vermek istiyorum.

package jms.topic;import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Gonderici {

public static void main(String[] args) {
Context jndiContext;
TopicConnectionFactory topicConnectionFactory;
TopicConnection topicConnection = null;
TopicSession topicSession;
Topic topic = null;
TopicPublisher topicGonderici;
TextMessage mesaj;
int mesajSayisi = 3;

try
{
jndiContext = new InitialContext();
topicConnectionFactory = (TopicConnectionFactory)jndiContext.lookup(“topicFactory”);
topic = (Topic)jndiContext.lookup(“topicDestination”);
topicConnection = topicConnectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
topicGonderici = topicSession.createPublisher(topic);
mesaj = topicSession.createTextMessage();
for(int i = 0; i < mesajSayisi; i++) { mesaj.setText(“Mesaj>>>” + i);
System.out.println(“Mesaj yayinlaniyor>>>” + mesaj.getText());
topicGonderici.publish(mesaj);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(topicConnection != null)
{
try
{
topicConnection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}

Koda bakıldığında aslında çok büyük farklar olmadığını görebiliyoruz. Sadece yapıdan dolayı metotlarda farklılık meydana geliyor. Mantık hemen hemen aynı. Şimdi alıcıyı tanımlayalım.

package jms.topic;import java.io.InputStreamReader;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Alici {

public static void main(String[] args) {
Context jndiContext = null;
TopicConnectionFactory topicConnectionFactory = null;
TopicConnection topicConnection = null;
TopicSession topicSession = null;
Topic topic = null;
TopicSubscriber topicAlici = null;
TextListener topicListener = null;
InputStreamReader inputStreamReader = null;
char answer = ‘\0’;

try
{
jndiContext = new InitialContext();
topicConnectionFactory = (TopicConnectionFactory)jndiContext.lookup(“topicFactory”);
topic = (Topic)jndiContext.lookup(“topicDestination”);
topicConnection = topicConnectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
topicAlici = topicSession.createSubscriber(topic);
topicListener = new TextListener();
topicAlici.setMessageListener(topicListener);
topicConnection.start();
System.out.println(“Cikmak icin Q ya da q”);
inputStreamReader = new InputStreamReader(System.in);
while(answer != ‘q’ && answer != ‘Q’)
{
try
{
answer = (char)inputStreamReader.read();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(topicConnection != null)
{
try
{
topicConnection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}

package jms.topic;import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class TextListener implements MessageListener {

@Override
public void onMessage(Message message)
{
TextMessage mesaj = null;
try
{
if(message instanceof TextMessage)
{
mesaj = (TextMessage)message;
System.out.println(“Mesaj okunuyor>>>” + mesaj.getText());
}
else
System.out.println(“Yanlis tipte mesaj”);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

Alıcı sınıfımız ikinci bir sınıf kullanmaktadır. Bu sayede mesaj dinleme otomatik hale gelmektedir. Umarım JMS API ile ilgili bu yazı dizim faydalı olmuştur. Bu tür uygulama daha da genişletilip pekala bir rss tarzı birşey yapılabilir.

Bol Java’ lı günler dileğiyle…

Categories:

4 Responses

  1. paylaşım için teşekkürler. kodları yazmadan önce GlassFish te Resource yapılandırması gerekmiyor mu veya kullandığınız server neyse… Bir de normal bir java projesi açtığınızda eklemeniz gereken jar dosyaları yok mu? Çünkü normal java projesinde javax.jms kütüphanesini tanımıyor…

  2. Sanırım dördüncü yazıdaki işlemleri soruyorsunuz. JMS kategorisindeki dördüncü yazıya bakarsanız umarım işinize yarar. Yazıda gerekli ayarlamalar mevcut. Eğer Java EE projesi açarsanız IDE bunu kendi otomatik ekleyecektir. Normal klasik Java App açarsanız eklemeniz tabiki gerekecektir.İyi çalışmalar…

  3. Afedersiniz dördüncü yazınızın farkına varmamışım.
    JMS ile iki farklı bilgisayar arasında mesaj alım ve gönderimi yapmak istiyorum. JMS’nin yapısını anladım. Buna ek olarak ne yapmalıyım? Bu konuda bir bilginiz var mı acaba? Teşekkürler.

  4. Daha önce lokalde çalışmıştım. Remote olarak deneme şansım olmadı ama ilk aklıma gelen şu: Örnek kodlara dikakt ettiyseniz kaynak planlarına JNDI aracılığı ile ulaşıyoruz. Dolayısıyla eğer remote bir kaynağı JNDI kütüğüne kaydedersek çalışacağını tahmin ediyorum. Bir yerden de bu şekilde bir bilgi okuduğumu hatırlıyorum. Umarım faydalı bir yol olur. Eğer bu konu ile ilgili çalışmaların sonucunu paylaşabilirseniz çok memnun olurum. İyi çalışmalar…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.