错误执行Head First EJB第一个示例

问题描述:

我正在执行Head First EJB。我知道它具有与EJB 3.1相同的旧版本的EJB 2.0,但我认为Head是第一本为学习像我们这样的业余爱好者准备的好书。错误执行Head First EJB第一个示例

我使用J2ee 1.3.1 RI和jdk 1.4。我运行了“部署”工具来部署EJB,现在我有一个ejb客户端JAVA程序给出如下:

import javax.naming.*; 
import java.rmi.*; 
import javax.rmi.*; 
import headfirst.*; 
import javax.ejb.*; 

import java.util.*; 

public class AdviceClient { 
    public static void main(String[] args){ 
     new AdviceClient().go(); 
    } 

    public void go(){ 
     try{ 

      Properties props=new Properties(); 
      props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
      //props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); 
      //env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
      //props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory"); 
      props.setProperty(Context.PROVIDER_URL,"rmi://localhost:1050"); 
      //props.setProperty("java.naming.provider.url","rmi://localhost:1099"); 

      Context ic = new InitialContext(props); 
      Object o = ic.lookup("Advisor"); 

      AdviceHome home = (AdviceHome)PortableRemoteObject.narrow(o,AdviceHome.class); 

      Advice advisor = home.create(); 
      System.out.println(advisor.getAdvice()); 
     } 
     catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 






Following the book, I compiled the program. The "Properties" part is something not mentioned in the example. I got it from some other examples on the web. Now, that when I am executing the client, am getting the following error: 


F:\EJBProject\advice>java -classpath AdviceAppClient.jar;. AdviceClient 
javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 

     java.net.SocketTimeoutException: Read timed out] 
     at com.sun.jndi.rmi.registry.RegistryContext.lookup(Unknown Source) 
     at com.sun.jndi.rmi.registry.RegistryContext.lookup(Unknown Source) 
     at javax.naming.InitialContext.lookup(Unknown Source) 
     at AdviceClient.go(AdviceClient.java:26) 
     at AdviceClient.main(AdviceClient.java:11) 
Caused by: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
     java.net.SocketTimeoutException: Read timed out 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source) 
     at sun.rmi.server.UnicastRef.newCall(Unknown Source) 
     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
     ... 5 more 
Caused by: java.net.SocketTimeoutException: Read timed out 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(Unknown Source) 
     at java.net.SocketInputStream.read(Unknown Source) 
     at java.io.BufferedInputStream.fill(Unknown Source) 
     at java.io.BufferedInputStream.read(Unknown Source) 
     at java.io.DataInputStream.readByte(Unknown Source) 

请帮忙。我在这里困住了。我想参加OCBCD考试!

问候, Shouvanik

+0

您的错误表明您尝试连接的RMI服务器不存在。 RMI服务器在哪个端口监听?你使用的是什么j2ee服务器?那是太阳j2ee服务器吗? – 2013-05-02 03:45:11

+0

RMI端口是1050,它正在运行。我使用j2ee 1.3 RI和jdk1.4。 – 2013-05-02 04:42:59

+0

从独立的Java程序连接到rmi服务器时,请检查所有这些必需的库和说明。它也有样本程序。 >> http://docs.oracle.com/cd/E19644-01/817-5050/dcacc.html#wp1016235 – 2013-05-02 10:40:46

终于解决了。

如果您在运行第一个EJB示例时遇到了障碍,只需按照以下步骤 运行HeadFirst EJB的第一个示例。

软件 1. J2SDK1.4.1 - JDK 2. J2SDKEE1.3.1 - J2EE RI 3. CMD(命令提示)

编译所有用c类:\ J2SDKEE1.3.1 \ lib中\ J2EE。 jar库。 现在,创建一个应用程序并在RI内部署EJB。按照本书所示下载应用程序客户端。

现在,来了棘手的部分。

使用以下罐子

javac的编译客户端类-classpath AdviceAppClient.jar; C:\ J2SDKEE1.3.1 \ lib中\的j2ee.jar AdviceClient.java

接下来,运行在客户端如下

java -cp AdviceAppClient.jar; c:\ j2sdkee1.3.1 \ lib \ j2ee.jar; c:\ j2sdk1.4.1 \ jre \ lib \ rt.jar ;. AdviceClient