EJB - Durdurucular

EJB 3.0, @AroundInvoke ek açıklamasıyla açıklanmış yöntemleri kullanarak iş yöntemi çağrılarını engellemek için spesifikasyon sağlar. Bir durdurucu yöntemi, iş yöntemi çağrılmadan önce ejbContainer tarafından çağrılır. Aşağıda, bir engelleyici yönteminin örnek imzası verilmiştir

@AroundInvoke
public Object methodInterceptor(InvocationContext ctx) throws Exception {
   System.out.println("*** Intercepting call to LibraryBean method: " 
   + ctx.getMethod().getName());
   return ctx.proceed();
}

Durdurucu yöntemleri üç seviyede uygulanabilir veya bağlanabilir.

  • Default - Varsayılan engelleyici, dağıtım içindeki her fasulye için çağrılır. Varsayılan engelleyici yalnızca xml (ejb-jar.xml) aracılığıyla uygulanabilir.

  • Class- Fasulyenin her yöntemi için sınıf düzeyinde engelleyici çalıştırılır. Sınıf düzeyinde engelleyici, hem xml (ejb-jar.xml) ile açıklama eklenerek uygulanabilir.

  • Method- Fasulyenin belirli bir yöntemi için yöntem düzeyinde engelleyici çağrılır. Yöntem düzeyinde engelleyici, hem xml (ejb-jar.xml) aracılığıyla ek açıklama eklenerek uygulanabilir.

Burada Sınıf seviyesi önleyiciyi tartışıyoruz.

Interceptor Sınıfı

package com.tutorialspoint.interceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class BusinessInterceptor {
   @AroundInvoke
   public Object methodInterceptor(InvocationContext ctx) throws Exception {
      System.out.println("*** Intercepting call to LibraryBean method: " 
      + ctx.getMethod().getName());
      return ctx.proceed();
   }
}

Uzak Arayüz

import javax.ejb.Remote;

@Remote
public interface LibraryBeanRemote {
   //add business method declarations
}

Yakalanan Vatansız EJB

@Interceptors ({BusinessInterceptor.class})
@Stateless
public class LibraryBean implements LibraryBeanRemote {
   //implement business method 
}

Örnek Uygulama

Yakalanan durum bilgisi olmayan EJB'yi 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.interceptor paketinin altında EjbComponent adıyla bir proje oluşturun . Ayrıca, yakalanan EJB 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

Oluşturma LibraryBean.java ve LibraryBeanRemote paket altında com.tutorialspoint.interceptor açıklandığı gibi EJB - Uygulama oluşturun bölüm. Geri kalan dosyaları değiştirmeden tutun.

3

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

4

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.

5

Ş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.

EJBComponent (EJB Modülü)

LibraryBeanRemote.java

package com.tutorialspoint.interceptor;

import java.util.List;
import javax.ejb.Remote;

@Remote
public interface LibraryBeanRemote {
   void addBook(String bookName);
   List getBooks();
}

LibraryBean.java

package com.tutorialspoint.interceptor;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.interceptor.Interceptors;

@Interceptors ({BusinessInterceptor.class})
@Stateless
public class LibraryBean implements LibraryBeanRemote {
    
   List<String> bookShelf;    

   public LibraryBean() {
      bookShelf = new ArrayList<String>();
   }

   public void addBook(String bookName) {
      bookShelf.add(bookName);
   }    

   public List<String> getBooks() {
      return bookShelf;
   }   
}
  • EjbComponent projesini JBOSS üzerinde dağıtır dağıtmaz, jboss günlüğüne dikkat edin.

  • JBoss, oturum fasulyemiz için otomatik olarak bir JNDI girişi oluşturdu - LibraryBean/remote.

  • Bu arama dizesini, türündeki uzak iş nesnesini elde etmek için kullanacağız - com.tutorialspoint.interceptor.LibraryBeanRemote

JBoss Uygulama Sunucusu Günlük Çıktısı

...
16:30:01,401 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
   LibraryBean/remote - EJB3.x Default Remote Business Interface
   LibraryBean/remote-com.tutorialspoint.interceptor.LibraryBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryBean,service=EJB3
16:30:02,723 INFO  [EJBContainer] STARTED EJB: com.tutorialspoint.interceptor.LibraryBeanRemote ejbName: LibraryBean
16:30:02,731 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

   LibraryBean/remote - EJB3.x Default Remote Business Interface
   LibraryBean/remote-com.tutorialspoint.interceptor.LibraryBeanRemote - EJB3.x Remote Business Interface
...

EJBTester (EJB İstemcisi)

jndi.properties

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
  • Bu özellikler, java adlandırma hizmetinin InitialContext nesnesini başlatmak için kullanılır.

  • InitialContext nesnesi, durum bilgisiz oturum çekirdeğini aramak için kullanılacaktır.

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.stateful.LibraryBeanRemote;

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.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.testInterceptedEjb();
   }
   
   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 testInterceptedEjb() {

      try {
         int choice = 1; 

         LibraryBeanRemote libraryBean =
         LibraryBeanRemote)ctx.lookup("LibraryBean/remote");

         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);
               libraryBean.addBook(book);          
            } else if (choice == 2) {
               break;
            }
         }

         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.

  • TestInterceptedEjb () yönteminde jndi araması, uzak iş nesnesini (durum bilgisiz EJB) elde etmek için - "LibraryBean / remote" adıyla yapılır.

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

  • Kullanıcı 1 girerse, sistem kitap adını sorar ve kitabı durum bilgisi olmayan oturum bean addBook () yöntemini kullanarak kaydeder. Session Bean, kitabı örnek değişkeninde saklıyor.

  • Kullanıcı 2 girerse, sistem kitapları durumsuz oturum bean getBooks () yöntemini kullanarak alır ve çıkar.

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 Java
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 1
1. Learn Java
BUILD SUCCESSFUL (total time: 13 seconds)

JBoss Uygulama Sunucusu Günlük Çıktısı

JBoss Uygulama sunucusu günlük çıktısında aşağıdaki çıktıyı doğrulayın.

....
09:55:40,741 INFO  [STDOUT] *** Intercepting call to LibraryBean method: addBook
09:55:43,661 INFO  [STDOUT] *** Intercepting call to LibraryBean method: getBooks