Uygulamalar arası mesajlaşma nasıl yapılmaktadır? Uygulamalardan biri Gönderen Uygulama, diğeri ise Alan Uygulamadır. Gönderen uygulama mesajı kuyruğa yollar, alan uygulama ya kuyruğu dinler ya da direk kuyruktan alır. Bir gönderen, iki alan uygulama örnegini aşağıda inceleyeceğiz.
• Queue Sender
• Synchronous Queue Receiver
• Asynchronous Queue Receiver
Gönderen Uygulama
1. InitialContext nesnesi tanımlanır.
2. Tanımlanan Context nesnesi JMS Server’da tanımlanmış olan kuyruk(queue) yapısını arar.
3. Tanımlanan kuyruk yapısı için QueueConnectionFactory nesnesi tanımlanır.
4. QueueConnectionFactory nesnesini kullanarak QueueConnection nesnesini yaratırız.
5. Yaratılan Connection uzerinden QueueSession nesnesini yaratırız. Bu session’ın transacted olup olmamasına burda karar veririz.
6. QueueSession nesnesini kullanarak QueueSender nesnesini yaratırız ve ilgili mesajımızı tanımlarız.
7. Tanımladığımız mesajı gönderici kuyruk yapısı ile göndeririz.
Yukarıda yapılan anlatımları kodlamak istersek :
QueueConnection queueConn = null;
try {
InitialContext ctx = new InitialContext();
Queue queue = (Queue) ctx.lookup("queue/queue0");
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("queue/connectionFactory");
queueConn = connFactory.createQueueConnection();
QueueSession queueSession = queueConn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);
QueueSender queueSender = queueSession.createSender(queue);
queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
TextMessage message = queueSession.createTextMessage("Asin Akdeniz");
queueSender.send(message);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}finally{
if(queueConn != null){
try {
queueConn.close();
} catch (JMSException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}//end of finally
Alıcı Uygulama
Alıcı uygulamalar senkron ve asenkron alıcılar olabilmektedir. Senkron Alıcı, gönderici gibi ilk tanımlamaları yapar bir kaç detay dışında. Initial Context i kullanarak kuyruk yapısı tanımlanır, connection kurulur, session yaratılır. Farklılık bundan sonra başlıyor, QueueSender yerine mesajların alımının sağlayacak QueueReceiver nesnesi tanımlanır. QueueSender’den sonra yazılacak kod parçası aşağıdaki gibidir.
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueConn.start();
TextMessage message = (TextMessage) queueReceiver.receive();
queueConn.close();
InitialContext ctx = new InitialContext();
Queue queue = (Queue) ctx.lookup("queue/queue0");
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("queue/connectionFactory");
QueueConnection queueConn = connFactory.createQueueConnection();
QueueSession queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
Main asyncReceiver = new Main();
queueReceiver.setMessageListener(asyncReceiver);
queueConn.setExceptionListener(asyncReceiver);
queueConn.start();
System.out.print("waiting for messages");
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
System.out.print(".");
}
System.out.println();
queueConn.close();
}
public void onMessage(Message message){
TextMessage msg = (TextMessage) message;
try {
System.out.println("received: " + msg.getText());
} catch (JMSException ex) {
ex.printStackTrace();
}
}
public void onException(JMSException exception){
System.err.println("an error occurred: " + exception);
}
queueConn.start();
TextMessage message = (TextMessage) queueReceiver.receive();
queueConn.close();
Asenkron alıcı uygulaması biraz daha farklılaşmaktadır. Burada alıcı sınıfın mesaj dinleyicileri tanımlanır. Tanımlayacağımız alıcı sınıfın MessageListener Java arayüzünü implement etmesi gerekmektedir. Bu arayüz sadece onMessage metodunu içermektedir. Tanımladığımız istemci nesnesini QueueReceiver’ın setMessageListener metoduna register ederiz.
Queue queue = (Queue) ctx.lookup("queue/queue0");
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("queue/connectionFactory");
QueueConnection queueConn = connFactory.createQueueConnection();
QueueSession queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
Main asyncReceiver = new Main();
queueReceiver.setMessageListener(asyncReceiver);
queueConn.setExceptionListener(asyncReceiver);
queueConn.start();
System.out.print("waiting for messages");
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
System.out.print(".");
}
System.out.println();
queueConn.close();
}
public void onMessage(Message message){
TextMessage msg = (TextMessage) message;
try {
System.out.println("received: " + msg.getText());
} catch (JMSException ex) {
ex.printStackTrace();
}
}
public void onException(JMSException exception){
System.err.println("an error occurred: " + exception);
}
Hiç yorum yok:
Yorum Gönder