Flutter定时任务管理插件mongo_cron的使用

Flutter定时任务管理插件mongo_cron的使用

MongoCron 是一个基于 MongoDB 的定时任务调度器,适用于 Dart 开发者。它允许你使用 cron 表达式来安排任务,并将这些任务持久化到 MongoDB 中。

特性

  • 使用 cron 表达式来调度任务(如果你不熟悉 cron 表达式,可以使用 Cronitor 来帮助理解)
  • 将任务持久化到 MongoDB
  • 提供各种 cron 事件的回调(启动、停止、空闲、错误)

处理速度

当越来越多的文档被添加到集合中时,处理速度可能会降低。我们可以通过创建以下索引来保持速度:

await _collection.createIndex(key: 'name', unique: true);
await _collection.createIndex(keys: {'sleepUntil': 1, 'name': 1});

使用方法

你可以查看 示例代码 获取完整的示例。

import 'package:mongo_cron/mongo_cron.dart';
import 'package:mongo_dart/mongo_dart.dart';

void main() async {
  // 连接到本地 MongoDB 数据库
  final db = await Db.create('mongodb://localhost:27017/your_database');
  await db.open();

  // 配置 MongoCron 实例
  final config = MongoCronConfig(
    database: db,
    onStart: (MongoCron cron) async {
      print('MongoCron started');
    },
    onStop: (MongoCron cron) async {
      print('MongoCron stopped');
    },
    onIdle: (MongoCron cron) async {
      print('MongoCron is idle');
    },
    onError: (dynamic error, MongoCron cron) async {
      print('Error occurred: $error');
      if (!db.isConnected) {
        print('MongoDB disconnected—reconnecting...');
        await db.close();
        await db.open();
        print('MongoDB reconnected');
      }
    },
    onJobStart: (Job job) async {
      print(
          '${DateTime.now().toIso8601String()} Job started: ${job.name} #${job.id}');
    },
    onJobComplete: (Job job) async {
      print(
          '${DateTime.now().toIso8601String()} Job complete: ${job.name} #${job.id}');
    },
  );

  // 创建并配置 MongoCron 实例
  final mongoCron = MongoCron(config);

  // 添加一个任务
  await mongoCron.addJob(
    cronExpression: '*/5 * * * *', // 每 5 分钟执行一次
    name: 'job1',
    handler: (Job job) async {
      print('Executing job ${job.id} with data: ${job.data}');
    },
    jobData: {'message': 'Hello, World!'}, // 传递给任务的数据
  );

  // 启动 Cron
  await mongoCron.start();

  // 在运行过程中可以添加更多任务
  await mongoCron.addJob(
    cronExpression: '* * * * *', // 每分钟执行一次
    name: 'job2',
    handler: (Job job) async {
      print('Second job');
    },
  );

  // 运行一段时间
  await Future.delayed(const Duration(seconds: 30));

  // 停止 Cron
  await mongoCron.stop();
  await db.close();
}

