2009-08-12 11 views
1

Ich verwende derzeit eine Spring RmiProxyFactoryBean für den Zugriff auf Remote-Dienste. Da sich die Anforderungen geändert haben, muss ich zur Laufzeit einen anderen Host angeben - es kann viele davon geben -, aber die remoteServiceInterface und die Nicht-Host-Komponenten von remoteServiceUrl bleiben gleich.Eine RMIPRoxyFactoryBean-Fabrik im Frühling?

Konzeptionell, würde ich eine Bohne Definition ähnlich sehen:

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

, die eine

Object getServiceFor(String hostName); 

aussetzt Gibt es so einen Dienst zur Verfügung mit Spring? Sehen Sie alternativ eine andere Möglichkeit, dies zu tun?


Bitte beachten Sie, dass die Host-Liste wird nicht bei der Kompilierung oder Startzeit bekannt sein, also kann ich es nicht in der XML-Datei generieren.

Antwort

0

landete ich implemeting etwas ähnliches wie oben:

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

Natürlich gibt es einige geistige Gesundheit ist die Überprüfung und Caching beteiligt, aber ich habe sie ommited.

1

Wenn Sie sich die Quelle für RmiProxyFactoryBean ansehen, können Sie sehen, dass es sich um eine sehr dünne Unterklasse von RmiClientInterceptor handelt, die nur ein Standard AOP MethodInterceptor ist. Dies deutet darauf hin, dass Sie eine benutzerdefinierte Klasse schreiben könnten, die Ihre gewünschte getServiceFor(hostname) Methode implementiert, und diese Methode könnte eine Spring ProxyFactory auf eine ähnliche Weise wie RmiProxyFactoryBean verwenden, um einen Laufzeit-Proxy für Ihren bestimmten Host zu generieren.

Zum Beispiel:

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

Wo rmiServiceInterface und proxyInterface sind Arten von Ihnen festgelegt.

Verwandte Themen