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, Remote, RemoteException, HessianServiceExporter, HttpInvokerServiceExporterlogger| コンストラクターと説明 |
|---|
RmiServiceExporter() |
| 修飾子と型 | メソッドと説明 |
|---|---|
void | afterPropertiesSet() |
void | destroy()Bean のファクトリシャットダウン時に、レジストリから RMI サービスをアンバインドします。 |
protected java.rmi.registry.Registry | getRegistry(int registryPort) このエクスポーターの RMI レジストリを見つけるか作成します。 |
protected java.rmi.registry.Registry | getRegistry(int registryPort, java.rmi.server.RMIClientSocketFactory clientSocketFactory, java.rmi.server.RMIServerSocketFactory serverSocketFactory) このエクスポーターの RMI レジストリを見つけるか作成します。 |
protected java.rmi.registry.Registry | getRegistry(java.lang.String registryHost, int registryPort, java.rmi.server.RMIClientSocketFactory clientSocketFactory, java.rmi.server.RMIServerSocketFactory serverSocketFactory) このエクスポーターの RMI レジストリを見つけるか作成します。 |
void | prepare() このサービスエクスポーターを初期化し、サービスを RMI オブジェクトとして登録します。 |
void | setAlwaysCreateRegistry(boolean alwaysCreateRegistry) 指定されたポートで既存のレジストリを見つけようとせずに、常にインプロセスでレジストリを作成するかどうかを設定します。 |
void | setClientSocketFactory(java.rmi.server.RMIClientSocketFactory clientSocketFactory) サービスのエクスポートに使用するカスタム RMI クライアントソケットファクトリを設定します。 |
void | setRegistry(java.rmi.registry.Registry registry) エクスポートされたサービスを登録する RMI レジストリを指定します。 |
void | setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)RMI レジストリに使用するカスタム RMI クライアントソケットファクトリを設定します。 |
void | setRegistryHost(java.lang.String registryHost) エクスポートされた RMI サービスのレジストリのホストを設定します。 |
void | setRegistryPort(int registryPort) エクスポートされた RMI サービスのレジストリのポートを設定します。 |
void | setRegistryServerSocketFactory(java.rmi.server.RMIServerSocketFactory registryServerSocketFactory)RMI レジストリに使用するカスタム RMI サーバーソケットファクトリを設定します。 |
void | setReplaceExistingBinding(boolean replaceExistingBinding)RMI レジストリ内の既存のバインディングを置き換えるかどうか、つまり、レジストリ内で名前の競合が発生した場合に、指定されたサービスで既存のバインディングを単にオーバーライドするかどうかを設定します。 |
void | setServerSocketFactory(java.rmi.server.RMIServerSocketFactory serverSocketFactory) サービスのエクスポートに使用するカスタム RMI サーバーソケットファクトリを設定します。 |
void | setServiceName(java.lang.String serviceName) エクスポートされた RMI サービスの名前、つまり |
void | setServicePort(int servicePort) エクスポートされた RMI サービスが使用するポートを設定します。 |
protected void | testRegistry(java.rmi.registry.Registry registry) 指定された RMI レジストリをテストし、その上で何らかの操作を呼び出して、まだアクティブかどうかを確認します。 |
getObjectToExport, invokegetRemoteInvocationExecutor, invokeAndCreateResult, setRemoteInvocationExecutorcheckService, checkServiceInterface, getExporterName, getProxyForService, getService, getServiceInterface, setInterceptors, setRegisterTraceInterceptor, setService, setServiceInterfacegetBeanClassLoader, overrideThreadContextClassLoader, resetThreadContextClassLoader, setBeanClassLoaderpublic void setServiceName(java.lang.String serviceName)
rmi://host:port/NAME を設定します public void setServicePort(int servicePort)
デフォルトは 0(匿名ポート)です。
public void setClientSocketFactory(java.rmi.server.RMIClientSocketFactory clientSocketFactory)
指定されたオブジェクトも java.rmi.server.RMIServerSocketFactory を実装している場合、サーバーソケットファクトリとしても自動的に登録されます。
setServerSocketFactory(java.rmi.server.RMIServerSocketFactory), RMIClientSocketFactory、RMIServerSocketFactory、UnicastRemoteObject.exportObject(Remote, int, RMIClientSocketFactory, RMIServerSocketFactory)public void setServerSocketFactory(java.rmi.server.RMIServerSocketFactory serverSocketFactory)
クライアントソケットファクトリが java.rmi.server.RMIServerSocketFactory をまだ実装していない場合にのみ指定する必要があります。
setClientSocketFactory(java.rmi.server.RMIClientSocketFactory), RMIClientSocketFactory、RMIServerSocketFactory、UnicastRemoteObject.exportObject(Remote, int, RMIClientSocketFactory, RMIServerSocketFactory)public void setRegistry(java.rmi.registry.Registry registry)
または、すべてのレジストリプロパティをローカルで指定できます。このエクスポータは、指定されたレジストリを見つけようとし、必要に応じて新しいローカルレジストリを自動的に作成します。
デフォルトは、デフォルトポート (1099) のローカルレジストリであり、必要に応じてその場で作成されます。
public void setRegistryHost(java.lang.String registryHost)
rmi://HOST:port/name を設定します デフォルトは localhost です。
public void setRegistryPort(int registryPort)
rmi://host:PORT/name を設定します デフォルトは Registry.REGISTRY_PORT (1099) です。
Registry.REGISTRY_PORTpublic void setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)
指定されたオブジェクトも java.rmi.server.RMIServerSocketFactory を実装している場合、サーバーソケットファクトリとしても自動的に登録されます。
setRegistryServerSocketFactory(java.rmi.server.RMIServerSocketFactory), RMIClientSocketFactory、RMIServerSocketFactory、LocateRegistry.getRegistry(String, int, RMIClientSocketFactory)public void setRegistryServerSocketFactory(java.rmi.server.RMIServerSocketFactory registryServerSocketFactory)
クライアントソケットファクトリが java.rmi.server.RMIServerSocketFactory をまだ実装していない場合にのみ指定する必要があります。
setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory), RMIClientSocketFactory、RMIServerSocketFactory、LocateRegistry.createRegistry(int, RMIClientSocketFactory, RMIServerSocketFactory)public void setAlwaysCreateRegistry(boolean alwaysCreateRegistry)
デフォルトは "false" です。常に新しいレジストリを作成する場合に、既存のレジストリを見つけるオーバーヘッドを回避するために、このフラグを "true" に切り替えます。
public void setReplaceExistingBinding(boolean replaceExistingBinding)
デフォルトは "true" です。このエクスポーターのサービス名の既存のバインディングが、以前の実行からの偶発的な残りであると想定しています。このようなシナリオでエクスポーターを失敗させるには、これを "false" に切り替えて、バインド済みの RMI オブジェクトがすでに存在することを示します。
public void afterPropertiesSet()
throws java.rmi.RemoteExceptionInitializingBeanBeanFactoryAware、ApplicationContextAware などを満たした後、包含 BeanFactory によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean 内の afterPropertiesSet java.rmi.RemoteExceptionpublic void prepare()
throws java.rmi.RemoteException指定されたポートに RMI レジストリが存在しない場合は作成します。
java.rmi.RemoteException - サービス登録が失敗した場合 protected java.rmi.registry.Registry getRegistry(java.lang.String registryHost,
int registryPort,
@Nullable
java.rmi.server.RMIClientSocketFactory clientSocketFactory,
@Nullable
java.rmi.server.RMIServerSocketFactory serverSocketFactory)
throws java.rmi.RemoteExceptionregistryHost - 使用するレジストリホスト (これが指定されている場合、RMI レジストリの暗黙的な作成は行われません)registryPort - 使用するレジストリポート clientSocketFactory - レジストリの RMI クライアントソケットファクトリ (もしあれば)serverSocketFactory - レジストリの RMI サーバーソケットファクトリ (もしあれば)java.rmi.RemoteException - レジストリを見つけられなかったか、作成できなかった場合 protected java.rmi.registry.Registry getRegistry(int registryPort,
@Nullable
java.rmi.server.RMIClientSocketFactory clientSocketFactory,
@Nullable
java.rmi.server.RMIServerSocketFactory serverSocketFactory)
throws java.rmi.RemoteExceptionregistryPort - 使用するレジストリポート clientSocketFactory - レジストリの RMI クライアントソケットファクトリ (もしあれば)serverSocketFactory - レジストリの RMI サーバーソケットファクトリ (もしあれば)java.rmi.RemoteException - レジストリを見つけられなかったか、作成できなかった場合 protected java.rmi.registry.Registry getRegistry(int registryPort)
throws java.rmi.RemoteExceptionregistryPort - 使用するレジストリポート java.rmi.RemoteException - レジストリを見つけられなかったか、作成できなかった場合 protected void testRegistry(java.rmi.registry.Registry registry)
throws java.rmi.RemoteException デフォルトの実装は Registry.list() を呼び出します。
registry - テストする RMI レジストリ java.rmi.RemoteException - レジストリメソッドによってスローされた場合 Registry.list()public void destroy()
throws java.rmi.RemoteExceptionDisposableBean 内の destroy java.rmi.RemoteException