jboss-3.2.6.zip (含 Tomcat 4.1)C:\jboss-3.2.6cd C:\jboss-3.2.6\bin
run.bat # Windows
# run.sh # Linux
等待 ~1 分鐘,控制台滾動停止顯示 "Started" 即成功。訪問 Web Console: https://127.0.0.1:8080/web-console/ 進行服務管理監控。
package sample;
public interface HelloWorld extends javax.ejb.EJBObject {
String hello() throws java.rmi.RemoteException;
}
package sample;
public interface HelloWorldHome extends javax.ejb.EJBHome {
HelloWorld create() throws java.rmi.RemoteException, javax.ejb.CreateException;
}
package sample;
import javax.ejb.*;
public class HelloWorldBean implements SessionBean {
private SessionContext ctx;
public void setSessionContext(SessionContext ctx) { this.ctx = ctx; }
public void ejbRemove() { System.out.println("ejbRemove()"); }
public void ejbActivate() { System.out.println("ejbActivate()"); }
public void ejbPassivate() { System.out.println("ejbPassivate()"); }
public String hello() {
System.out.println("hello()");
return "hello,world";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<description>JBoss Hello World Application</description>
<display-name>Hello World EJB</display-name>
<enterprise-beans>
<session>
<ejb-name>Hello</ejb-name>
<home>sample.HelloWorldHome</home>
<remote>sample.HelloWorld</remote>
<ejb-class>sample.HelloWorldBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
放置於項目 META-INF/ 目錄。
cd F:\projects\jboss-tutorial
jar cf HelloWorld.jar sample META-INF
copy HelloWorld.jar C:\jboss-3.2.6\server\default\deploy\
控制台輸出部署成功日誌:Successfully completed deployment of package: HelloWorld.jar
package sample;
import javax.naming.*;
import java.util.Hashtable;
public class HelloWorldClient {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099"); // 遠程機器改 IP:1099
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
try {
Context ctx = new InitialContext(env);
Object obj = ctx.lookup("HelloWorld"); // JNDI 名稱默認為 ejb-name
HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(obj, HelloWorldHome.class);
HelloWorld hello = home.create();
System.out.println(hello.hello()); // 輸出: hello,world
hello.remove();
} catch (Exception e) { e.printStackTrace(); }
}
}
j2ee.jar、jboss-client.jar、jnp-client.jar 等javac -cp ... sample/HelloWorldClient.javajava -cp ... sample.HelloWorldClient| 環節 | 要點 |
|---|---|
| JNDI 名稱 | 默認與 ejb-name 一致 (本例 "HelloWorld") |
| JBoss 命名工廠 | org.jnp.interfaces.NamingContextFactory |
| 端口 | 1099 (JRMP),非 8080 (HTTP) |
| 窄化 | PortableRemoteObject.narrow 必須用於 RMI-IIOP 兼容 |
| 熱部署 | 直接覆蓋 deploy 目錄 JAR 即可自動重新部署 |