代码解释

  1. 连接到 MongoDB 数据库

    final db = await Db.create('mongodb://localhost:27017/your_database');
    await db.open();
    

    这里我们创建并打开了一个 MongoDB 数据库实例。

  2. 配置 MongoCron 实例

    final config = MongoCronConfig(
      database: db,
      onStart: (MongoCron cron) async {
        print('MongoCron started');
      },
      onStop: (MongoCron cron) async {
        print('MongoCron stopped');
      },
      onIdle: (MongoCron cron) async {
        print('MongoCron is idle');
      },
      onError: (dynamic error, MongoCron cron) async {
        print('Error occurred: $error');
        if (!db.isConnected) {
          print('MongoDB disconnected—reconnecting...');
          await db.close();
          await db.open();
          print('MongoDB reconnected');
        }
      },
      onJobStart: (Job job) async {
        print(
            '${DateTime.now().toIso8601String()} Job started: ${job.name} #${job.id}');
      },
      onJobComplete: (Job job) async {
        print(
            '${DateTime.now().toIso8601String()} Job complete: ${job.name} #${job.id}');
      },
    );
    

    这里我们配置了 MongoCron 实例,定义了启动、停止、空闲和错误时的回调函数。

  3. 创建并配置 MongoCron 实例

    final mongoCron = MongoCron(config);
    
  4. 添加任务

    await mongoCron.addJob(
      cronExpression: '*/5 * * * *', // 每 5 分钟执行一次
      name: 'job1',
      handler: (Job job) async {
        print('Executing job ${job.id} with data: ${job.data}');
      },
      jobData: {'message': 'Hello, World!'}, // 传递给任务的数据
    );
    

    我们添加了一个任务,并设置了 cron 表达式、任务名称和处理函数。

  5. 启动 Cron

    await mongoCron.start();
    
  6. 在运行过程中添加更多任务

    await mongoCron.addJob(
      cronExpression: '* * * * *', // 每分钟执行一次
      name: 'job2',
      handler: (Job job) async {
        print('Second job');
      },
    );
    
  7. 运行一段时间后停止 Cron

    await Future.delayed(const Duration(seconds: 30));
    await mongoCron.stop();
    await db.close();
    

更多关于Flutter定时任务管理插件mongo_cron的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter定时任务管理插件mongo_cron的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mongo_cron 是一个用于在 Flutter 应用中管理定时任务的插件,它基于 MongoDB 的 TTL(Time-To-Live)索引和 change streams 功能来实现定时任务的调度和执行。通过 mongo_cron,你可以轻松地在 Flutter 应用中创建、管理和执行定时任务。

安装 mongo_cron

首先,你需要在 pubspec.yaml 文件中添加 mongo_cron 作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  mongo_cron: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

使用 mongo_cron

1. 初始化 MongoDB 连接

在使用 mongo_cron 之前,你需要先连接到 MongoDB 数据库。你可以使用 mongo_dart 或其他 MongoDB 客户端库来建立连接。

import 'package:mongo_dart/mongo_dart.dart';

final db = await Db.create('mongodb://localhost:27017/mydatabase');
await db.open();

2. 创建 MongoCron 实例

接下来,你需要创建一个 MongoCron 实例,并传入 MongoDB 数据库连接。

import 'package:mongo_cron/mongo_cron.dart';

final mongoCron = MongoCron(db);

3. 添加定时任务

你可以使用 mongoCron.addJob 方法来添加定时任务。每个任务都需要指定一个唯一的 jobId、一个 cron 表达式(用于定义任务的执行时间)以及一个回调函数(在任务执行时调用)。

mongoCron.addJob(
  jobId: 'myJob',
  cron: '*/5 * * * * *',  // 每5秒执行一次
  callback: () {
    print('Job executed at ${DateTime.now()}');
  },
);

4. 启动定时任务管理器

添加任务后,你需要启动 mongoCron 来开始执行定时任务。

mongoCron.start();

5. 停止定时任务管理器

当你不再需要执行定时任务时,可以调用 mongoCron.stop() 来停止任务管理器。

mongoCron.stop();

6. 删除定时任务

如果你想要删除某个定时任务,可以使用 mongoCron.removeJob 方法。

mongoCron.removeJob('myJob');

完整示例

以下是一个完整的示例,展示了如何使用 mongo_cron 在 Flutter 应用中管理定时任务:

import 'package:flutter/material.dart';
import 'package:mongo_dart/mongo_dart.dart';
import 'package:mongo_cron/mongo_cron.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final db = await Db.create('mongodb://localhost:27017/mydatabase');
  await db.open();

  final mongoCron = MongoCron(db);

  mongoCron.addJob(
    jobId: 'myJob',
    cron: '*/5 * * * * *',  // 每5秒执行一次
    callback: () {
      print('Job executed at ${DateTime.now()}');
    },
  );

  mongoCron.start();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MongoCron Example'),
        ),
        body: Center(
          child: Text('Check the console for job execution logs.'),
        ),
      ),
    );
  }
}
回到顶部