ホームページ Java &#&チュートリアル Quartz の Job と JobDetail の詳細な分析

Quartz の Job と JobDetail の詳細な分析

Jul 02, 2017 am 10:43 AM
quartz 解析する

以下のエディターは、Quartz の Job と JobDetail の詳細な分析を提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。編集者をフォローして、

Quartzが何に使えるのか見てみましょう?

Quartz はタスク スケジューリング フレームワークです。例えばこんな問題に遭遇したら

毎月25日にクレジットカードの自動返済をしたい

毎年4月1日に憧れの女神に匿名のグリーティングカードを送りたい

1 時間ごとに支払いたいです。ラブ アクション映画の学習ノートをクラウド ディスクにバックアップします。

これらの質問の要約は、次のとおりです。特定の決まった時間に何かをする。また、時間トリガー条件は非常に複雑になる場合があります (毎月の最終営業日の 17:50 など)。これを行うには特別なフレームワークが必要になるほど複雑です。 Quartz はこのようなことを行うためにあります。トリガー条件の定義を与えると、その時点で対応するジョブが動作するようにトリガーされます。

これ以上ナンセンスはありません。コードは素晴らしいです。 。 。

public static void main(String[] args) {
   try { //创建scheduler
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

  //定义一个Trigger
  Trigger trigger =TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") //定义name/group
    .startNow()//一旦加入scheduler,立即生效
    .withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
      .withIntervalInSeconds(1) //每隔一秒执行一次
      .repeatForever()) //一直执行
    .build();
  //定义一个JobDetail
  JobDetail job =JobBuilder.newJob(HelloQuartz.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
    .withIdentity("job1", "group1") //定义name/group
    .usingJobData("name", "quartz") //定义属性
    .build();
  //加入这个调度
  scheduler.scheduleJob(job, trigger);
  //启动之
  scheduler.start();
  //运行一段时间后关闭
   Thread.sleep(10000);
   scheduler.shutdown(true);
  } catch (Exception e) {
  e.printStackTrace();
}

}
ログイン後にコピー

HelloQuartz クラス

public class HelloQuartz implements Job {
  public void execute(JobExecutionContext context) throws JobExecutionException {
    JobDetail detail = context.getJobDetail();
    String name = detail.getJobDataMap().getString("name");
    System.out.println("say hello to " + name + " at " + new Date());
  }
}
ログイン後にコピー


jar パッケージ:

この例は、Quartz の 3 つの最も重要な基本要素をよくカバーしています:

Scheduler: スケジューラー。すべてのスケジュールはそれによって制御されます。

トリガー: トリガー条件を定義します。この例では、そのタイプは SimpleTrigger で、1 秒ごとに実行されます (SimpleTrigger については後で詳しく説明します)。

JobDetail と Job: JobDetail はタスク データを定義し、実際の実行ロジックはジョブ内にあります。この例では、HelloQuartz です。 Job を直接使用するのではなく、JobDetail + Job として設計されているのはなぜですか?これは、スケジューラがジョブを直接使用する場合、タスクが同時に実行される可能性があるため、同じジョブ インスタンスへの同時アクセスの問題が発生する可能性があります。 JobDetail & Jobメソッドでは、スケジューラが実行されるたびにJobDetailを元に新しいJobインスタンスが作成されるため、同時アクセスの問題を回避できます。

スケジューラ

スケジューラはQuartzの頭脳であり、すべてのタスクはそれによって実装されます。

Schduelr には、JobStore と ThreadPool という 2 つの重要なコンポーネントが含まれています。

JobStore には、トリガー、スケジューラー、JobDetail、ビジネス ロックなどの実行時情報が保存されます。 RAMJob (メモリ実装)、JobStoreTX (JDBC、トランザクションは Quartz によって管理)、JobStoreCMT (JDBC、コンテナ トランザクションを使用)、ClusteredJobStore (クラスタ実装)、TerracottaJobStore (Terracotta とは) といった複数の実装があります。

ThreadPool はスレッド プールであり、Quartz には独自のスレッド プール実装があります。すべてのタスクはスレッド プールによって実行されます。

SchedulerFactory

SchdulerFactory は、名前が示すように、Schduler を作成するために使用されます。DirectSchedulerFactory と StdSchdulerFactory の 2 つの実装があります。前者は、コード内で独自の Schduler パラメーターをカスタマイズするために使用できます。後者は、クラスパスの下のquartz.properties設定を直接読み取り(存在しない場合はデフォルト値を使用します)、Schdulerをインスタンス化します。一般的に言えば、StdSchdulerFactory を使用するだけで十分です。

