ディレクトリ
2、タスクScheduledExecutorServiceに基づくタイミング
タイミングタスクタイマーに基づいて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オペレーティング結果