[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 メーリングリストの案内