J2EE 與 J2SE 並非泾渭分明。雖然完整的 J2EE 應用需要容器提供 EJB、JTA、JMS 等服務,但部分 J2EE 技術(JDBC、JNDI、JMS、JMX)完全可以在 J2SE 環境中獨立運行,為輕量級服務器應用帶來企業級能力,避免「重新發明輪子」。
消息隊列提供鬆耦合、可擴展、容錯的架構優勢。J2SE 應用常自行實現線程池/工作隊列,但缺乏標準化接口與分布式能力。
推薦實現: Somnifugi JMS — 純 Java、嵌入式、無需獨立 Broker 進程,JAR 包極小,適合嵌入 J2SE 應用。其他選項:JBossMQ、ActiveMQ(嵌入模式)、OpenJMS。
JBoss 的 jnpserver.jar 提供獨立 JNDI Server(依賴 log4j),配置 jndi.properties 即可啟動:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
# 僅當 Server 在另一 JVM 時取消註釋
# java.naming.provider.url=localhost
客戶端使用 jnpclient.jar 即可訪問命名空間。
JMX 定義 MBean(Managed Bean)封裝組件生命週期(start()/stop())與屬性暴露。JBoss 大量使用 JMX 管理內部服務。
輕量級實現: Sun RI、MX4J。編寫簡單容器掛載 MBean 僅需 ~40 行代碼,即可獲得:
public interface WebServerMBean {
void create() throws Exception;
void start() throws Exception;
void stop();
void destroy();
int getPort();
void setPort(int port);
String[] getWebApplications();
}
| 技術 | J2EE 角色 | J2SE 獨立價值 | 推薦輕量級實現 |
|---|---|---|---|
| JMS | 異步解耦、分布式事務 | 線程池替代、工作流建模、跨 JVM 通信 | Somnifugi JMS, ActiveMQ Embedded |
| JNDI | 資源查找、集群綁定 | 配置集中化、服務發現、組件解耦 | JBoss JNP Server |
| JMX | 容器管理、監控 | 組件生命週期、動態配置、遠程管理控制台 | MX4J, Sun RI |
| JDBC | 數據持久化 | 標準化數據訪問、連接池 | DBCP, C3P0, HikariCP |
javax.jms.*, javax.management.*),而非具體實現。通過引入 JMS、JNDI、JMX 的輕量級實現,J2SE 應用可低成本獲得企業級架構優勢,並在未來需要時平滑遷移至完整 J2EE 容器。關鍵在於「面向接口編程」與「選擇合適的嵌入式實現」。
原文作者:Brian Goetz(IBM developerWorks 連載)