Java 远程无状态bean的JNDI查找(hello world)

Java 远程无状态bean的JNDI查找(hello world),java,jakarta-ee,netbeans,glassfish,ejb,Java,Jakarta Ee,Netbeans,Glassfish,Ejb,对于连接到本地主机上Glassfish的两个Java SE客户端,只有非常类似于的连接RemoteJNDI,它通过CORBA连接,并带有显式JNDI连接参数,获得一个NamingException。RemoteJNDI如何连接到本地主机上的Netbeans,正确查找bean并执行bean RemoteJNDI是从Glassfishappclient运行的。玻璃鱼展: thufir@dur:~/NetBeansProjects/HelloClient$ thufir@dur:~/NetBeans

对于连接到本地主机上Glassfish的两个Java SE客户端,只有非常类似于的连接
RemoteJNDI
,它通过CORBA连接,并带有显式JNDI连接参数,获得一个
NamingException
RemoteJNDI
如何连接到本地主机上的Netbeans,正确查找bean并执行bean

RemoteJNDI
是从Glassfish
appclient
运行的。玻璃鱼展:

thufir@dur:~/NetBeansProjects/HelloClient$ 
thufir@dur:~/NetBeansProjects/HelloClient$ /home/thufir/glassfish-4.1/glassfish/bin/asadmin list-applications
HelloEJB     <ejb>        
Command list-applications executed successfully.
thufir@dur:~/NetBeansProjects/HelloClient$ 
(这也将
HelloClient
部署到Glassfish。)

但是,尝试使用
appclient
和JNDI查找复制该输出会导致
NamingException:查找'hello.HelloBean'
失败,而ACC客户端可以通过ACC查找该bean。为什么不能
RemoteJNDI
查找该bean?堆栈跟踪:

thufir@dur:~/NetBeansProjects/HelloClient$ /home/thufir/glassfish-4.1/glassfish/bin/appclient -client /home/thufir/NetBeansProjects/RemoteJNDI/dist/RemoteJNDI.jar 
Sep 20, 2014 8:05:12 AM net.bounceme.dur.jndi.RemoteJNDI main
INFO: {org.omg.CORBA.ORBInitialPort=4848, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1}
org.omg.CORBA.COMM_FAILURE: FINE: 00410008: Connection abort  vmcid: OMG  minor code: 8 completed: Maybe
    at com.sun.proxy.$Proxy35.connectionAbort(Unknown Source)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doOptimizedReadStrategy(ConnectionImpl.java:1288)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doWork(ConnectionImpl.java:846)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: org.omg.CORBA.COMM_FAILURE: FINE: 00410011: IOException received when reading from connection SocketOrChannelConnectionImpl[ java.nio.channels.SocketChannel[connected local=/127.0.0.1:59218 remote=localhost/127.0.0.1:4848] ESTABLISHED true true]  vmcid: OMG  minor code: 11  completed: No
    at com.sun.proxy.$Proxy35.ioexceptionWhenReadingConnection(Unknown Source)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.nonBlockingRead(ConnectionImpl.java:1475)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doOptimizedReadStrategy(ConnectionImpl.java:1242)
    ... 3 more
Caused by: java.io.IOException: End-of-stream
    at com.sun.corba.ee.impl.transport.ConnectionImpl.nonBlockingRead(ConnectionImpl.java:1468)
    ... 4 more
Sep 20, 2014 8:05:46 AM net.bounceme.dur.jndi.RemoteJNDI main
SEVERE: null
javax.naming.NamingException: Lookup failed for 'hello.HelloBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=4848, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=4848, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1} [Root exception is org.omg.CORBA.COMM_FAILURE: FINE: 00410008: Connection abort  vmcid: OMG  minor code: 8 completed: Maybe]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at net.bounceme.dur.jndi.RemoteJNDI.main(RemoteJNDI.java:17)
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=4848, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1} [Root exception is org.omg.CORBA.COMM_FAILURE: FINE: 00410008: Connection abort  vmcid: OMG  minor code: 8 completed: Maybe]
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:334)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:477)
    ... 3 more
Caused by: org.omg.CORBA.COMM_FAILURE: FINE: 00410008: Connection abort  vmcid: OMG  minor code: 8 completed: Maybe
    at com.sun.proxy.$Proxy35.connectionAbort(Unknown Source)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doOptimizedReadStrategy(ConnectionImpl.java:1288)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doWork(ConnectionImpl.java:846)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: org.omg.CORBA.COMM_FAILURE: FINE: 00410011: IOException received when reading from connection SocketOrChannelConnectionImpl[ java.nio.channels.SocketChannel[connected local=/127.0.0.1:59218 remote=localhost/127.0.0.1:4848] ESTABLISHED true true]  vmcid: OMG  minor code: 11  completed: No
    at com.sun.proxy.$Proxy35.ioexceptionWhenReadingConnection(Unknown Source)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.nonBlockingRead(ConnectionImpl.java:1475)
    at com.sun.corba.ee.impl.transport.ConnectionImpl.doOptimizedReadStrategy(ConnectionImpl.java:1242)
    ... 3 more
