2012-03-14 5 views
1

원격 메서드 액세스에 EJB 3 예제를 사용하려고합니다. 코드를 작성하고 항아리에 넣는 간단한 예제. 나는 C에서 JBoss 서버 내부의 항아리를 배포 한 : \ jboss-4.2.3.GA 서버 \ 기본 \ 를 배포하고 단지 이름은 01addproject.jar입니다 \EJB 원격 메서드 액세스

(EJB JAR 파일로 일식에서 내 보낸) 다른 프로젝트를 사용하여 클라이언트 코드 인 을 작성하여 서비스를 찾고 간단한 방법으로 원격 메소드를 사용합니다.

클래스가 PSVM 프로그램으로 클라이언트 코드를 실행할 때 NameNotFoundException을 제공하는 RMI 레지스트리에 등록되지 않는다고 생각합니다.

는 오류입니다 :

javax.naming.NameNotFoundException: AddRemoteImpl not bound 
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:529) 
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:537) 
    at org.jnp.server.NamingServer.getObject(NamingServer.java:543) 
    at org.jnp.server.NamingServer.lookup(NamingServer.java:267) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305) 

패키지 구조 (공간 부족 감소) :

package com.cluster.remote; import javax.ejb.Remote; @Remote public interface AddRemote { void m1(); int add(int x, int y); } 
,691 AddRemote.java

내부
Package Structre of both Client and EJB code

코드 363,210

코드 AddRemoteImpl.java

package com.cluster.remote; 

import javax.ejb.Stateless; 

@Stateless 
public class AdddRemoteImpl implements AddRemote { 

    @Override 
    public void m1() { 
     System.out.println("inside m1"); 
    } 

    @Override 
    public int add(int x, int y) { 

     return x + y; 
    } 

} 

클라이언트 코드 (psvm 프로그램) 내부 Client.java

package clientcode; 

import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import com.cluster.remote.AddRemote; 

public class Client { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     try { 
      AddRemote remote = (AddRemote) getInitialContext().lookup("AddRemoteImpl/remote"); 

      System.out.println("The alue form the session bean is " + remote.add(3, 5)); 
      System.out.println("Added Successfully"); 



     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public static Context getInitialContext() throws NamingException{ 

     Hashtable hashtable = new Hashtable(); 
     hashtable.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); 
     hashtable.put(Context.PROVIDER_URL, "localhost:1099"); 
     Context context = new InitialContext(hashtable); 


     return context; 
    } 

} 

답변

1

이로 연재 그래서 EJB가 바인드 된 시점에 수출되지 않은 내부 그 자체는 스텁이 아니기 때문에, 클라이언트 검색은 AddRemoteImpl 클래스를로드하지 못했습니다. 클라이언트가 가져서는 안되기 때문에 합리적입니다. 빌드/선언/배치 된 방식이 잘못되어 더 이상 도움이되지 않습니다.

+0

죄송합니다 .. 그것은 금이갔습니다! 어리석은 실수. 클래스 이름은 "AdddRemoteImpl"(참조 패키지 구조) 그리고 클라이언트에 내가 "AddRemoteImpl/원격"을 요구하고있다 .. 싱글 'D'의 차이 .. 그건 내 일했다 ... @EJP입니다 ... 디버깅에 도움을 주셔서 감사합니다. – bali208

관련 문제