EJB - Geri aramalar
Geri arama, bir işletme çekirdeğinin yaşam döngüsünün durdurulabildiği bir mekanizmadır. EJB 3.0 belirtimi, geri arama işleyici yöntemlerinin oluşturulduğu geri aramaları belirtmiştir. EJB Container bu geri aramaları çağırır. Geri çağırma yöntemlerini EJB sınıfının kendisinde veya ayrı bir sınıfta tanımlayabiliriz. EJB 3.0, geri aramalar için birçok ek açıklama sağlamıştır.
Durum bilgisi olmayan fasulye için geri arama ek açıklamalarının listesi aşağıdadır -
Ek açıklama | Açıklama |
---|---|
@Filmdenkare | Bir fasulye ilk kez oluşturulduğunda çağrılır. |
@Kafadergisi | Fasulye havuzundan bir fasulye çıkarıldığında veya yok edildiğinde çağrılır. |
Durum bilgisi olan fasulye için geri arama ek açıklamalarının listesi aşağıdadır -
Ek açıklama | Açıklama |
---|---|
@Filmdenkare | Bir fasulye ilk kez oluşturulduğunda çağrılır. |
@Kafadergisi | Fasulye havuzundan bir fasulye çıkarıldığında veya yok edildiğinde çağrılır. |
@PostActivate | Kullanılmak üzere bir fasulye yüklendiğinde çağrılır. |
@Hayalhanemersin | Fasulye, fasulye havuzuna geri konulduğunda çağrılır. |
Mesaj odaklı bean için geri arama ek açıklamalarının listesi aşağıdadır -
Ek açıklama | Açıklama |
---|---|
@Filmdenkare | Bir fasulye ilk kez oluşturulduğunda çağrılır. |
@Kafadergisi | Fasulye havuzundan bir fasulye çıkarıldığında veya yok edildiğinde çağrılır. |
Varlık çekirdeği için geri arama ek açıklamalarının listesi aşağıdadır -
Ek açıklama | Açıklama |
---|---|
@Hayalhanemersin | Veritabanında bir varlık oluşturulduğunda çağrılır. |
@Filmdenkare | Veritabanında bir varlık oluşturulduktan sonra çağrılır. |
@Hayalhanemersin | Veritabanından bir varlık silindiğinde çağrılır. |
@Hayalhanemersin | Veritabanından bir varlık silindikten sonra çağrılır. |
@PreUpdate | Bir varlık veritabanında güncellenmeden önce çağrılır. |
@PostLoad | Veritabanından bir kayıt alındığında ve varlığa yüklendiğinde çağrılır. |
Örnek Uygulama
EJB'de çeşitli geri aramaları 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.stateless paketinin altında EjbComponent adıyla bir proje oluşturun . EJB'ye çeşitli geri aramalar eklemek için bu bölümde olduğu gibi EJB - Kalıcılık bölümünde oluşturulan projeyi de kullanabilirsiniz . |
2 | Oluşturma LibrarySessionBean.java ve LibrarySessionBeanRemote açıklandığı şekilde EJB - Uygulama oluşturun bölüm. Geri kalan dosyaları değiştirmeden tutun. |
3 | EJB - Kalıcılık bölümünde oluşturulan Fasulyeleri kullanın . Aşağıda gösterildiği gibi geri arama yöntemleri ekleyin. Geri kalan dosyaları değiştirmeden tutun. |
4 | Bir java sınıf oluşturma BookCallbackListener paket altında com.tutorialspoint.callback . Bu sınıf, geri arama yöntemlerinin ayrılmasını gösterecektir. |
5 | İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun. |
6 | 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. |
7 | Ş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ü)
BookCallbackListener.java
package com.tutorialspoint.callback;
import javax.persistence.PrePersist;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import com.tutorialspoint.entity.Book;
public class BookCallbackListener {
@PrePersist
public void prePersist(Book book) {
System.out.println("BookCallbackListener.prePersist:"
+ "Book to be created with book id: "+book.getId());
}
@PostPersist
public void postPersist(Object book) {
System.out.println("BookCallbackListener.postPersist::"
+ "Book created with book id: "+((Book)book).getId());
}
@PreRemove
public void preRemove(Book book) {
System.out.println("BookCallbackListener.preRemove:"
+ " About to delete Book: " + book.getId());
}
@PostRemove
public void postRemove(Book book) {
System.out.println("BookCallbackListener.postRemove::"
+ " Deleted Book: " + book.getId());
}
@PreUpdate
public void preUpdate(Book book) {
System.out.println("BookCallbackListener.preUpdate::"
+ " About to update Book: " + book.getId());
}
@PostUpdate
public void postUpdate(Book book) {
System.out.println("BookCallbackListener.postUpdate::"
+ " Updated Book: " + book.getId());
}
@PostLoad
public void postLoad(Book book) {
System.out.println("BookCallbackListener.postLoad::"
+ " Loaded Book: " + book.getId());
}
}
Book.java
package com.tutorialspoint.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="books")
public class Book implements Serializable{
private int id;
private String name;
public Book() {
}
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
LibraryStatefulSessionBean.java
package com.tutorialspoint.stateful;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
import javax.ejb.Stateful;
@Stateful
public class LibraryStatefulSessionBean
implements LibraryStatefulSessionBeanRemote {
List<String> bookShelf;
public LibraryStatefulSessionBean() {
bookShelf = new ArrayList<String>();
}
public void addBook(String bookName) {
bookShelf.add(bookName);
}
public List<String> getBooks() {
return bookShelf;
}
@PostConstruct
public void postConstruct() {
System.out.println("LibraryStatefulSessionBean.postConstruct::"
+ " bean created.");
}
@PreDestroy
public void preDestroy() {
System.out.println("LibraryStatefulSessionBean.preDestroy:"
+ " bean removed.");
}
@PostActivate
public void postActivate() {
System.out.println("LibraryStatefulSessionBean.postActivate:"
+ " bean activated.");
}
@PrePassivate
public void prePassivate() {
System.out.println("LibraryStatefulSessionBean.prePassivate:"
+ " bean passivated.");
}
}
LibraryStatefulSessionBeanRemote.java
package com.tutorialspoint.stateful;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface LibraryStatefulSessionBeanRemote {
void addBook(String bookName);
List getBooks();
}
LibraryPersistentBean.java
package com.tutorialspoint.stateless;
import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class LibraryPersistentBean
implements LibraryPersistentBeanRemote {
public LibraryPersistentBean() {}
@PersistenceContext(unitName="EntityEjbPU")
private EntityManager entityManager;
public void addBook(Book book) {
entityManager.persist(book);
}
public List<Book> getBooks() {
return entityManager.createQuery("From Book")
.getResultList();
}
@PostConstruct
public void postConstruct() {
System.out.println("postConstruct:: LibraryPersistentBean session bean"
+ " created with entity Manager object: ");
}
@PreDestroy
public void preDestroy() {
System.out.println("preDestroy: LibraryPersistentBean session"
+ " bean is removed ");
}
}
LibraryPersistentBeanRemote.java
package com.tutorialspoint.stateless;
import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface LibraryPersistentBeanRemote {
void addBook(Book bookName);
List<Book> getBooks();
}
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 - LibraryPersistentBean/remote.
Bu arama dizesini, türündeki uzak iş nesnesini elde etmek için kullanacağız - com.tutorialspoint.stateless.LibraryPersistentBeanRemote
JBoss Uygulama Sunucusu Günlük Çıktısı
...
16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface
LibraryPersistentBean/remote-com.tutorialspoint.stateless.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryPersistentBean,service=EJB3
16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.stateless.LibrarySessionBeanRemote ejbName: LibraryPersistentBean
...
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.LibrarySessionBeanRemote;
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.testEntityEjb();
}
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 testEntityEjb() {
try {
int choice = 1;
LibraryPersistentBeanRemote libraryBean =
(LibraryPersistentBeanRemote)
ctx.lookup("LibraryPersistentBean/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.
TestStatelessEjb () yönteminde jndi araması, uzak iş nesnesini (durum bilgisiz EJB) elde etmek için "LibrarySessionBean / 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ı veritabanında 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ı
Aşağıdaki geri arama girişlerini JBoss günlüğünde bulabilirsiniz
14:08:34,293 INFO [STDOUT] postConstruct:: LibraryPersistentBean session bean created with entity Manager object
...
16:39:09,484 INFO [STDOUT] BookCallbackListener.prePersist:: Book to be created with book id: 0
16:39:09,531 INFO [STDOUT] BookCallbackListener.postPersist:: Book created with book id: 1
16:39:09,900 INFO [STDOUT] BookCallbackListener.postLoad:: Loaded Book: 1
...