EJB - Mesajla Sürülen Fasulye

İleti güdümlü bir fasulye, kuyruktan veya konudan bir ileti aldığında EJB kapsayıcısı tarafından çağrılan bir tür kurumsal fasulye türüdür. Mesaj odaklı fasulye, durum bilgisi olmayan bir fasulyedir ve görevi eşzamansız olarak yapmak için kullanılır.

Mesaj odaklı fasulye kullanımını göstermek için, EJB-kalıcılık bölümünü kullanacağız ve aşağıdaki görevleri yapmamız gerekiyor -

  • Step 1- Veritabanında tablo oluşturun ( EJB-Persistence bölümüne bakın ).

  • Step 2- Tabloya karşılık gelen Varlık sınıfı oluşturun ( EJB-Persistence bölümüne bakın ).

  • Step 3- DataSource ve Persistence Birimi Oluşturun ( EJB-Persistence bölümüne bakın ).

  • Step 4- EntityManager örneğine sahip durumsuz bir EJB oluşturun ( EJB-Persistence bölümüne bakın ).

  • Step 5- Durum bilgisi olmayan ejb'yi güncelleyin. Varlık yöneticisi aracılığıyla kayıt eklemek ve veritabanından kayıt almak için yöntemler ekleyin ( EJB-Persistence bölümüne bakın ).

  • Step 6 - adlı bir Sıra oluşturun BookQueue JBoss'ta default uygulama dizini.

  • Step 7 - Konsol tabanlı bir uygulama istemcisi bu kuyruğa mesaj gönderecektir.

  • Step 8 - İstemci verilerini kalıcı hale getirmek için durumsuz çekirdeği kullanacak bir Mesaj odaklı fasulye oluşturun.

  • Step 9 - Jboss'un EJB konteyneri yukarıdaki mesajla çalışan Bean'i çağıracak ve istemcinin göndereceği mesajı iletecektir.

Sıra Oluştur

İçinde yoksa jbossmq-destination-service.xml adlı bir dosya oluşturun. <JBoss Installation Folder> > server > default > deploy Klasör.

Burada BookQueue adlı bir kuyruk oluşturuyoruz -

jbossmq-destination-service.xml

<mbean code="org.jboss.mq.server.jmx.Queue"  
   name="jboss.mq.destination:service=Queue,name=BookQueue">  
   <depends optional-attribute-name="DestinationManager">
      jboss.mq:service=DestinationManager
   </depends>  
</mbean>

JBoss'u başlattığınızda, jboss günlüğünde benzer bir giriş göreceksiniz.

...
10:37:06,167 INFO  [QueueService] Queue[/queue/BookQueue] started, fullSize=200000, pageSize=2000, downCacheSize=2000
...

Mesaja Dayalı Bean Oluştur

