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
, Remote
logger
コンストラクターと説明 |
---|
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, setRemoteInvocationFactory
getServiceUrl, setServiceUrl
getServiceInterface, setServiceInterface
getBeanClassLoader, overrideThreadContextClassLoader, resetThreadContextClassLoader, setBeanClassLoader
public void setLookupStubOnStartup(boolean lookupStubOnStartup)
RMI サーバーの開始を遅らせるためにオフにすることができます。この場合、RMI スタブは最初のアクセスで取得されます。
public void setCacheStub(boolean cacheStub)
RMI サーバーのホットリスタートを可能にするためにオフにすることができます。この場合、呼び出しごとに RMI スタブがフェッチされます。
public void setRefreshStubOnConnectFailure(boolean refreshStubOnConnectFailure)
オンにすると、RMI サーバーのホットリスタートが可能になります。キャッシュされた RMI スタブがリモート接続障害を示す RMI 例外をスローした場合、新しいプロキシがフェッチされ、呼び出しが再試行されます。
ConnectException
、ConnectIOException
、NoSuchObjectException
public void setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)
RMIClientSocketFactory
, LocateRegistry.getRegistry(String, int, RMIClientSocketFactory)
public void afterPropertiesSet()
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
UrlBasedRemoteAccessor
の afterPropertiesSet
public void prepare() throws RemoteLookupFailureException
RemoteLookupFailureException
- 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
、NoSuchObjectException
protected 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