如何使用独立程序访问 EJB 2.0
Posted
技术标签:
【中文标题】如何使用独立程序访问 EJB 2.0【英文标题】:How to access EJB 2.0 using a standalone program 【发布时间】:2014-09-22 22:49:46 【问题描述】:我正在使用 Eclipse 和 Jboss AS 开发 EJB 2.0 项目。以下是代码示例:
组件接口:
package com.example.ejb;
import javax.ejb.*;
import java.rmi.RemoteException;
public interface Advice extends EJBObject
public String getAdvice() throws RemoteException;
首页界面:
package com.example.ejb;
import java.rmi.RemoteException;
import javax.ejb.*;
public interface AdviceHome extends EJBHome
public Advice create() throws CreateException, RemoteException;
Bean 实现:
package com.example.ejb;
import java.rmi.RemoteException;
import javax.ejb.*;
public class AdviceBean implements SessionBean
private static final long serialVersionUID = 1L;
private String[] adviceStrings = "One word: inappropriate.",
"You mightwant to rethink that haricut.", "Your boss will respect ";
public void ejbPassivate()
System.out.println("ejb activate");
public void ejbRemove()
System.out.println("ejb remove");
public void setSessionContext(SessionContext ctx)
System.out.println("session context");
public String getAdvice()
System.out.println("in get advice");
int random = (int) (Math.random() * adviceStrings.length);
return adviceStrings[random];
public void ejbCreate()
System.out.println("in get create");
public void ejbActivate() throws EJBException, RemoteException
System.out.println("in ejbActivate");
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar id="ejb-jar_ID">
<display-name>Ejb1</display-name>
<enterprise-beans>
<session>
<display-name>AdviceBean</display-name>
<ejb-name>AdviceBean</ejb-name>
<home>com.example.ejb.AdviceHome </home>
<remote>com.example.ejb.Advice</remote>
<ejb-class>com.example.ejb.AdviceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
<ejb-client-jar>EJBProjectClient.jar</ejb-client-jar>
</ejb-jar>
我在 Jboss AS 中部署了这段代码,当我在“服务器中”运行这个代码时,我在 JBOSS 的 JNDI 启动日志中获得了以下详细信息:
09:33:50,273 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC 服务线程 1-3)部署单元部署“EJBProject1.jar”中名为 AdviceBean 的会话 bean 的 JNDI 绑定为如下:
java:global/EJBProject1/AdviceBean!com.example.ejb.Advice
java:app/EJBProject1/AdviceBean!com.example.ejb.Advice
java:module/AdviceBean!com.example.ejb.Advice
java:jboss/exported/EJBProject1/AdviceBean!com.example.ejb.Advice
java:global/EJBProject1/AdviceBean!com.example.ejb.AdviceHome
java:app/EJBProject1/AdviceBean!com.example.ejb.AdviceHome
java:module/AdviceBean!com.example.ejb.AdviceHome
java:jboss/exported/EJBProject1/AdviceBean!com.example.ejb.AdviceHome
09:33:50,299 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC 服务线程 1-2)在部署的部署单元子部署“EJBProject.jar”中名为 AdviceBean 的会话 bean 的 JNDI 绑定“EnterpriseApplicationProject.ear”如下:
java:global/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.Advice
java:app/EJBProject/AdviceBean!com.example.ejb.Advice
java:module/AdviceBean!com.example.ejb.Advice
java:jboss/exported/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.Advice
java:global/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.AdviceHome
java:app/EJBProject/AdviceBean!com.example.ejb.AdviceHome
java:module/AdviceBean!com.example.ejb.AdviceHome
java:jboss/exported/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.AdviceHome
我试图访问 EJB 的客户端代码是:
package com.example.localclient;
import javax.naming.*;
import java.rmi.*;
import javax.rmi.*;
import javax.ejb.*;
import com.example.ejb.Advice;
import com.example.ejb.AdviceHome;
@SuppressWarnings("unused")
public class AdviceClient
public static void main(String[] args) throws Exception
new AdviceClient().go();
public void go() throws Exception
Context ic = new InitialContext();
Object o = ic.lookup("java:jboss/exported/EJBProject1/AdviceBean");
AdviceHome home = (AdviceHome) PortableRemoteObject.narrow(o, AdviceHome.class);
Advice advisor = home.create();
System.out.println(advisor.getAdvice());
但是,当我运行这个独立客户端时,我得到以下异常:
线程“main”中的异常 javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中:java.naming.factory.initial 在 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662) 在 javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) 在 javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344) 在 javax.naming.InitialContext.lookup(InitialContext.java:411) 在 com.example.localclient.AdviceClient.go(AdviceClient.java:24) 在 com.example.localclient.AdviceClient.main(AdviceClient.java:17)
似乎无法找到 JNDI 名称,我尝试了 JBoss 启动时看到的各种 JNDI 名称组合(该信息是上面的几段)。
我需要一些信息,我用谷歌搜索过,但仍然面临同样的问题。
1) 我必须在独立客户端中提供的 JNDI 名称是什么?
2) 由于客户端需要客户端 jar(其中包含接口信息和其他详细信息),我在哪里可以看到?在 Jboss 中仅供参考,我将客户端 jar 视为“EJBProjectClient.jar”,但无法物理定位此文件在 eclipse 的工作区中的位置。
非常感谢任何帮助。
谢谢!
【问题讨论】:
【参考方案1】:您的客户端代码在与服务器不同的 JVM 中运行。
您需要的非常简单。您需要修改代码以使用服务器属性而不是本地属性启动初始上下文。
在此处查看此链接,了解有关如何执行此操作的更多详细信息: http://docs.oracle.com/javase/jndi/tutorial/basics/prepare/initial.html
您需要根据您的环境、提供程序 URL 和上下文工厂更改以下值。
提供程序 URL 是您的服务器使用 IIOP 端口的位置(请参阅 您的服务器设置以获取端口)。 检查服务器文档中的 conetxt 工厂(抱歉 不知道 JBoss 的确切值)。希望这会有所帮助。
【讨论】:
以上是关于如何使用独立程序访问 EJB 2.0的主要内容,如果未能解决你的问题,请参考以下文章
在wildlfy9中,如何在独立模式下使用两个节点进行有状态的ejb会话复制(集群)