[Seasar-user:4560] 同じクラスに異なるAOPを適応してコンポーネント化する方法
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2006年 9月 6日 (水) 23:10:50 JST
関です。
いつもお世話になっております。
今回はdicon の設定方法についてお聞きしたいです。
■質問1
Tomcat上で同じクラスのコンポーネントを3つ作成し、
それぞれに異なるAOPを適応するには、diconにどのように記述すればよいのでしょうか?
■質問2
元々は、サーバー構成を以下のようにすると
[Client] → [ServerA] → [ServerB01,ServerB02,ServerB03]
(メンテナンス上の理由から[ServerB01,ServerB02,ServerB03]は
IPアドレスが違うだけの全く同じSoapServiceが動作するサーバーです)
[Client]から[ServerA]に重い処理(大量のDTOを処理する等)を任せると、
[ServerA]が自動的に処理を[ServerB01,ServerB02,ServerB03]へと
振り分けたいと考えています。
そもそもそのような挙動を実装することは可能でしょうか?
なんだかちょっとしたことで出来そうな気もするのですが
思いつく方法がありましたら教えてください。
よろしくお願い致します。
■参考−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
長文になってしまってすみませんが、私の方でやってみた事をお送りします。
コチラも気づくところがあればアドバイスください。
上記の機能を実装するために [Client] から [ServerA] の SoapService を
利用するのですが [ServerA] の SoapService 中で [ServerB01,ServerB02,ServerB03] を
コンポーネント化しておき[ServerA] で自動的に切り替えて処理を振り分けたいと考えました。
そのための設定として、Deploy.dicon に以下の様な登録をいたしましたところ
実行時にエラーとなり、構成が誤っているだろうことは理解しています。
■[ServerA]のDeploy.dicon
<!-- AXISのための設定 -->
<component name="HogeService" class="jp.example.service.HogeServiceImpl">
<meta name="axis-service"/>
</component>
<!-- [ServerB]を呼び出したいための設定 -->
<component name="ChildService01" class="jp.example.service.HogeServiceImpl">
<aspect>work01.ioRemoting</aspect> <!-- IPが違うので、異なるaxisclientの設定を適応 -->
</component>
<component name="ChildService02" class="jp.example.service.HogeServiceImpl">
<aspect>work02.ioRemoting</aspect> <!-- IPが違うので、異なるaxisclientの設定を適応 -->
</component>
<component name="ChildService03" class="jp.example.service.HogeServiceImpl">
<aspect>work03.ioRemoting</aspect> <!-- IPが違うので、異なるaxisclientの設定を適応 -->
</component>
■[ServerA]の[HogeServiceImpl]の抜粋
public class HogeServiceImpl implements HogeService, Runnable {
public boolean bigProcessRun(BigDto dto){
S2Container container = S2ContainerServlet.getContainer();
HogeServiceImpl service1 = (HogeServiceImpl) container.getComponent("ChildService01");
HogeServiceImpl service2 = (HogeServiceImpl) container.getComponent("ChildService02");
HogeServiceImpl service3 = (HogeServiceImpl) container.getComponent("ChildService03");
service1.setDto(dto); // 処理対象を渡しておく
service2.setDto(dto);
service3.setDto(dto);
service1.start(); // スレッドで実行する
service2.start();
service3.start();
service1.join(); // 同期をとるためにそれぞれ待つ
service2.join();
service3.join();
return true;
}
}
■ 同じクラスをコンポーネント化しているので、発生する実行時エラー
Caused by: org.apache.axis2.AxisFault: org.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]class HogeServiceImplに複数のコンポーネント(HogeServiceImpl, HogeServiceImpl, HogeServiceImpl, HogeServiceImpl)が登録されています
at org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.java:287)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:457)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:399)
at org.seasar.remoting.axis2.connector.AxisInOutConnector.execute(AxisInOutConnector.java:42)
at org.seasar.remoting.axis2.connector.AbstractAxisConnector.invoke(AbstractAxisConnector.java:107)
at org.seasar.remoting.common.connector.impl.TargetSpecificURLBasedConnector.invoke(TargetSpecificURLBasedConnector.java:105)
at org.seasar.remoting.common.interceptor.RemotingInterceptor.invoke(RemotingInterceptor.java:84)
at HogehogeMultiImplMulti$$EnhancedByS2AOP$$5585dc$$MethodInvocation$$echoService0.proceed(MethodInvocationClassGenerator.java)
Seasar-user メーリングリストの案内