@MessageDriven(
   name = "BookMessageHandler",
   activationConfig = {
      @ActivationConfigProperty( propertyName = "destinationType", 
                                 propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty( propertyName = "destination", 
                                 propertyValue ="/queue/BookQueue")
   }
)
public class LibraryMessageBean implements MessageListener {
 
   @Resource
   private MessageDrivenContext mdctx;  
 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
 
   public LibraryMessageBean() {        
   }
 
   public void onMessage(Message message) {
   }
}
  • LibraryMessageBean, mesajla yönlendirilen bean olarak işaretlemek için @MessageDriven ek açıklaması ile açıklanır.

  • Özellikleri, destinationType - Queue ve destination - / queue / BookQueue olarak tanımlanır.

  • OnMessage yöntemini ortaya çıkaran MessageListener arabirimini uygular.

  • Kaynak olarak MessgeDrivenContext'e sahiptir.

  • LibraryPersistentBeanRemote durumsuz fasulye, kalıcılık amacıyla bu çekirdeğe enjekte edilmiştir.

EjbComponent projesini oluşturun ve JBoss'a dağıtın. EJB modülünü oluşturup konuşlandırdıktan sonra, jboss kuyruğuna bir mesaj gönderecek bir istemciye ihtiyacımız var.

Örnek Uygulama

Message Driven Bean'i test etmek için bir test EJB uygulaması oluşturalım.

Adım Açıklama
1

EJB - Uygulama Oluştur bölümünde açıklandığı gibi com.tutorialspoint.entity paketinin altında EjbComponent adıyla bir proje oluşturun . EJB kalıcılık kavramlarını anlamak için, bu bölümde olduğu gibi EJB - Uygulama Oluştur bölümünde oluşturulan projeyi de kullanabilirsiniz .

2

EJB-Persistence bölümünde oluşturulan com.tutorialspoint.entity paketi altında Book.java'yı oluşturun .

3

EJB-Persistence bölümünde oluşturulan LibraryPersistentBean.java ve LibraryPersistentBeanRemote'u oluşturun .

4

Oluşturmak jboss-ds.xml içindeEjbComponent > setup klasör ve kalıcılık.xml içindeEjbComponent > src > conf Klasör. Bu klasörler, EJB-Persistence bölümünde oluşturulan Netbeans'teki dosyalar sekmesinde görülebilir .

5

Oluşturma LibraryMessageBean.java bir paket altında com.tutorialspoint.messagebean ve aşağıda gösterildiği gibi değiştirebilirsiniz.

6

Yukarıda anlatıldığı gibi Jboss'ta BookQueue kuyruğu oluşturun .

7

İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun.

8

Son olarak, uygulamayı JBoss Uygulama Sunucusunda jar dosyası biçiminde dağıtın. Henüz başlatılmamışsa JBoss Uygulama sunucusu otomatik olarak başlayacaktır.

9

Şimdi, başlık altındaki EJB - Uygulama Oluştur bölümünde açıklandığı gibi, konsol tabanlı bir uygulama olan EJB istemcisini oluşturun.Create Client to access EJB. Aşağıda gösterildiği gibi değiştirin.

EJBComponent (EJB Modülü)

LibraryMessageBean.java

package com.tutorialspoint.messagebean;
 
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
 
@MessageDriven(
   name = "BookMessageHandler",
   activationConfig = {
      @ActivationConfigProperty( propertyName = "destinationType", 
                                 propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty( propertyName = "destination", 
                                 propertyValue ="/queue/BookQueue")
   }
)
public class LibraryMessageBean implements MessageListener {
 
   @Resource
   private MessageDrivenContext mdctx;  
 
   @EJB
   LibraryPersistentBeanRemote libraryBean;
 
   public LibraryMessageBean() {        
   }
 
   public void onMessage(Message message) {
      ObjectMessage objectMessage = null;
      try {
         objectMessage = (ObjectMessage) message;
         Book book = (Book) objectMessage.getObject(); 
         libraryBean.addBook(book);
 
      } catch (JMSException ex) {
         mdctx.setRollbackOnly();
      }       
   }   
}

EJBTester (EJB İstemcisi)

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.entity.Book;
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
public class EJBTester {
 
   BufferedReader brConsoleReader = null; 
   Properties props;
   InitialContext ctx;
   {
      props = new Properties();
      try {
         props.load(new FileInputStream("jndi.properties"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      try {
         ctx = new InitialContext(props);            
      } catch (NamingException ex) {
         ex.printStackTrace();
      }
      brConsoleReader = 
      new BufferedReader(new InputStreamReader(System.in));
   }
   
   public static void main(String[] args) {
 
      EJBTester ejbTester = new EJBTester();
 
      ejbTester.testMessageBeanEjb();
   }
   
   private void showGUI() {
      System.out.println("**********************");
      System.out.println("Welcome to Book Store");
      System.out.println("**********************");
      System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
   }
   
   private void testMessageBeanEjb() {
 
      try {
         int choice = 1; 
         Queue queue = (Queue) ctx.lookup("/queue/BookQueue");
         QueueConnectionFactory factory =
         (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
         QueueConnection connection =  factory.createQueueConnection();
         QueueSession session = 
         connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
         QueueSender sender = session.createSender(queue);
 
         while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               Book book = new Book();
               book.setName(bookName);
               ObjectMessage objectMessage = 
                  session.createObjectMessage(book);
               sender.send(objectMessage); 
            } else if (choice == 2) {
               break;
            }
         }
 
         LibraryPersistentBeanRemote libraryBean = 
         (LibraryPersistentBeanRemote)
         ctx.lookup("LibraryPersistentBean/remote");
 
         List<Book> booksList = libraryBean.getBooks();
 
         System.out.println("Book(s) entered so far: " + booksList.size());
         int i = 0;
         for (Book book:booksList) {
            System.out.println((i+1)+". " + book.getName());
            i++;
         }           
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
      }finally {
         try {
            if(brConsoleReader !=null) {
               brConsoleReader.close();
            }
         } catch (IOException ex) {
            System.out.println(ex.getMessage());
         }
      }
   }   
}

EJBTester aşağıdaki görevleri gerçekleştirir -

  • Jndi.properties dosyasından özellikleri yükleyin ve InitialContext nesnesini başlatın.

  • TestStatefulEjb () yönteminde jndi araması, Jboss'ta bulunan kuyruğun işleyişini elde etmek için - "/ queue / BookQueue" adıyla yapılır. Daha sonra gönderen kuyruk oturumu kullanılarak oluşturulur.

  • Ardından kullanıcıya bir kütüphane mağazası Kullanıcı Arayüzü gösterilir ve seçimini girmesi istenir.

  • Kullanıcı 1 girerse, sistem kitap adını sorar ve gönderen kitap adını kuyruğa gönderir. JBoss konteyneri bu mesajı kuyrukta aldığında, bizim mesaj odaklı Bean'in onMessage yöntemini çağırır. Mesaj güdümlü çekirdeğimiz daha sonra kitabı durum bilgisi olan oturum bean addBook () yöntemini kullanarak kaydeder. Session Bean, EntityManager çağrısı ile kitabı veritabanında tutuyor.

  • Kullanıcı 2 girerse, o zaman başka bir jndi araması, uzak iş nesnesini (durum bilgili EJB) tekrar elde etmek için adla - "LibraryStatefulSessionBean / remote" yapılır ve kitapların listelenmesi yapılır.

EJB'ye Erişmek için İstemciyi Çalıştırın

Proje gezgininde EJBTester.java'yı bulun. EJBTester sınıfına sağ tıklayın ve seçinrun file.

Netbeans konsolunda aşağıdaki çıktıyı doğrulayın -

run:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 1
Enter book name: Learn EJB
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 2
1. learn java
1. learn EJB
BUILD SUCCESSFUL (total time: 15 seconds)

Yukarıda gösterilen çıktı, Mesaj odaklı çekirdeğimizin mesajı aldığını ve kitabı kalıcı depolama alanında sakladığını ve kitapların veritabanından alındığını belirtir.