3

Spring @Async を weblogic workmanager で使用しています。Spring のバージョンは 3.2.2 です。

Web.xml :

<resource-ref>
    <res-ref-name>ReportWorkmanager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

weblogic.xml :

<work-manager>
    <name>ReportWorkmanager</name>
    <fair-share-request-class>
        <name>Priority</name>
        <fair-share>100</fair-share>
    </fair-share-request-class>

    <min-threads-constraint>
        <name>MinThreadCount</name>
        <count>15</count>
    </min-threads-constraint>

    <max-threads-constraint>
        <name>MaxThreadCount</name>
        <count>25</count>
    </max-threads-constraint>

    <work-manager-shutdown-trigger>
        <max-stuck-thread-time>120</max-stuck-thread-time>
        <stuck-thread-count>25</stuck-thread-count>
    </work-manager-shutdown-trigger>
</work-manager>

春の設定xml:

 <bean id="reportWorkManagerTaskExecutor"
    class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
    <property name="workManagerName" value="java:comp/env/ReportWorkmanager" />
</bean>

コントローラー:

@RequestMapping(value = "/publish", method = RequestMethod.POST)
public MarketingScenario publishReport(@RequestBody final PublishReportDTO reportDTO, final HttpServletRequest request) throws Exception {


    reportDTO.setReqUserName(DominoWebUtil.getLoggedInUserName(request));
    reportEngine.publishReport(reportDTO);
    MarketingScenario scenario =  scenarioService.findMarketingScenarioById(reportDTO.getScenarioId());
    _LOGGER.debug("Job submitted , successfully came out for scenario id {}", reportDTO.getScenarioId());
    return scenario;
}

サービス :

@Async(value = "reportWorkManagerTaskExecutor")
public void publishReport(final PublishReportDTO reportDTO) {

    //Some long run job
}

リクエストが fornt end から来るときはいつでも、コントローラはサービス メソッドを呼び出してジョブを開始し、サービス ジョブを待たずにレスポンスを返す必要があります。

@Async が適用されていない場合、すべてが完全に機能しますが、適用すると、リクエスト スレッドが完了したためにサービス スレッドが強制終了されます。

@Async を使用して、リクエスト スレッドから独立したスレッドを作成する方法を教えてください。

その独立したスレッドは、入力に応じて 2 分間または 20 分間実行される場合があります。

4

1 に答える 1

1

まず、Spring のドキュメント@Asyncは、デフォルトのエグゼキュータ以外の場合は@Async("otherExecutor")ではなく で注釈を付ける必要があると述べています@Async(value="otherExecutor")

また、私はあなたがこれで何を意味するのかよく理解していないと思います:

@Async が適用されていない場合、すべてが完全に機能しますが、適用すると、リクエスト スレッドが完了したためにサービス スレッドが強制終了されます。

正常に実行されますが、同じスレッド上で実行されるという意味だと思います。その場合、そのメソッドを同期的に実行しているため、完全に理にかなっています。

于 2016-01-27T16:01:39.137 に答える