EJB удаленный метод доступа - PullRequest
1 голос
/ 14 марта 2012

Я пробую пример EJB 3 для удаленного доступа к методу.Простой пример, где я пишу код и помещаю его в банку.Я развернул jar на сервере jboss в C: \ jboss-4.2.3.GA \ server \ default \ deploy и имя jar: 01addproject.jar (экспортировано из eclipse в виде файла JAR EJB)

Я использую другой проект для написания клиентского кода, поиска службы и простого использования удаленного метода.

Мне кажется, что класс не регистрируется в реестре RMI,который дает NameNotFoundException, когда я запускаю клиентский код в качестве программы PSVM.

Это ошибка:

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 Structre of both Client and EJB code

Код внутри AddRemote.java

package com.cluster.remote;

import javax.ejb.Remote;

@Remote
public interface AddRemote {

    void m1();
    int add(int x, int y);

}

Код внутри 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 Ответ

1 голос
/ 14 марта 2012

EJB не был экспортирован в то время, когда он был связан, поэтому он был сериализован как сам, а не как его заглушка, поэтому при поиске клиента не удалось загрузить класс AddRemoteImpl, что разумно, так как у клиента его не должно быть , Что-то не так с тем, как оно было построено / объявлено / развернуто, не может помочь в дальнейшем.

...