简体   繁体   中英

EJB call from swing

I have app on GF V3.01 server and remote methods in EJB container. When I call remote methods from my remote swing app process take long time to execute. I read about ServiceLocator , but can no find examples for remote Swing app. Someone please help! give some idea to speedup remote method calls.

I create this test and make some comments if this is not valid approach

/** Remote interface CountryManagerRemote */

@Remote public interface CountryManagerRemote extends EJBHome {

public String createCountry(Country country);

public String editCountry(Country country);

public List<Country> listAllCountry();

}

/** CountryManagerRemote implementation */

@Stateless public class CountryManagerBean implements 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 app code */ public class 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 for remote ejb */

public class 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;
}

}

I don't know anything about EJB (so I don't know if the answer is any different), but normally when you invoke a long running task you just start a separate Thread.

This is easily done by using a SwingWorker .

Sun的Service Locator页面提供了一个示例实现(请参见Web层ServiceLocator ),该实现避免了构造不必要的InitialContext并缓存了企业bean home接口。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM