Stateless Session Bean 不維護客戶會話狀態,單次方法調用結束即釋放回實例池,支援高併發、極佳擴展性。核心特徵:
ejbCreate() 不接受參數,因無狀態可保留。package com.wiley.compBooks.roman.session.helloworld;
import javax.ejb.*;
import java.rmi.RemoteException;
public interface Hello extends EJBObject {
String hello() throws RemoteException;
}
package com.wiley.compBooks.roman.session.helloworld;
import javax.ejb.*;
public class HelloBean implements SessionBean {
public void ejbCreate() { System.out.println("ejbCreate()"); }
public void ejbRemove() { System.out.println("ejbRemove()"); }
public void ejbActivate() { System.out.println("ejbActivate()"); } // 無狀態 Bean 不會被鈍化,方法留空
public void ejbPassivate() { System.out.println("ejbPassivate()"); }
public void setSessionContext(SessionContext ctx) { System.out.println("setSessionContext()"); }
public String hello() {
System.out.println("hello()");
return "Hello, World!";
}
}
注意:無狀態 Bean 不實作遠端介面,ejbActivate/ejbPassivate 容器不會呼叫,但介面規範要求實作。
package com.wiley.compBooks.roman.session.helloworld;
import javax.ejb.*;
import java.rmi.RemoteException;
public interface HelloHome extends EJBHome {
Hello create() throws RemoteException, CreateException;
}
Statelessejb-jar.xml)將類檔、介面、部署描述符打包為 HelloWorld.jar,部署至容器(如 WebLogic),容器工具產生 Stub/Skeleton、EJBObject/Home 物件實作。
package com.wiley.compBooks.roman.session.helloworld;
import javax.ejb.*;
import javax.naming.*;
import java.util.Properties;
public class HelloClient {
public static void main(String[] args) {
try {
Properties props = System.getProperties();
Context ctx = new InitialContext(props);
HelloHome home = (HelloHome) ctx.lookup("HelloHome");
Hello hello = home.create();
System.out.println(hello.hello()); // 輸出: Hello, World!
hello.remove();
} catch (Exception e) { e.printStackTrace(); }
}
}
啟動 WebLogic (t3server),執行客戶端:
java -Djava.naming.factory.initial=weblogic.jndi.TengahInitialContextFactory
-Djava.naming.provider.url=t3://localhost:7001
com.wiley.compBooks.roman.session.helloworld.HelloClient
伺服端日誌依序輸出:setSessionContext() → ejbCreate() → hello() → ejbRemove(),確認 Bean 生命週期正確。