SchdulerFactory 自体は、リモート スケジューラーの管理に使用できる RMI スタブの作成をサポートしています。機能はローカルのスケジューラーと同じであり、ジョブをリモートで送信できます。ご覧のとおり、JobDetail を作成するときに必要なため、JobDetail インスタンスをスケジューラに渡します。実行されたジョブのクラス名は JobDetail に渡されるため、スケジューラは実行するジョブのタイプを認識します。スケジューラがジョブを実行するたびに、そのクラスの新しいインスタンスが作成されてから、execute(...) メソッドが呼び出されます。 ; 実行後、インスタンスへの参照は破棄され、インスタンスはガベージ コレクションされます。この実行戦略の結果の 1 つは、ジョブにパラメーターのない

コンストラクター

が必要になることです (デフォルトの JobFactory を使用する場合)。データ属性はジョブ クラスで定義しないでください。これらの属性の値はジョブの複数の実行にわたって保持されないためです。

では、ジョブ インスタンスに属性や設定を追加するにはどうすればよいでしょうか?ジョブの複数の実行中にジョブのステータスを追跡するにはどうすればよいですか?答えは、JobDataMap、JobDetailオブジェクトの一部です。

JobDataMap

JobDataMap には無制限の (シリアル化された) データ オブジェクトを含めることができ、そのデータはジョブ インスタンスの実行時に使用できます。JobDataMap は Java Map インターフェイスの実装であり、簡単に保存できるようにいくつかのメソッドが追加されています。基本的な型のデータを取得します。

将job加入到scheduler之前,在构建JobDetail时,可以将数据放入JobDataMap,如下示例:

JobDetail job=JobBuilder.newJob(RemindJob.class)
      .withIdentity("job1", "group1")
      .usingJobData("hello", "we are family")
      .build();
ログイン後にコピー

在job的执行过程中,可以从JobDataMap中取出数据,如下示例:

@Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    service.printPlan("你好!");
    JobKey key=context.getJobDetail().getKey();
    
    JobDataMap map = context.getJobDetail().getJobDataMap();
    String string = map.getString("hello");
    System.out.println(key+"==========="+string);
    
    Date date=new Date();
    String time = date.toString();
    System.out.println(time+"job is starting");
  }
ログイン後にコピー

如果你使用的是持久化的存储机制(本教程的JobStore部分会讲到),在决定JobDataMap中存放什么数据的时候需要小心,因为JobDataMap中存储的对象都会被序列化,因此很可能会导致类的版本不一致的问题;Java的标准类型都很安全,如果你已经有了一个类的序列化后的实例,某个时候,别人修改了该类的定义,此时你需要确保对类的修改没有破坏兼容性;更多细节,参考现实中的序列化问题。另外,你也可以配置JDBC-JobStore和JobDataMap,使得map中仅允许存储基本类型和String类型的数据,这样可以避免后续的序列化问题。

如果你在job类中,为JobDataMap中存储的数据的key增加set方法(如在上面示例中,增加setJobSays(String val)方法),那么Quartz的默认JobFactory实现在job被实例化的时候会自动调用这些set方法,这样你就不需要在execute()方法中显式地从map中取数据了。

在Job执行时,JobExecutionContext中的JobDataMap为我们提供了很多的便利。它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集,但是如果存在相同的数据,则后者会覆盖前者的值。

下面的示例,在job执行时,从JobExecutionContext中获取合并后的JobDataMap:

@Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    service.printPlan("你好!");
    JobKey key=context.getJobDetail().getKey();
    
  /*  JobDataMap map = context.getJobDetail().getJobDataMap();
    String string = map.getString("hello");
    System.out.println(key+"==========="+string);*/


     JobDataMap map = context.getMergedJobDataMap();
     String string = map.getString("hello");
     System.out.println(key+"---------------------  "+string);
ログイン後にコピー

以上がQuartz の Job と JobDetail の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTTP ステータス コード 460 の意味と使用法の詳細 HTTP ステータス コード 460 の意味と使用法の詳細 Feb 18, 2024 pm 08:29 PM

HTTP ステータス コード 460 の役割とアプリケーション シナリオの詳細な分析 HTTP ステータス コードは Web 開発の非常に重要な部分であり、クライアントとサーバー間の通信ステータスを示すために使用されます。その中でも、HTTP ステータス コード 460 は比較的特殊なステータス コードであり、この記事ではその役割と適用シナリオを詳しく分析します。 HTTP ステータス コード 460 の定義 HTTP ステータス コード 460 の具体的な定義は「ClientClosedRequest」です。これは、クライアントがリクエストを閉じたことを意味します。このステータス コードは主に次のことを示すために使用されます。

iBatis と MyBatis: 比較と利点の分析 iBatis と MyBatis: 比較と利点の分析 Feb 18, 2024 pm 01:53 PM

iBatis と MyBatis: 違いと利点の分析 はじめに: Java 開発では永続性が一般的な要件であり、iBatis と MyBatis は広く使用されている 2 つの永続性フレームワークです。これらには多くの類似点がありますが、いくつかの重要な違いと利点もあります。この記事では、これら 2 つのフレームワークの機能、使用法、サンプル コードを詳細に分析することで、読者がより包括的に理解できるようにします。 1. iBatis の機能: iBatis は、SQL マッピング ファイルを使用する古い永続性フレームワークです。

