1

GF V3.01 サーバーにアプリがあり、EJB コンテナーにリモート メソッドがあります。リモート Swing アプリ プロセスからリモート メソッドを呼び出すと、実行に時間がかかります。ServiceLocator について読みましたが、リモート Swing アプリの例が見つかりません。誰か助けてください!リモートメソッド呼び出しを高速化するためのアイデアを提供してください。

このテストを作成し、これが有効なアプローチでない場合はコメントします

/** Remote interface CountryManagerRemote */

@Remote パブリック インターフェイス CountryManagerRemote は EJBHome を拡張します {

public String createCountry(Country country);

public String editCountry(Country country);

public List<Country> listAllCountry();

}

/** CountryManagerRemote の実装 */

@Stateless public class 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

}

}

/** リモート Swing アプリのコード */ 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"); 

    }

    }

}

/** リモート ejb の ServiceLocator */

パブリッククラス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;
}

}

4

2 に答える 2

0

SunのServiceLocatorServiceLocatorページは、不要な構築を回避しInitialContext、エンタープライズBeanホームインターフェイスをキャッシュする実装例(Web層を参照 )を提供します。

于 2010-08-22T15:00:56.937 に答える
0

私は EJB について何も知りません (したがって、答えが異なるかどうかはわかりません) が、通常、実行時間の長いタスクを呼び出すときは、別のスレッドを開始するだけです。

これは、 SwingWorkerを使用して簡単に実行できます。

于 2010-08-22T14:53:16.000 に答える