1

私のアプリケーションは、JBOSS 5.1(Java 6、Spring 3.1)で実行される一連のWebサービスで構成されています。WebサービスコードはDAO関数を呼び出してDBを更新します。パフォーマンス上の理由から、その呼び出しを非同期にします(更新はWebサービスの応答にとって重要ではありません)。ここでの私のオプションは何ですか?

コンセンサスは、スレッドを自分で管理することを避け、アプリサーバーにそれを行わせることであるようです。JBOSS 5.1(Java 6、Spring 3.1)のオプションは何ですか?ある種のJMSソリューション?または、JBOSS ThreadPoolを使用していますか?またはMDB?

4

2 に答える 2

3

JMS(MDBが最も簡単な方法です)は確かに機能します。JavaEE6より下のJava EEプラットフォームを使用している場合、特に必要に応じて実行を調整できるキューイングサポートがあるため、これを行うことをお勧めします。 。さらに、JMSは、ターゲットとするJavaEEのバージョンに関係なく機能し続けます。

また、EJBメソッドの非同期呼び出しにEJBタイマーサービスを悪用しましたが、それは非常に醜いです。

于 2012-11-26T12:42:01.823 に答える
0

JBossで非同期タスクがサポートされていない場合は、DAO呼び出しを処理するためにスプリングスレッドプールを設定するだけです。

    <bean id="myExecutioner" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
      <property name="corePoolSize" value="${executor.ws.poolsize}"/>
      <property name="maxPoolSize" value="${executor.ws.poolsize}"/>
      <property name="keepAliveSeconds" value="120"/>
      <property name="threadNamePrefix" value="WsExecTask-"/>
      <property name="allowCoreThreadTimeOut" value="true"/>        
      <property name="rejectedExecutionHandler" value="#{new java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy()}"/>
   </bean>

次に、Webサービスで、上記で定義したExecutorをワイヤリングし、DAO呼び出しをラップするRunnableオブジェクトをexecute()メソッドに渡します。

このソリューションを使用する場合は、必ずThreadPoolTask​​Executorの説明を読み、リジェクトハンドラーの部分を理解してください。

于 2012-11-26T12:22:28.387 に答える