Oracle エラー 3114 の詳細な説明: 迅速に解決する方法 Oracle エラー 3114 の詳細な説明: 迅速に解決する方法 Mar 08, 2024 pm 02:42 PM

Oracle エラー 3114 の詳細な説明: 迅速に解決する方法、具体的なコード例が必要です Oracle データベースの開発および管理中に、さまざまなエラーが頻繁に発生しますが、その中でもエラー 3114 は比較的一般的な問題です。エラー 3114 は通常、データベース接続に問題があることを示します。これは、ネットワーク障害、データベース サービスの停止、または不適切な接続文字列設定が原因である可能性があります。この記事では、エラー 3114 の原因とこの問題を迅速に解決する方法を詳しく説明し、特定のコードを添付します

PHPにおけるmidpointの意味と使い方の分析 PHPにおけるmidpointの意味と使い方の分析 Mar 27, 2024 pm 08:57 PM

【PHPにおけるミッドポイントの意味と使い方の分析】 PHPでは、ミッドポイント(.)は2つの文字列やオブジェクトのプロパティやメソッドを接続するためによく使われる演算子です。この記事では、PHP における中間点の意味と使用法を詳しく掘り下げ、具体的なコード例を示して説明します。 1. 文字列中間点演算子の接続 PHP での最も一般的な使用法は、2 つの文字列を接続することです。 2 つの文字列の間に . を置くと、それらをつなぎ合わせて新しい文字列を形成できます。 $string1=&qu

解析ワームホール NTT: あらゆるトークンのオープン フレームワーク 解析ワームホール NTT: あらゆるトークンのオープン フレームワーク Mar 05, 2024 pm 12:46 PM

Wormhole は、ブロックチェーンの相互運用性のリーダーであり、所有権、制御、許可のないイノベーションを優先する、回復力があり、将来性のある分散システムの作成に重点を置いています。このビジョンの基盤は、技術的専門知識、倫理原則、コミュニティの連携への取り組みであり、シンプルさ、明確さ、そして幅広いマルチチェーン ソリューションで相互運用性の状況を再定義します。ゼロ知識証明、スケーリング ソリューション、機能豊富なトークン標準の台頭により、ブロックチェーンはより強力になり、相互運用性の重要性がますます高まっています。この革新的なアプリケーション環境では、新しいガバナンス システムと実用的な機能が、ネットワーク全体の資産に前例のない機会をもたらします。プロトコル構築者は現在、この新たなマルチチェーンでどのように運用するかに取り組んでいます。

Win11の新機能分析:Microsoftアカウントへのログインをスキップする方法 Win11の新機能分析:Microsoftアカウントへのログインをスキップする方法 Mar 27, 2024 pm 05:24 PM

Win11 の新機能の分析: Microsoft アカウントへのログインをスキップする方法 Windows 11 のリリースにより、多くのユーザーは、Windows 11 がより便利で新しい機能をもたらしたことに気づきました。ただし、ユーザーによっては、自分のシステムが Microsoft アカウントに関連付けられることを好まず、この手順をスキップしたい場合があります。この記事では、ユーザーが Windows 11 で Microsoft アカウントへのログインをスキップし、よりプライベートで自律的なエクスペリエンスを実現するのに役立ついくつかの方法を紹介します。まず、一部のユーザーが Microsoft アカウントにログインすることに抵抗がある理由を理解しましょう。一方で、一部のユーザーは次のことを心配しています。

C言語による指数関数の解析とその例 C言語による指数関数の解析とその例 Feb 18, 2024 pm 03:51 PM

C 言語の指数関数の詳細な分析と例 はじめに: 指数関数は一般的な数学関数であり、C 言語で使用できる対応する指数関数ライブラリ関数があります。この記事では、関数プロトタイプ、パラメーター、戻り値などを含む C 言語での指数関数の使用法を詳細に分析し、読者が指数関数をより深く理解し使用できるように、具体的なコード例を示します。テキスト: C 言語の指数関数ライブラリ関数 math.h には、指数関数に関連する関数が多数含まれており、その中で最もよく使用される関数は exp 関数です。 exp関数のプロトタイプは以下のとおりです

Apache2 は PHP ファイルを正しく解析できません Apache2 は PHP ファイルを正しく解析できません Mar 08, 2024 am 11:09 AM

スペースの制限のため、以下は簡単な記事です。Apache2 は一般的に使用されている Web サーバー ソフトウェアであり、PHP は広く使用されているサーバー側スクリプト言語です。 Web サイトを構築する過程で、Apache2 が PHP ファイルを正しく解析できず、PHP コードの実行が失敗するという問題が発生することがあります。この問題は通常、Apache2 が PHP モジュールを正しく構成していないこと、または PHP モジュールが Apache2 のバージョンと互換性がないことが原因で発生します。この問題を解決するには通常 2 つの方法があります。1 つは次のとおりです。

See all articles