public class RmiServiceExporter extends RmiBasedExporter implements InitializingBean, DisposableBean
RmiProxyFactoryBean を介してアクセスできます。RmiClientInterceptor/RmiProxyFactoryBean のそのような呼び出し側の自動検出を介してアクセスされる RMI 呼び出し側を介した非 RMI サービスの公開もサポートします。RMI インボーカーを使用すると、RMI 通信は RmiInvocationHandler レベルで機能し、サービスに必要なスタブは 1 つだけです。サービスインターフェースは、すべてのメソッドで java.rmi.Remote を継承したり、java.rmi.RemoteException をスローしたりする必要はありませんが、入出力パラメーターは直列化可能でなければなりません。
Hessian と比較した RMI の主な利点は、直列化です。事実上、シリアライズ可能な Java オブジェクトは簡単に転送できます。Hessian には独自の(逆)直列化メカニズムがありますが、HTTP ベースであるため、RMI よりもセットアップがはるかに簡単です。または、Spring の HTTP インボーカーを考慮して、Java 直列化と HTTP ベースのトランスポートを組み合わせます。
メモ: RMI は、完全修飾ホスト名を取得するためのベストエフォートの試みを行います。判別できない場合は、フォールバックして IP アドレスを使用します。ネットワーク構成に応じて、場合によっては IP をループバックアドレスに解決します。RMI が正しいネットワークインターフェースにバインドされたホスト名を使用するようにするには、java.rmi.server.hostname プロパティを JVM に渡し、JVM 引数 "-D" を使用してレジストリまたはサービス、あるいはその両方をエクスポートする必要があります。たとえば: -Djava.rmi.server.hostname=myserver.com
RmiClientInterceptor, RmiProxyFactoryBean, RemoteSE, RemoteExceptionSE, HessianServiceExporter, HttpInvokerServiceExporterlogger| コンストラクターと説明 |
|---|
RmiServiceExporter() |
| 修飾子と型 | メソッドと説明 |
|---|---|
void | afterPropertiesSet() 指定されたすべての Bean プロパティを設定した(そして BeanFactoryAware と ApplicationContextAware を満たした)後に BeanFactory によって呼び出されます。 |
void | destroy()Bean のファクトリシャットダウン時に、レジストリから RMI サービスをアンバインドします。 |
protected RegistrySE | getRegistry(int registryPort) このエクスポーターの RMI レジストリを見つけるか作成します。 |
protected RegistrySE | getRegistry(int registryPort, RMIClientSocketFactorySE clientSocketFactory, RMIServerSocketFactorySE serverSocketFactory) このエクスポーターの RMI レジストリを見つけるか作成します。 |
protected RegistrySE | getRegistry(StringSE registryHost, int registryPort, RMIClientSocketFactorySE clientSocketFactory, RMIServerSocketFactorySE serverSocketFactory) このエクスポーターの RMI レジストリを見つけるか作成します。 |
void | prepare() このサービスエクスポーターを初期化し、サービスを RMI オブジェクトとして登録します。 |
void | setAlwaysCreateRegistry(boolean alwaysCreateRegistry) 指定されたポートで既存のレジストリを見つけようとせずに、常にインプロセスでレジストリを作成するかどうかを設定します。 |
void | setClientSocketFactory(RMIClientSocketFactorySE clientSocketFactory) サービスのエクスポートに使用するカスタム RMI クライアントソケットファクトリを設定します。 |
void | setRegistry(RegistrySE registry) エクスポートされたサービスを登録する RMI レジストリを指定します。 |
void | setRegistryClientSocketFactory(RMIClientSocketFactorySE registryClientSocketFactory)RMI レジストリに使用するカスタム RMI クライアントソケットファクトリを設定します。 |
void | setRegistryHost(StringSE registryHost) エクスポートされた RMI サービスのレジストリのホストを設定します。 |
void | setRegistryPort(int registryPort) エクスポートされた RMI サービスのレジストリのポートを設定します。 |
void | setRegistryServerSocketFactory(RMIServerSocketFactorySE registryServerSocketFactory)RMI レジストリに使用するカスタム RMI サーバーソケットファクトリを設定します。 |
void | setReplaceExistingBinding(boolean replaceExistingBinding)RMI レジストリ内の既存のバインディングを置き換えるかどうか、つまり、レジストリ内で名前の競合が発生した場合に、指定されたサービスで既存のバインディングを単にオーバーライドするかどうかを設定します。 |
void | setServerSocketFactory(RMIServerSocketFactorySE serverSocketFactory) サービスのエクスポートに使用するカスタム RMI サーバーソケットファクトリを設定します。 |
void | setServiceName(StringSE serviceName) エクスポートされた RMI サービスの名前、つまり |
void | setServicePort(int servicePort) エクスポートされた RMI サービスが使用するポートを設定します。 |
protected void | testRegistry(RegistrySE registry) 指定された RMI レジストリをテストし、その上で何らかの操作を呼び出して、まだアクティブかどうかを確認します。 |
getObjectToExport, invokegetRemoteInvocationExecutor, invokeAndCreateResult, setRemoteInvocationExecutorcheckService, checkServiceInterface, getExporterName, getProxyForService, getService, getServiceInterface, setInterceptors, setRegisterTraceInterceptor, setService, setServiceInterfacegetBeanClassLoader, overrideThreadContextClassLoader, resetThreadContextClassLoader, setBeanClassLoadercloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEpublic void setServiceName(StringSE serviceName)
rmi://host:port/NAME を設定します public void setServicePort(int servicePort)
デフォルトは 0(匿名ポート)です。
public void setClientSocketFactory(RMIClientSocketFactorySE clientSocketFactory)
指定されたオブジェクトも java.rmi.server.RMIServerSocketFactory を実装している場合、サーバーソケットファクトリとしても自動的に登録されます。
public void setServerSocketFactory(RMIServerSocketFactorySE serverSocketFactory)
クライアントソケットファクトリが java.rmi.server.RMIServerSocketFactory をまだ実装していない場合にのみ指定する必要があります。
public void setRegistry(RegistrySE registry)
または、すべてのレジストリプロパティをローカルで指定できます。このエクスポータは、指定されたレジストリを見つけようとし、必要に応じて新しいローカルレジストリを自動的に作成します。
デフォルトは、デフォルトポート (1099) のローカルレジストリであり、必要に応じてその場で作成されます。
public void setRegistryHost(StringSE registryHost)
rmi://HOST:port/name を設定します デフォルトは localhost です。
public void setRegistryPort(int registryPort)
rmi://host:PORT/name を設定します デフォルトは Registry.REGISTRY_PORT (1099) です。
public void setRegistryClientSocketFactory(RMIClientSocketFactorySE registryClientSocketFactory)
指定されたオブジェクトも java.rmi.server.RMIServerSocketFactory を実装している場合、サーバーソケットファクトリとしても自動的に登録されます。
public void setRegistryServerSocketFactory(RMIServerSocketFactorySE registryServerSocketFactory)
クライアントソケットファクトリが java.rmi.server.RMIServerSocketFactory をまだ実装していない場合にのみ指定する必要があります。
public void setAlwaysCreateRegistry(boolean alwaysCreateRegistry)
デフォルトは "false" です。常に新しいレジストリを作成する場合に、既存のレジストリを見つけるオーバーヘッドを回避するために、このフラグを "true" に切り替えます。
public void setReplaceExistingBinding(boolean replaceExistingBinding)
デフォルトは "true" です。このエクスポーターのサービス名の既存のバインディングが、以前の実行からの偶発的な残りであると想定しています。このようなシナリオでエクスポーターを失敗させるには、これを "false" に切り替えて、バインド済みの RMI オブジェクトがすでに存在することを示します。
public void afterPropertiesSet()
throws RemoteExceptionSEInitializingBeanこのメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されている場合にのみ可能な初期化を実行し、設定ミスの場合に例外をスローできます。
InitializingBean の afterPropertiesSet RemoteExceptionSEpublic void prepare()
throws RemoteExceptionSE指定されたポートに RMI レジストリが存在しない場合は作成します。
RemoteExceptionSE - サービス登録が失敗した場合 protected RegistrySE getRegistry(StringSE registryHost, int registryPort, @Nullable RMIClientSocketFactorySE clientSocketFactory, @Nullable RMIServerSocketFactorySE serverSocketFactory) throws RemoteExceptionSE
registryHost - 使用するレジストリホスト (これが指定されている場合、RMI レジストリの暗黙的な作成は行われません)registryPort - 使用するレジストリポート clientSocketFactory - レジストリの RMI クライアントソケットファクトリ (もしあれば)serverSocketFactory - レジストリの RMI サーバーソケットファクトリ (もしあれば)RemoteExceptionSE - レジストリを見つけられなかったか、作成できなかった場合 protected RegistrySE getRegistry(int registryPort, @Nullable RMIClientSocketFactorySE clientSocketFactory, @Nullable RMIServerSocketFactorySE serverSocketFactory) throws RemoteExceptionSE
registryPort - 使用するレジストリポート clientSocketFactory - レジストリの RMI クライアントソケットファクトリ (もしあれば)serverSocketFactory - レジストリの RMI サーバーソケットファクトリ (もしあれば)RemoteExceptionSE - レジストリを見つけられなかったか、作成できなかった場合 protected RegistrySE getRegistry(int registryPort) throws RemoteExceptionSE
registryPort - 使用するレジストリポート RemoteExceptionSE - レジストリを見つけられなかったか、作成できなかった場合 protected void testRegistry(RegistrySE registry) throws RemoteExceptionSE
デフォルトの実装は Registry.list() を呼び出します。
registry - テストする RMI レジストリ RemoteExceptionSE - レジストリメソッドによってスローされた場合 Registry.list()SEpublic void destroy()
throws RemoteExceptionSEDisposableBean の destroy RemoteExceptionSE