EJB звонок из свинга - PullRequest
       5

EJB звонок из свинга

1 голос
/ 22 августа 2010

У меня есть приложение на сервере GF V3.01 и удаленные методы в контейнере EJB.Когда я вызываю удаленные методы из моего приложения удаленного свинга, процесс занимает много времени.Я читал о ServiceLocator, но не могу найти примеры для удаленного приложения Swing.Кто-нибудь, пожалуйста, помогите!дать некоторую идею для ускорения удаленных вызовов методов.

Я создаю этот тест и делаю некоторые комментарии, если это неверный подход

/** Remote interface CountryManagerRemote */

@ Удаленный публичный интерфейс CountryManagerRemote extends EJBHome {

public String createCountry(Country country);

public String editCountry(Country country);

public List<Country> listAllCountry();

}

/ ** Реализация CountryManagerRemote * /

@ Открытый класс без сохранения состояния CountryManagerBean реализует CountryManagerRemote {

/** persistance context and other initialization */

/**
 * Default constructor.
 */
public CountryCityRegister() {
}

/** implementation of CountryManagerRemote */

public String createCountry(Country country) {
    return "massage about operation succesed/failed";
}

public String editCountry(Country country) {
    return "massage about operation succesed/failed";
}

public List<Country> listAllCountry(){
        return List<Country>
}

/** EJBHome methods without implementation */

@Override
public EJBMetaData getEJBMetaData() throws RemoteException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public HomeHandle getHomeHandle() throws RemoteException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void remove(Handle handle) throws RemoteException, RemoveException {
    // TODO Auto-generated method stub

}

@Override
public void remove(Object primaryKey) throws RemoteException, RemoveException {
    // TODO Auto-generated method stub

}

}

/ ** remoteкод приложения Swing * / открытый класс ClientApp {

public static void main(String[] args) {

    System.setProperty("java.security.auth.login.config", "auth.conf");
    System.setProperty("org.omg.CORBA.ORBInitialPort", "***serverport***");
    System.setProperty("org.omg.CORBA.ORBInitialHost", "***serverip***");

    ProgrammaticLogin programmaticLogin = new ProgrammaticLogin();

    try {

    // GF programatic login with custom realm
    programmaticLogin.login("username", "userpass");


    /**Obtain servicelocator instance*/
    ServiceLocator service=ServiceLocator.getInstance();

    /**FIRST GAIN OF EJB BEAN IT TAKE LONG TIME FOR FIRST LOOKUP*/      
    CountryManagerRemote manager=(CountryManagerRemote manager)service.getRemoteHome("com.CountryManagerRemote", com.CountryManagerRemote.class);

     List<Country> countryList=manager.listAllCountry();

    if(countryList!=null){
    //SHOW LIST
    }


    **/**ANOTHER PLACE OF SWING APP*/**
    /**SECOND INVOCATION OF BEAN IT ONLY TAKE TIME TO GET EJBHome OBJECT FROM ServiceLocator CACHE*/        
    CountryManagerRemote manager=(CountryManagerRemote manager)service.getRemoteHome("com.CountryManagerRemote", com.CountryManagerRemote.class);


     List<Country> countryList=manager.listAllCountry();

    if(countryList!=null){
    //SHOW LIST
    }


    } catch (Exception e1) {
        System.err.println("Inform User about exception"); 

    }

    }

}

/ ** ServiceLocator для удаленного ejb * /

открытый класс ServiceLocator {

private InitialContext ic;
private Map<String, EJBHome> cache;

private static ServiceLocator me;

static {
    try {
        me = new ServiceLocator();
    } catch (ServiceLocatorException se) {
        System.err.println(se);
        se.printStackTrace(System.err);
    }
}

private ServiceLocator() throws ServiceLocatorException {
    try {
        ic = new InitialContext();
        cache = Collections.synchronizedMap(new HashMap<String, EJBHome>());
    } catch (NamingException ne) {
        throw new ServiceLocatorException(ne);
    }
}

static public ServiceLocator getInstance() {
    return me;
}

public EJBHome getRemoteHome(String jndiHomeName, Class<?> className) throws ServiceLocatorException {
    EJBHome home = null;
    try {
        if (cache.containsKey(jndiHomeName)) {
            home = (EJBHome) cache.get(jndiHomeName);
        } else {
            Object objref = ic.lookup(jndiHomeName);
            Object obj = PortableRemoteObject.narrow(objref, className);
            home = (EJBHome) obj;
            cache.put(jndiHomeName, home);
        }
    } catch (NamingException ne) {
        throw new ServiceLocatorException(ne);
    } catch (Exception e) {
        throw new ServiceLocatorException(e);
    }
    return home;
}

}

Ответы [ 2 ]

0 голосов
/ 22 августа 2010

Страница Sun Service Locator содержит пример реализации (см. Веб-уровень ServiceLocator), который позволяет избежать создания ненужных InitialContext и кэширует домашние интерфейсы корпоративных компонентов.

0 голосов
/ 22 августа 2010

Я ничего не знаю о EJB (поэтому я не знаю, отличается ли ответ), но обычно, когда вы вызываете долгосрочное задание, вы просто запускаете отдельную тему.легко сделать с помощью SwingWorker .

...