@@ -27,72 +27,86 @@ namespace examples::jobs_engine {
27
27
};
28
28
29
29
using Request = std::pair<int , std::string>;
30
- using JobsEng = small::jobs_engine<JobsType, Request, int , JobsGroupType>;
31
-
32
- JobsEng jobs (
33
- {.threads_count = 0 /* dont start any thread yet*/ }, // overall config with default priorities
34
- {.threads_count = 1 , .bulk_count = 1 }, // default jobs group config
35
- {.group = JobsGroupType::kJobsGroup1 }, // default jobs type config
36
- [](auto &j /* this*/ , const auto &items) {
37
- for (auto &item : items) {
38
- std::cout << " thread " << std::this_thread::get_id ()
39
- << " DEFAULT processing "
40
- << " {"
41
- << " type=" << (int )item->type
42
- << " req.int=" << item->request .first << " ,"
43
- << " req.str=\" " << item->request .second << " \" "
44
- << " }"
45
- << " time " << small::toISOString (small::timeNow ())
46
- << " \n " ;
47
- }
48
- small::sleep (30 );
49
- });
50
-
51
- jobs.add_jobs_group (JobsGroupType::kJobsGroup1 , {.threads_count = 1 });
52
-
53
- // add specific function for job1
54
- jobs.add_jobs_type (JobsType::kJobsType1 , {.group = JobsGroupType::kJobsGroup1 }, [](auto &j /* this*/ , const auto &items, auto b /* extra param b*/ ) {
55
- // process item using the jobs lock (not recommended)
56
- {
57
- std::unique_lock mlock ( j );
58
- for (auto &item : items) {
59
- std::cout << " thread " << std::this_thread::get_id ()
60
- << " JOB1 processing "
61
- << " {"
62
- << " type=" << (int )item->type
63
- << " req.int=" << item->request .first << " ,"
64
- << " req.str=\" " << item->request .second << " \" "
65
- << " }"
66
- << " time " << small::toISOString (small::timeNow ())
67
- << " \n " ;
68
- }
69
- }
70
- small::sleep (30 ); }, 5 /* param b*/ );
30
+ using JobsEng = small::jobs_engine<JobsType, Request, int /* response*/ , JobsGroupType>;
31
+
32
+ auto jobs_processing_function = [](const std::vector<std::shared_ptr<JobsEng::JobsItem>> &items) {
33
+ // this functions is defined without the engine params (it is here just for the example)
34
+ std::cout << " this function is defined without the engine params, called for " << (int )items[0 ]->type << " \n " ;
35
+ };
71
36
72
- // use default config and default function for job2
73
- jobs.add_jobs_type (JobsType::kJobsType2 );
37
+ JobsEng::JobsConfig config{
38
+ .m_engine = {.m_threads_count = 0 /* dont start any thread yet*/ ,
39
+ .m_config_prio = {.priorities = {{small::EnumPriorities::kHighest , 2 },
40
+ {small::EnumPriorities::kHigh , 2 },
41
+ {small::EnumPriorities::kNormal , 2 },
42
+ {small::EnumPriorities::kLow , 1 }}}}, // overall config with default priorities
43
+ .m_default_processing_function = jobs_processing_function, // default processing function, better use jobs.add_default_processing_function to set it
44
+ .m_groups = {
45
+ {JobsGroupType::kJobsGroup1 , {.m_threads_count = 1 }}}, // config by jobs group
46
+ .m_types = {
47
+ {JobsType::kJobsType1 , {.m_group = JobsGroupType::kJobsGroup1 }},
48
+ {JobsType::kJobsType2 , {.m_group = JobsGroupType::kJobsGroup1 }},
49
+ }};
50
+
51
+ // create jobs engine
52
+ JobsEng jobs (config);
53
+
54
+ jobs.add_default_processing_function ([](auto &j /* this jobs engine*/ , const auto &jobs_items) {
55
+ for (auto &item : jobs_items) {
56
+ std::cout << " thread " << std::this_thread::get_id ()
57
+ << " DEFAULT processing "
58
+ << " {"
59
+ << " type=" << (int )item->type
60
+ << " req.int=" << item->request .first << " ,"
61
+ << " req.str=\" " << item->request .second << " \" "
62
+ << " }"
63
+ << " ref count " << item.use_count ()
64
+ << " time " << small::toISOString (small::timeNow ())
65
+ << " \n " ;
66
+ }
67
+ small::sleep (30 );
68
+ });
69
+
70
+ // add specific function for job1 (calling the function from jobs intead of config allows to pass the engine and extra param)
71
+ jobs.add_job_processing_function (JobsType::kJobsType1 , [](auto &j /* this jobs engine*/ , const auto &jobs_items, auto b /* extra param b*/ ) {
72
+ for (auto &item : jobs_items) {
73
+ std::cout << " thread " << std::this_thread::get_id ()
74
+ << " JOB1 processing "
75
+ << " {"
76
+ << " type=" << (int )item->type
77
+ << " req.int=" << item->request .first << " ,"
78
+ << " req.str=\" " << item->request .second << " \" "
79
+ << " }"
80
+ << " ref count " << item.use_count ()
81
+ << " time " << small::toISOString (small::timeNow ())
82
+ << " \n " ;
83
+ }
84
+ small::sleep (30 ); }, 5 /* param b*/ );
74
85
75
86
JobsEng::JobsID jobs_id{};
76
87
std::vector<JobsEng::JobsID> jobs_ids;
77
88
78
89
// push
79
- jobs.push_back (small::EnumPriorities::kNormal , JobsType::kJobsType1 , {1 , " normal" }, &jobs_id);
80
- jobs.push_back (small::EnumPriorities::kHigh , JobsType::kJobsType2 , {2 , " high" }, &jobs_id);
90
+ jobs.queue (). push_back (small::EnumPriorities::kNormal , JobsType::kJobsType1 , {1 , " normal" }, &jobs_id);
91
+ jobs.queue (). push_back (small::EnumPriorities::kHigh , JobsType::kJobsType2 , {2 , " high" }, &jobs_id);
81
92
82
- jobs.push_back (small::EnumPriorities::kNormal , JobsType::kJobsType1 , std::make_pair (3 , " normal" ), &jobs_id);
83
- jobs.push_back (small::EnumPriorities::kHigh , {. type = JobsType::kJobsType1 , . request = {4 , " high" } }, &jobs_id);
84
- jobs.push_back (small::EnumPriorities::kLow , JobsType::kJobsType1 , {5 , " low" }, &jobs_id);
93
+ jobs.queue (). push_back (small::EnumPriorities::kNormal , JobsType::kJobsType1 , std::make_pair (3 , " normal" ), &jobs_id);
94
+ jobs.queue (). push_back (small::EnumPriorities::kHigh , JobsType::kJobsType1 , {4 , " high" }, &jobs_id);
95
+ jobs.queue (). push_back (small::EnumPriorities::kLow , JobsType::kJobsType1 , {5 , " low" }, &jobs_id);
85
96
86
97
Request req = {6 , " normal" };
87
- jobs.push_back (small::EnumPriorities::kNormal , {. type = JobsType::kJobsType1 , . request = req} , nullptr );
98
+ jobs.queue (). push_back (small::EnumPriorities::kNormal , JobsType::kJobsType1 , req, nullptr );
88
99
89
- std::vector<JobsEng::JobsItem> jobs_items = {{.type = JobsType::kJobsType1 , .request = {7 , " highest" }}};
90
- jobs.push_back (small::EnumPriorities::kHighest , jobs_items, &jobs_ids);
91
- jobs.push_back (small::EnumPriorities::kHighest , {{.type = JobsType::kJobsType1 , .request = {8 , " highest" }}}, &jobs_ids);
100
+ std::vector<std::shared_ptr<JobsEng::JobsItem>> jobs_items = {
101
+ std::make_shared<JobsEng::JobsItem>(JobsType::kJobsType1 , Request{7 , " highest" }),
102
+ std::make_shared<JobsEng::JobsItem>(JobsType::kJobsType1 , Request{8 , " highest" }),
103
+ };
104
+ jobs.queue ().push_back (small::EnumPriorities::kHighest , jobs_items, &jobs_ids);
105
+ jobs.queue ().push_back (small::EnumPriorities::kHighest , {std::make_shared<JobsEng::JobsItem>(JobsType::kJobsType1 , Request{9 , " highest" })}, &jobs_ids);
92
106
93
- jobs.push_back_delay_for (std::chrono::milliseconds (300 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {100 , " delay normal" }, &jobs_id);
94
- jobs.push_back_delay_until (small::timeNow () + std::chrono::milliseconds (350 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {101 , " delay normal" }, &jobs_id);
95
- jobs.push_back_delay_for (std::chrono::milliseconds (400 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {102 , " delay normal" }, &jobs_id);
107
+ jobs.queue (). push_back_delay_for (std::chrono::milliseconds (300 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {100 , " delay normal" }, &jobs_id);
108
+ jobs.queue (). push_back_delay_until (small::timeNow () + std::chrono::milliseconds (350 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {101 , " delay normal" }, &jobs_id);
109
+ jobs.queue (). push_back_delay_for (std::chrono::milliseconds (400 ), small::EnumPriorities::kNormal , JobsType::kJobsType1 , {102 , " delay normal" }, &jobs_id);
96
110
97
111
jobs.start_threads (3 ); // manual start threads
98
112
@@ -102,6 +116,8 @@ namespace examples::jobs_engine {
102
116
std::cout << " wait for with timeout, ret = " << static_cast <int >(ret) << " as timeout\n " ;
103
117
jobs.wait (); // wait here for jobs to finish due to exit flag
104
118
119
+ std::cout << " size = " << jobs.size () << " \n " ;
120
+
105
121
std::cout << " Jobs Engine example 1 finish\n\n " ;
106
122
107
123
return 0 ;
0 commit comments