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
SE, RemoteException
SE, HessianServiceExporter
, HttpInvokerServiceExporter
logger
コンストラクターと説明 |
---|
RmiServiceExporter() |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
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, invoke
getRemoteInvocationExecutor, invokeAndCreateResult, setRemoteInvocationExecutor
checkService, checkServiceInterface, getExporterName, getProxyForService, getService, getServiceInterface, setInterceptors, setRegisterTraceInterceptor, setService, setServiceInterface
getBeanClassLoader, overrideThreadContextClassLoader, resetThreadContextClassLoader, setBeanClassLoader
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public 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 RemoteExceptionSE
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
RemoteExceptionSE
public 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 RemoteExceptionSE
DisposableBean
の destroy
RemoteExceptionSE