0

我在 Linux 上使用 JDK 1.6 运行 JBoss 5.1 GA 并尝试调用会话 bean(包含此会话 bean 的 jar 部署在 jboss 服务器上),现在我想从客户端调用此会话 bean,但没有工作。

客户端的 Java 代码

public class CallingJbossSessionBeanFromClient {

/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception 
{
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    p.put(Context.PROVIDER_URL, "jnp://182.158.93.41:8080");
    Context context = new InitialContext(p);
    System.out.println("Successfully Lookup and going to call SessionBean Function deployed on JBoss-5.1.0 Server");
    SlsSessiongRemote remote=(SlsSessionRemote) context.lookup("SlsSessionBean/remote");
//SlsSessionBean/remote is RemoteBinding of session Bean
    System.out.println("Called");
}
}

其中“SlsSessionBean/remote”是部署在 jboss 服务器上的会话 bean 的远程绑定。@Stateless @RemoteBinding(jndiBinding="SlsSessionBean/remote")

但最终出现以下错误

Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at CallingJbossSessionBeanFromClient.main(CallingJbossSessionBeanFromClient.java:20)
     Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 4 more

看到上述错误后,我在“CallingJbossSessionBeanFromClient”类的类路径中添加了 jbossjmx-ant.jar 并得到以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/logging/Logger
at org.jnp.interfaces.NamingContext.<clinit>(NamingContext.java:181)
at org.jnp.interfaces.NamingContextFactory.getInitialContext(NamingContextFactory.java:55)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at CallingJbossSessionBeanFromClient.main(CallingJbossSessionBeanFromClient.java:20)
    Caused by: java.lang.ClassNotFoundException: org.jboss.logging.Logger
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
... 7 more

看到上述错误后,我在“CallingJbossSessionBeanFromClient”类的类路径中添加了 jboss-logging-spi.jar 并得到以下错误

Exception in thread "main" javax.naming.CommunicationException: Could not obtain connection to any of these urls: 182.158.93.41:8080 and discovery failed with error: javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out] [Root exception is javax.naming.CommunicationException: Failed to retrieve stub from server /182.158.93.41:8080 [Root exception is java.io.EOFException]]
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1763)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:693)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at CallingJbossSessionBeanFromClient.main(CallingJbossSessionBeanFromClient.java:22)
       Caused by: javax.naming.CommunicationException: Failed to retrieve stub from server /182.158.93.41:8080 [Root exception is java.io.EOFException]
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:327)
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1734)
... 4 more
    Caused by: java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:312)
... 5 more

请告诉我,我是否以正确的方式从客户端 Java 类调用会话 bean?我花了几个小时在谷歌上寻找解决方案。但是我似乎找不到任何能握住手的东西..试着更清楚一点,我在这个问题上缺乏想法,即使这听起来像是一个经典的 Plz 建议解决方案

4

2 回答 2

0

这个问题的解决方法是打开JMX-Console,点击service=Naming,查看Naming服务的MBean视图。检查使用的端口是否仍然是1099.....将URL更改为jnp://182.158.93.41:1299,客户端可以与EJB通信。

于 2012-06-21T05:00:21.703 回答
0

如果您在 JBoss AS 5.x 上运行 这里是基于 RMI 的 JNDI 描述。

RMI-Port:默认 -1099 / 如果动态端口更改为 ports-01 则端口为 1199

现在,剩下的事情都OK了,修改下面的代码

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "jnp://182.158.93.41:1199");

另一点是访问的情况

SlsSessiongRemote remote=(SlsSessionRemote) context.lookup("SlsSessionBean/remote"); 如果 - @Stateless(name="SlsSessionBean")

然后是远程 JNDI- [SlsSessionBean/remote] 和本地 JNDI - [SlsSessionBean/local]

如果 - @Stateless(name="SlsSessionBean", mappedName="SlsSessionBeanGlobal")

然后是远程 JNDI- [SlsSessionBeanGlobal] 和本地 JNDI - [SlsSessionBean/local]

于 2013-03-22T09:56:55.250 回答