Caused by: java.io.IOException: End-of-stream
    at com.sun.corba.ee.impl.transport.ConnectionImpl.nonBlockingRead(ConnectionImpl.java:1468)
    ... 4 more

thufir@dur:~/NetBeansProjects/HelloClient$ 
ACC客户端代码:

package helloclient;

import hello.HelloBeanRemote;
import javax.ejb.EJB;

public class Main {
    @EJB
    private static HelloBeanRemote helloBean;

    public static void main(String... args) {
        System.out.println(helloBean.Hi());
    }

}
界面:

package hello;

import javax.ejb.Remote;

@Remote
public interface HelloBeanRemote {

    public String Hi();

    public String Bye();
}
EJB:

package hello;

import javax.ejb.Stateless;

@Stateless
public class HelloBean implements HelloBeanRemote {

    @Override
    public String Hi() {
        return "hello world";
    }

    @Override
    public String Bye() {
        return "goodbye";
    }

}
RemoteJNDI
应显式具有与ACC客户端
HelloClient
隐式具有的配置相同的配置。为什么ACC客户端能够执行bean,而RemoteJNDI`不能

远程JNDI的代码:

package net.bounceme.dur.jndi;

import hello.HelloBean;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class RemoteJNDI {

    private static final Logger log = Logger.getLogger(RemoteJNDI.class.getName());

    public static void main(String[] args) {
        try {
            InitialContext ctx = new InitialContext();
            log.info(ctx.getEnvironment().toString());
            HelloBean bean = (HelloBean) ctx.lookup("hello.HelloBean");
            log.info(bean.Hi());
        } catch (NamingException ex) {
            Logger.getLogger(RemoteJNDI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
本地主机上运行的Glassfish的连接参数是否正确

thufir@dur:~/NetBeansProjects/HelloClient$ 
thufir@dur:~/NetBeansProjects/HelloClient$ /home/thufir/glassfish-4.1/glassfish/bin/appclient -client /home/thufir/NetBeansProjects/RemoteJNDI/dist/RemoteJNDI.jar 
Sep 20, 2014 8:05:12 AM net.bounceme.dur.jndi.RemoteJNDI main
INFO: {org.omg.CORBA.ORBInitialPort=4848, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1}
------------------------------------------------------编辑-----------------------------

跟踪:

thufir@dur:~$ 
thufir@dur:~$ /home/thufir/glassfish-4.1/glassfish/bin/appclient -client /home/thufir/NetBeansProjects/RemoteJNDI/dist/RemoteJNDI.jar 
javax.naming.NamingException: Lookup failed for 'HelloBeanRemote' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, Context.SECURITY_CREDENTIALS=pass123, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, Context.SECURITY_PRINCIPAL=user1} [Root exception is javax.naming.NameNotFoundException: HelloBeanRemote not found]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at net.bounceme.dur.jndi.RemoteJNDI.main(RemoteJNDI.java:18)
Caused by: javax.naming.NameNotFoundException: HelloBeanRemote not found
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66)
    at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109)
    at sun.reflect.GeneratedMethodAccessor113.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
thufir@dur:~$ 
thufir@dur:~$ 
例如,打印跟踪

package net.bounceme.dur.jndi;

import hello.HelloBean;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

public class RemoteJNDI {

    private static final Logger log = Logger.getLogger(RemoteJNDI.class.getName());

    public static void main(String... args) {
        try {
            InitialContext ctx = new InitialContext();
            log.fine(ctx.getEnvironment().toString());
            Object obj = ctx.lookup("HelloBeanRemote");
            HelloBean bean = (HelloBean) PortableRemoteObject.narrow(obj, HelloBean.class);
            log.info(bean.Hi());
        } catch (NamingException ex) {
            ex.printStackTrace();
        }
    }

}

----------------------------------------编辑------------------------------------------

使用远程接口名称通过JNDI进行查找。 然后使用该方法将其强制转换到远程bean

Object obj = ctx.lookup("HelloBeanRemote");
HelloBean bean = (HelloBean) PortableRemoteObject.narrow(obj, HelloBean.class);

请参见编辑输出,我认为是相同的错误。我尝试了端口3700而不是4848,但仍然无法查找bean。我确实喜欢使用接口名来查找它。为什么是“HelloBeanRemote”而不是“hello.HelloBeanRemote”?服务器会自动检测会话bean的任何远程接口的包名,这就是我的工作方式。而且HelloBeanRemote更整洁。在这个问题上,你能在编辑之后提供跟踪吗?没有比这个更多的输出了——除非我传递编译器选项或更改try循环中记录的内容。可以。在错误行中,我看不到异常。你能把完整的stacktrace记录下来,放在某个地方让我看一下吗?我不知道这是解决问题的办法。我将用一个
@local
bean来代替它。注意,我将EJB模块
HelloEJB
及其接口添加到
RemoteJNDI
以查找bean。
Object obj = ctx.lookup("HelloBeanRemote");
HelloBean bean = (HelloBean) PortableRemoteObject.narrow(obj, HelloBean.class);