2009-08-12 9 views
1

J'utilise actuellement un Spring RmiProxyFactoryBean pour accéder à des services à distance. Comme les exigences ont changé, je dois spécifier à l'exécution un hôte différent - il peut y en avoir beaucoup -, mais le remoteServiceInterface et les composants non-hôtes du remoteServiceUrl restent les mêmes.Une usine RMIPRoxyFactoryBean au printemps?

Conceptuellement parlant, je vois une définition de haricot semblable à:

<bean class="org.springframework.remoting.rmi.RmiProxyFactoryBeanFactory"> 
    <property name="serviceInterface" value="xxx"/> 
    <property name="serviceUrl" value="rmi://#{HOST}:1099/ServiceUrl"/> 
</bean> 

qui expose une

Object getServiceFor(String hostName); 

Y at-il un tel service disponible avec le printemps? Sinon, voyez-vous une autre façon de faire cela?


S'il vous plaît noter que la liste d'hôte pas être connu lors de la compilation ou le temps de démarrage, donc je ne peux pas générer dans le fichier xml.

Répondre

0

Je fini implemeting quelque chose de similaire à:

public class RmiServiceFactory implements BeanClassLoaderAware { 
    public Service getServiceForHost(String hostName) { 
    factory = new RmiProxyFactoryBean(); 
    factory.setLookupStubOnStartup(false); 
    factory.setRefreshStubOnConnectFailure(true); 
    factory.setServiceInterface(Service.class); 
    factory.setServiceUrl(String.format(_serviceUrlFormat, hostName)); 
    if (_classLoader != null) 
     factory.setBeanClassLoader(_classLoader); 

    factory.afterPropertiesSet(); 
    } 
} 

Bien sûr, il y a peu de bon sens et de la mise en cache de vérification impliqués, mais je les ai ommited.

1

Si vous regardez la source de RmiProxyFactoryBean, vous pouvez voir qu'il s'agit d'une sous-classe très fine de RmiClientInterceptor, qui est juste un AOP MethodInterceptor standard. Cela me suggère que vous pourriez écrire une classe personnalisée qui implémente votre méthode getServiceFor(hostname) souhaitée, et cette méthode pourrait utiliser une Spring ProxyFactory de la même manière que RmiProxyFactoryBean, pour générer un proxy d'exécution pour votre hôte spécifique.

Par exemple:

public Object getProxyFor(String hostName) { 
    RmiClientInterceptor rmiClientInterceptor = new RmiClientInterceptor(); 
    rmiClientInterceptor.setServiceUrl(String.format("rmi://%s:1099/ServiceUrl", hostName)); 
    rmiClientInterceptor.setServiceInterface(rmiServiceInterface); 
    rmiClientInterceptor.afterPropertiesSet(); 

    return new ProxyFactory(proxyInterface, rmiClientInterceptor).getProxy(); 
} 

Où sont les types définis par vous rmiServiceInterface et proxyInterface.

Questions connexes