官方的DEMO如下:
http://gearman.info/libgearman/examples.html
闲言少述,直接上源码:
client
worker
http://gearman.info/libgearman/examples.html
闲言少述,直接上源码:
client
- /*
- * File:
- * simple-gearman-client.cpp
- * Auth:
- * Hank(hongkuiyan@yeah.net)
- * Desc:
- * Example code to show how to send a string to a function called "test_function" .
- * Cypt:
- * Gearman server and library Version 1.1.12
- * Compile:
- * gcc -o simple-gearman-client simple-gearman-client.cpp -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman
- * Usage:
- * ./simple-gearman-client
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <libgearman/gearman.h>
- using namespace std;
- int main(int argc, char* argv[])
- {
- gearman_return_t gearRet;
- gearman_client_st* gearClient;
-
- char* gearSvrHost=(char*)"10.10.13.8", *gearSvrPort=(char*)"4730";
- gearClient = gearman_client_create(NULL);
- gearman_client_set_options(gearClient, GEARMAN_CLIENT_FREE_TASKS);
- gearman_client_set_timeout(gearClient, 15000);
- gearRet = gearman_client_add_server(gearClient, gearSvrHost, atoi(gearSvrPort));
- if (gearman_failed(gearRet))
- {
- return EXIT_FAILURE;
- }
- #if 1
-
- for (int i=0; i < 5; i++)
- {
- gearRet = gearman_client_do_background(gearClient,
- "test_function",
- NULL,
- "param1 param2 345",
- (size_t)strlen("param1 param2 345"),
- NULL);
- if (gearRet == GEARMAN_SUCCESS)
- {
- fprintf(stdout, "Work success!\n");
- }
- else if (gearRet == GEARMAN_WORK_FAIL)
- {
- fprintf(stderr, "Work failed\n");
- }
- else if (gearRet == GEARMAN_TIMEOUT)
- {
- fprintf(stderr, "Work timeout\n");
- }
- else
- {
- fprintf(stderr, "%d,%s\n", gearman_client_errno(gearClient), gearman_client_error(gearClient));
- }
- }
- #endif
- #if 0
- gearman_argument_t gearValue = gearman_argument_make(0, 0,
- "Reverse Me", strlen("Reverse Me"));
- gearman_task_st* gearTask = gearman_execute(gearClient,
- "reverse", strlen("reverse"),
- NULL, 0,
- NULL,
- &gearValue, 0);
-
- /* If gearman_execute() can return NULL on error */
- if (gearTask == NULL)
- {
- fprintf(stderr, "Error: %s\n", gearman_client_error(gearClient));
- gearman_client_free(gearClient);
- return EXIT_FAILURE;
- }
- /* Make sure the task was run successfully */
- if (gearman_success(gearman_task_return(gearTask)))
- {
- /* Make use of value */
- gearman_result_st *gearResult= gearman_task_result(gearTask);
- printf("%.*s\n", (int)gearman_result_size(gearResult), gearman_result_value(gearResult));
- }
- #endif
- gearman_client_free(gearClient);
- return EXIT_SUCCESS;
- }
worker
- /*
- * File:
- * simple-gearman-worker.cpp
- * Auth:
- * Hank(hongkuiyan@yeah.net)
- * Desc:
- * Example code to show how to receive a string to a function called "test_function"
- * Cypt:
- * Gearman server and library Version 1.1.12
- * Compile:
- * gcc -o simple-gearman-worker simple-gearman-worker.cpp -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman
- * Usage:
- * ./simple-gearman-worker
- */
-
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <iostream>
- #include <libgearman/gearman.h>
-
- using namespace std;
- static void *test_function(gearman_job_st *gearJob,
- void* context,
- size_t* resultSize,
- gearman_return_t* gearRet);
- int main(int argc, char* argv[])
- {
- gearman_return_t gearRet;
- gearman_worker_st* gearWorker;
- char* gearSvrHost=(char*)"10.10.13.8", *gearSvrPort=(char*)"4730";
- char* gearContext = new char(50);
- gearWorker = gearman_worker_create(NULL);
- if (gearWorker == NULL)
- {
- cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;
- return EXIT_FAILURE;
- }
- gearRet = gearman_worker_add_server(gearWorker, gearSvrHost, atoi(gearSvrPort));
- if (gearman_failed(gearRet))
- {
- cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;
- return EXIT_FAILURE;
- }
- gearRet = gearman_worker_add_function(gearWorker,
- "test_function",
- 0,
- test_function,
- gearContext);
- if (gearman_failed(gearRet))
- {
- cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;
- return EXIT_FAILURE;
- }
- cout << "waiting for job ... " << endl;
- while (1)
- {
- gearRet = gearman_worker_work(gearWorker);
- if (gearman_failed(gearRet))
- {
- cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;
- break;
- }
- }
- delete gearContext;
- gearman_worker_free(gearWorker);
- return EXIT_SUCCESS;
- }
- static void *test_function(gearman_job_st *gearJob,
- void *context,
- size_t *resultSize,
- gearman_return_t *gearRet)
- {
- cout << "\n\njob :" << gearman_job_handle(gearJob) << endl;
- cout << "context :" << (char*)context << endl;
- char *jobWorkload = (char*)gearman_job_workload(gearJob);
- size_t jobWorkloadSize = gearman_job_workload_size(gearJob);
- char *jobRequest = new char[1024];
- jobRequest = (char*)malloc(1024);
- if (jobRequest == NULL)
- {
- cout << "new jobRequest failed" << errno << endl;
- *gearRet = GEARMAN_WORK_FAIL;
- return NULL;
- }
- snprintf((char*)jobRequest, jobWorkloadSize+1, (char*)jobWorkload);
- cout<<"job = "<< gearman_job_handle(gearJob) << " jobWorkloadSize=" << jobWorkloadSize << " jobRequest=" <<jobRequest << endl;
- char *jobResult = new char[1024];
- if (jobResult == NULL)
- {
- cout <<"new jobResult failed" << errno << endl;
- *gearRet = GEARMAN_WORK_FAIL;
- return NULL;
- }
- sprintf((char*)jobResult, "%s->jobResult", (char*)jobRequest);
- size_t jobResultSize = strlen((char*)jobResult);
- cout <<"job = "<< gearman_job_handle(gearJob) << " jobResultSize=" << jobResultSize << " jobResult=" << jobResult << endl;
- delete []jobResult;
- delete []jobRequest;
- *gearRet = GEARMAN_SUCCESS;
- return NULL;
- }