SpringBoot2バックエンドプロジェクト - 定期的なタスクの例

ディレクトリ

タイミングタスクタイマーに基づいて1、

1.1はじめに

1.2例

1.3フロントエンド要求

 1.4コントローラ層

1.5サービス層

 1.6結果

2、タスクScheduledExecutorServiceに基づくタイミング

2.1はじめに

2.2例

2.3サービス層

2.4スレッドの例外印刷ログ

2.5オペレーティング結果

改善するための3、

3.1スレッドプールの設定クラス

3.2非同期タスクマネージャ

3.3サービス層

3.4オペレーティング結果


タイミングタスクタイマーに基づいて1、

1.1はじめに

JDK1.5を使用する前にタスクを完了するためにタイマータイマーであり、そこで定期的にタスクを実行するための単一のスレッドは、したがって、以下のような問題点:

  • 複数のタスク間の相互作用(限り1は、例外をキャッチしないよう、他のタスクが自動的に終了します)
  • マルチタスクは、非効率的であるシリアル

1.2例

POSTリクエストは、郵便配達を使用して送信:ローカルホスト:8888 / ruoyi /ログイン、リクエスト・パラメータ:ユーザー名、パスワード、認証コード、UUID

コントローラ層は、要求を受信し、プロセスの要求は、サービス層を呼び出します

2層sercieのタスクの開始時期

タスクがされ、ユーザー名、パスワード、認証コードおよびスレッド名とUUIDを印刷するには3秒遅れ

別のタスクがされた1つの1秒の印刷時間の秒間隔と現在のスレッド名を遅らせ

1.3フロントエンド要求

 1.4コントローラ層

package com.ruoyi.project.system.controller;
/**
 * 登录验证
 *
 * @author ruoyi
 */
@RestController
public class SysLoginController {

    @Resource
    private SysLoginService loginService;

    @PostMapping("/login")
    public AjaxResult login(String username, String password, String code, String uuid) {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(username, password, code, uuid);
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }

}

1.5サービス層

 1.6結果

2、タスクScheduledExecutorServiceに基づくタイミング

2.1はじめに

ScheduledExecutorServiceはJDK1.5が互いに独立してスレッド間で、マルチスレッドに基づいて、表示されています

2.2例

前の例では、我々は、タイマータスクはタイマーによって達成ことが判明したタスクが処理されない中に発生する限り、例外があるとして、他のタスクが終了します!

この例では、この問題を解決します。

2.3サービス層

同じコードのコントローラの要求と遠位の層はここでは繰り返しません

2.4スレッドの例外印刷ログ

package com.ruoyi.common.utils;
/**
 * 线程相关工具类.
 *
 * @author ruoyi
 */
public class Threads {

    private static final Logger logger = LoggerFactory.getLogger(Threads.class);


    /**
     * 打印线程异常信息
     */
    public static void printException(Runnable r, Throwable t) {
        if (t == null && r instanceof Future<?>) {
            try {
                Future<?> future = (Future<?>) r;
                if (future.isDone()) {
                    future.get();
                }
            } catch (CancellationException ce) {
                t = ce;
            } catch (ExecutionException ee) {
                t = ee.getCause();
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
            }
        }
        if (t != null) {
            logger.error(t.getMessage(), t);
        }
    }

}

2.5オペレーティング結果

改善するための3、

ScheduledExecutorService新しいオブジェクトが出ている場合には、これは良いコーディングではありません!

①、ScheduledExecutorServiceオブジェクトはSpringコンテナ管理によって完成されなければなりません。

②、ScheduledExecutorServiceは、単一の実施形態を作るための非同期タスクマネージャをカプセル化すべき

3.1スレッドプールの設定クラス

コンフィギュレーションクラスは、オブジェクトは、SpringコンテナScheduledExecutorServiceに注入されます

package com.ruoyi.framework.config;
/**
 * 线程池配置
 *
 * @author ruoyi
 **/
@Configuration
public class ThreadPoolConfig {
    // 核心线程池大小
    private int corePoolSize = 50;

    /**
     * 执行周期性或定时任务
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }

}

3.2非同期タスクマネージャ

package com.ruoyi.framework.manager;
/**
 * 异步任务管理器
 *
 * @author ruoyi
 */
public class AsyncManager {

    /**
     * 操作延迟10毫秒
     */
    private final int OPERATE_DELAY_TIME = 10;

    /**
     * 异步操作任务调度线程池
     */
    private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");

    /**
     * 单例模式
     */
    private AsyncManager() {
    }

    private static AsyncManager me = new AsyncManager();

    public static AsyncManager me() {
        return me;
    }

    /**
     * 执行任务
     *
     * @param task 任务
     */
    public void execute(TimerTask task) {
        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
    }

}


3.3サービス層

コントローラコード不変と遠位層

3.4オペレーティング結果

 

公開された98元の記事 ウォンの賞賛8 ビュー10000 +

おすすめ

転載: blog.csdn.net/u010559460/article/details/104882540