public class RmiClientInterceptor extends RemoteInvocationBasedAccessor implements MethodInterceptor
MethodInterceptor。サービス URL は有効な RMIURL である必要があります(例: "rmi://localhost:1099/myservice")。RMI 呼び出し側は RmiInvocationHandler レベルで動作し、サービスに必要なスタブは 1 つだけです。サービスインターフェースは java.rmi.Remote を継承したり、java.rmi.RemoteException をスローしたりする必要はありません。Spring のチェックされていない RemoteAccessException は、リモート呼び出しの失敗時にスローされます。もちろん、入出力パラメーターは直列化可能でなければなりません。
従来の RMI サービスでは、この呼び出しは通常 RMI サービスインターフェースで使用されます。または、この呼び出し側は、リモート RMI サービスを、一致する非 RMI ビジネスインターフェース、つまり RMI サービスメソッドをミラーリングするが RemoteExceptions を宣言しないインターフェースでプロキシすることもできます。後者の場合、RMI スタブによってスローされた RemoteExceptions は、Spring の未チェックの RemoteAccessException に自動的に変換されます。
RmiServiceExporter, RmiProxyFactoryBean, RmiInvocationHandler, RemoteAccessException, RemoteException, Remotelogger| コンストラクターと説明 |
|---|
RmiClientInterceptor() |
| 修飾子と型 | メソッドと説明 |
|---|---|
void | afterPropertiesSet() |
protected java.lang.Object | doInvoke(MethodInvocation invocation, java.rmi.Remote stub) 指定された RMI スタブで指定された呼び出しを実行します。 |
protected java.lang.Object | doInvoke(MethodInvocation methodInvocation, RmiInvocationHandler invocationHandler) 指定された RmiInvocationHandler に指定された AOP メソッド呼び出しを適用します。 |
protected java.rmi.Remote | getStub() 使用する RMI スタブを返します。 |
java.lang.Object | invoke(MethodInvocation invocation)RMI スタブをフェッチし、 doInvoke に委譲します。 |
protected boolean | isConnectFailure(java.rmi.RemoteException ex) 指定された RMI 例外が接続障害を示しているかどうかを判別します。 |
protected java.rmi.Remote | lookupStub() 通常は検索して、RMI スタブを作成します。 |
void | prepare() 必要に応じて、起動時に RMI スタブを取得します。 |
protected java.lang.Object | refreshAndRetry(MethodInvocation invocation)RMI スタブをリフレッシュし、指定された呼び出しを再試行します。 |
void | setCacheStub(boolean cacheStub)RMI スタブが見つかったら、キャッシュするかどうかを設定します。 |
void | setLookupStubOnStartup(boolean lookupStubOnStartup) 起動時に RMI スタブを検索するかどうかを設定します。 |
void | setRefreshStubOnConnectFailure(boolean refreshStubOnConnectFailure) 接続障害時に RMI スタブをリフレッシュするかどうかを設定します。 |
void | setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)RMI レジストリへのアクセスに使用するカスタム RMI クライアントソケットファクトリを設定します。 |
createRemoteInvocation, getRemoteInvocationFactory, recreateRemoteInvocationResult, setRemoteInvocationFactorygetServiceUrl, setServiceUrlgetServiceInterface, setServiceInterfacegetBeanClassLoader, overrideThreadContextClassLoader, resetThreadContextClassLoader, setBeanClassLoaderpublic void setLookupStubOnStartup(boolean lookupStubOnStartup)
RMI サーバーの開始を遅らせるためにオフにすることができます。この場合、RMI スタブは最初のアクセスで取得されます。
public void setCacheStub(boolean cacheStub)
RMI サーバーのホットリスタートを可能にするためにオフにすることができます。この場合、呼び出しごとに RMI スタブがフェッチされます。
public void setRefreshStubOnConnectFailure(boolean refreshStubOnConnectFailure)
オンにすると、RMI サーバーのホットリスタートが可能になります。キャッシュされた RMI スタブがリモート接続障害を示す RMI 例外をスローした場合、新しいプロキシがフェッチされ、呼び出しが再試行されます。
ConnectException、ConnectIOException、NoSuchObjectExceptionpublic void setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)
RMIClientSocketFactory, LocateRegistry.getRegistry(String, int, RMIClientSocketFactory)public void afterPropertiesSet()
InitializingBeanBeanFactoryAware、ApplicationContextAware などを満たした後、包含 BeanFactory によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean 内の afterPropertiesSet UrlBasedRemoteAccessor の afterPropertiesSet public void prepare()
throws RemoteLookupFailureExceptionRemoteLookupFailureException - RMI スタブの作成が失敗した場合 setLookupStubOnStartup(boolean), lookupStub()protected java.rmi.Remote lookupStub()
throws RemoteLookupFailureException "cacheStub" が "true" の場合はインターセプターの初期化時に呼び出され、それ以外の場合は getStub() による各呼び出しごとに呼び出されます。
デフォルトの実装では、java.rmi.Naming を介してサービス URL を検索します。これはサブクラスでオーバーライドできます。
RemoteLookupFailureException - RMI スタブの作成が失敗した場合 setCacheStub(boolean), Naming.lookup(java.lang.String)protected java.rmi.Remote getStub()
throws RemoteLookupFailureException デフォルトの実装は、初期化時に作成されたスタブを返します(存在する場合)。それ以外の場合は、lookupStub() を呼び出して、呼び出しごとに新しいスタブを取得します。これは、サブクラスでオーバーライドできます。たとえば、スタブを再作成する前に一定の時間キャッシュするため、またはスタブがまだ生きているかどうかをテストするためです。
RemoteLookupFailureException - RMI スタブの作成が失敗した場合 lookupStub()public java.lang.Object invoke(MethodInvocation invocation) throws java.lang.Throwable
doInvoke に委譲します。接続障害時にリフレッシュするように構成されている場合、対応する RMI 例外で refreshAndRetry(org.aopalliance.intercept.MethodInvocation) を呼び出します。MethodInterceptor 内の invoke invocation - メソッド呼び出しジョインポイント Joinpoint.proceed() の呼び出しの結果。インターセプターによってインターセプトされる可能性があります java.lang.Throwable - インターセプターまたはターゲットオブジェクトが例外をスローする場合 getStub(), doInvoke(MethodInvocation, Remote), refreshAndRetry(org.aopalliance.intercept.MethodInvocation), ConnectException、ConnectIOException、NoSuchObjectExceptionprotected boolean isConnectFailure(java.rmi.RemoteException ex)
デフォルトの実装は RmiClientInterceptorUtils.isConnectFailure(java.rmi.RemoteException) に委譲します。
ex - 確認する RMI 例外 @Nullable protected java.lang.Object refreshAndRetry(MethodInvocation invocation) throws java.lang.Throwable
invocation - AOP メソッドの呼び出し java.lang.Throwable - 呼び出しが失敗した場合 invoke(org.aopalliance.intercept.MethodInvocation)@Nullable protected java.lang.Object doInvoke(MethodInvocation invocation, java.rmi.Remote stub) throws java.lang.Throwable
invocation - AOP メソッドの呼び出し stub - 呼び出す RMI スタブ java.lang.Throwable - 呼び出しが失敗した場合 @Nullable protected java.lang.Object doInvoke(MethodInvocation methodInvocation, RmiInvocationHandler invocationHandler) throws java.rmi.RemoteException, java.lang.NoSuchMethodException, java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
RmiInvocationHandler に指定された AOP メソッド呼び出しを適用します。 デフォルトの実装は RemoteInvocationBasedAccessor.createRemoteInvocation(org.aopalliance.intercept.MethodInvocation) に委譲します。
methodInvocation - 現在の AOP メソッドの呼び出し invocationHandler - 呼び出しを適用する RmiInvocationHandlerjava.rmi.RemoteException - 通信エラーの場合 java.lang.NoSuchMethodException - メソッド名を解決できなかった場合 java.lang.IllegalAccessException - メソッドにアクセスできなかった場合 java.lang.reflect.InvocationTargetException - メソッド呼び出しにより例外が発生した場合 RemoteInvocation