Workflow** 框架中,序列(SeriesWork) 是一组任务的执行顺序,任务按顺序执行,前一个任务完成后才会执行下一个任务。以下是创建和使用序列的步骤:
1. 创建序列
序列可以通过 series_of(task)
获取当前任务所在的序列,或者通过 Workflow::create_series_work()
手动创建。
cpp
// 创建一个任务
WFRedisTask *task = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379", 2, callback);
// 获取任务所在的序列
SeriesWork *series = series_of(task);
2. 向序列中添加任务
可以通过 series->push_back(task)
将任务添加到序列的末尾。
cpp
WFRedisTask *task2 = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379", 2, callback2); series->push_back(task2);
3. 启动序列
序列会自动启动,只要序列中的第一个任务被启动,整个序列就会按顺序执行。
cpp
task->start(); // 启动序列中的第一个任务
4. 示例代码
以下是一个完整的示例,展示如何创建和使用序列:
#include <workflow/Workflow.h>
#include <workflow/WFTaskFactory.h>
#include <workflow/WFFacilities.h>
#include <iostream>
#include <signal.h>
using namespace std;
WFFacilities::WaitGroup waitgroup(1); // 1个任务组
void signalfunc(int signo)
{
waitgroup.done(); // 结束一个任务
cout << "done\n";
}
void callback(WFRedisTask *task)
{
int state = task->get_state();
int error = task->get_error();
switch (state)
{
case WFT_STATE_DNS_ERROR:
cout << strerror(error) << endl;
break;
case WFT_STATE_SUCCESS:
cout << "ok" << endl;
break;
default:
cout << "other" << endl;
}
protocol::RedisResponse *resp = task->get_resp();
protocol::RedisValue value;
resp->get_result(value);
if (value.is_string() && value.string_value() == "001")
{
// 创建第二个任务
WFRedisTask *task2 = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379", 2, callback2);
protocol::RedisRequest *req2 = task2->get_req();
req2->set_request("set", {"002", "34"});
// 获取当前任务的序列,并添加第二个任务
SeriesWork *series = series_of(task);
series->push_back(task2);
}
}
void callback2(WFRedisTask *task)
{
int state = task->get_state();
int error = task->get_error();
switch (state)
{
case WFT_STATE_DNS_ERROR:
cout << strerror(error) << endl;
break;
case WFT_STATE_SUCCESS:
cout << "ok" << endl;
break;
default:
cout << "other" << endl;
}
}
int main()
{
signal(SIGINT, signalfunc);
// 创建第一个任务
WFRedisTask *task = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379", 2, callback);
protocol::RedisRequest *req = task->get_req();
req->set_request("get", {"1"});
// 启动任务(序列会自动启动)
task->start();
// 等待任务完成
waitgroup.wait();
}
5. 关键点总结
- 序列的创建:通过
series_of(task)
获取当前任务的序列,或者手动创建。 - 任务添加:使用
series->push_back(task)
将任务添加到序列末尾。 - 序列启动:序列中的第一个任务启动后,整个序列会自动按顺序执行。
- 任务依赖:序列中的任务按顺序执行,前一个任务完成后才会执行下一个任务。
通过以上方法,你可以在 Workflow 框架中轻松创建和管理任务序列