2010-08-22 16 views
1

J'ai l'application sur le serveur GF v3.01 et les méthodes à distance dans le conteneur EJB. Lorsque j'appelle des méthodes distantes à partir de mon processus d'application de swing distant, il faut beaucoup de temps pour l'exécuter. Je lis à propos de ServiceLocator, mais je ne trouve aucun exemple d'application Swing à distance. Quelqu'un aide s'il vous plaît! donner une idée pour accélérer les appels de méthode à distance.appel EJB du swing

Je crée ce test et faire quelques commentaires si ce n'est pas approche valable

/** Remote interface CountryManagerRemote */ 

@Remote CountryManagerRemote public interface étend EJBHome {

public String createCountry(Country country); 

public String editCountry(Country country); 

public List<Country> listAllCountry(); 

}

/* * la mise en œuvre de CountryManagerRemote */

@Stateless CountryManagerBean public class implémente 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 

} 

}

/** code app swing à distance */ 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 pour ejb distant */

ServiceLocator public class {

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

}

+0

Combien d'appels vous faire? D'après mon expérience, faire quelques appels ne prend pas beaucoup de temps à l'utilisateur. Peut-être que vous avez un autre problème? Combien de temps faut-il pour passer un appel? –

+0

de 2 à 7 secondes. – dimitri

+0

il est mal à l'aise d'attendre plus de deux secondes avant la trame apparaît – dimitri

Répondre

0

Je ne sais pas quoi que ce soit au sujet EJB (donc je ne sais pas si la réponse est différente), mais normalement lorsque vous invoquez une longue En cours d'exécution, vous démarrez simplement un thread séparé.

Cela se fait facilement à l'aide d'un SwingWorker.

+0

camickr, merci pour votre avis. Je connais SwingWorker, mais ma méthode distante ne renvoie que la liste simple des personnes de la base de données. Le fonctionnement de la méthode EJB n'est pas coûteux. cher est l'invocation du bean EJB et de la recherche JNDI. Je veux accélérer l'opération de recherche du client de swing. – dimitri

+0

Ignorer mon commentaire Je pensais que vous étiez préoccupé par le gel de l'interface graphique lors de l'appel à distance. – camickr

+2

Pourquoi répondriez-vous à une question dans laquelle vous ne connaissez rien au sujet? –

0

la page de Sun Service Locator fournit un exemple d'implémentation (voir le niveau Web ServiceLocator) qui évite la construction d'inutiles InitialContext et caches interfaces maison de haricots entreprise.

+0

je l'explication rouge, mais c'est pour le niveau Web. ce sera une bonne idée de placer ServiceLocator dans le côté du client swing et obtenir ejb distant ServiceLocator.getInstance(). GetRemoteHome (jndiName, Clazz)? – dimitri

+0

@dimitri Et quelle est la différence entre un client Web Tier et un client Swing? Je suggère d'expérimenter un peu si vous avez des doutes. –

+0

Je fais le test maintenant et les résultats sont parfaits. chaque invocation suivante sur le même bean EJB n'est pas très chère, car ses objets EJBHome sont stockés dans le cache de ServiceLocator. J'ai des doutes sur ServiceLocator dans les clients VM. chaque utilisateur d'application a son propre ServiceLocator dans mon cas. Dans Web tier, l'instance ServiceLocator est une pour chaque. – dimitri