Merhaba Değerli Java Dostları,
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…
Yazan: Faruk BOZAN (Yazılım Mimarı / Software Architect)