diff --git a/daprdocs/content/en/getting-started/quickstarts/jobs-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/jobs-quickstart.md index 9be5deae8..a14f3c310 100644 --- a/daprdocs/content/en/getting-started/quickstarts/jobs-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/jobs-quickstart.md @@ -504,300 +504,7 @@ Return to the `job-service` app terminal window. The output should be: == APP == Executing maintenance job: Memory Wipe ``` -### What happened? - -When you ran the `dapr run` in this Quickstart for both the `job-scheduler` and the `job-service`, you can see the following jobs being registered, scheduled, retrieved, and deleted. - -- The `R2-D2` job is registered. -- The `C-3PO` job is registered. -- The `BB-8` job is registered. -- The `R2-D2` job is being scheduled. -- The `C-3PO` job is being scheduled. -- The `C-3PO` job is being retrieved. -- The `BB-8` job is being scheduled. -- The `BB-8` job is being retrieved. -- The `BB-8` job is being deleted. -- The `R2-D2` job is being executed after 5 seconds. -- The `R2-D2` job is being executed after 10 seconds. - -#### `job-service` app - -The `job-service` application creates service invocation handlers to manage the lifecycle of the job (`scheduleJob`, `getJob`, and `deleteJob`). - -```go -if err := server.AddServiceInvocationHandler("scheduleJob", scheduleJob); err != nil { - log.Fatalf("error adding invocation handler: %v", err) -} - -if err := server.AddServiceInvocationHandler("getJob", getJob); err != nil { - log.Fatalf("error adding invocation handler: %v", err) -} - -if err := server.AddServiceInvocationHandler("deleteJob", deleteJob); err != nil { - log.Fatalf("error adding invocation handler: %v", err) -} -``` - -Next, job event handlers are registered for all droids: - -```go -for _, jobName := range jobNames { - if err := server.AddJobEventHandler(jobName, handleJob); err != nil { - log.Fatalf("failed to register job event handler: %v", err) - } - fmt.Println("Registered job handler for: ", jobName) -} - -fmt.Println("Starting server on port: " + appPort) -if err = server.Start(); err != nil { - log.Fatalf("failed to start server: %v", err) -} -``` - -The `job-service` then codes the functions that handle scheduling, getting, deleting, and handling job events. - -```go -// Handler that schedules a DroidJob -func scheduleJob(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error) { - - if in == nil { - err = errors.New("no invocation parameter") - return - } - - droidJob := DroidJob{} - err = json.Unmarshal(in.Data, &droidJob) - if err != nil { - fmt.Println("failed to unmarshal job: ", err) - return nil, err - } - - jobData := JobData{ - Droid: droidJob.Name, - Task: droidJob.Job, - } - - content, err := json.Marshal(jobData) - if err != nil { - fmt.Printf("Error marshalling job content") - return nil, err - } - - // schedule job - job := daprc.Job{ - Name: droidJob.Name, - DueTime: droidJob.DueTime, - Data: &anypb.Any{ - Value: content, - }, - } - - err = app.daprClient.ScheduleJobAlpha1(ctx, &job) - if err != nil { - fmt.Println("failed to schedule job. err: ", err) - return nil, err - } - - fmt.Println("Job scheduled: ", droidJob.Name) - - out = &common.Content{ - Data: in.Data, - ContentType: in.ContentType, - DataTypeURL: in.DataTypeURL, - } - - return out, err - -} - -// Handler that gets a job by name -func getJob(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error) { - - if in == nil { - err = errors.New("no invocation parameter") - return nil, err - } - - job, err := app.daprClient.GetJobAlpha1(ctx, string(in.Data)) - if err != nil { - fmt.Println("failed to get job. err: ", err) - } - - out = &common.Content{ - Data: job.Data.Value, - ContentType: in.ContentType, - DataTypeURL: in.DataTypeURL, - } - - return out, err -} - -// Handler that deletes a job by name -func deleteJob(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error) { - if in == nil { - err = errors.New("no invocation parameter") - return nil, err - } - - err = app.daprClient.DeleteJobAlpha1(ctx, string(in.Data)) - if err != nil { - fmt.Println("failed to delete job. err: ", err) - } - - out = &common.Content{ - Data: in.Data, - ContentType: in.ContentType, - DataTypeURL: in.DataTypeURL, - } - - return out, err -} - -// Handler that handles job events -func handleJob(ctx context.Context, job *common.JobEvent) error { - var jobData common.Job - if err := json.Unmarshal(job.Data, &jobData); err != nil { - return fmt.Errorf("failed to unmarshal job: %v", err) - } - decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) - if err != nil { - return fmt.Errorf("failed to decode job payload: %v", err) - } - var jobPayload JobData - if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { - return fmt.Errorf("failed to unmarshal payload: %v", err) - } - - fmt.Println("Starting droid:", jobPayload.Droid) - fmt.Println("Executing maintenance job:", jobPayload.Task) - - return nil -} -``` - -#### `job-scheduler` app - -In the `job-scheduler` application, the R2D2, C3PO, and BB8 jobs are first defined as `[]DroidJob`: - -```go -droidJobs := []DroidJob{ - {Name: "R2-D2", Job: "Oil Change", DueTime: "5s"}, - {Name: "C-3PO", Job: "Memory Wipe", DueTime: "15s"}, - {Name: "BB-8", Job: "Internal Gyroscope Check", DueTime: "30s"}, -} -``` - - -The jobs are then scheduled, retrieved, and deleted using the jobs API. As you can see from the terminal output, first the R2D2 job is scheduled: - -```go -// Schedule R2D2 job -err = schedule(droidJobs[0]) -if err != nil { - log.Fatalln("Error scheduling job: ", err) -} -``` - -Then, the C3PO job is scheduled, and returns job data: - -```go -// Schedule C-3PO job -err = schedule(droidJobs[1]) -if err != nil { - log.Fatalln("Error scheduling job: ", err) -} - -// Get C-3PO job -resp, err := get(droidJobs[1]) -if err != nil { - log.Fatalln("Error retrieving job: ", err) -} -fmt.Println("Get job response: ", resp) -``` - -The BB8 job is then scheduled, retrieved, and deleted: - -```go -// Schedule BB-8 job -err = schedule(droidJobs[2]) -if err != nil { - log.Fatalln("Error scheduling job: ", err) -} - -// Get BB-8 job -resp, err = get(droidJobs[2]) -if err != nil { - log.Fatalln("Error retrieving job: ", err) -} -fmt.Println("Get job response: ", resp) - -// Delete BB-8 job -err = delete(droidJobs[2]) -if err != nil { - log.Fatalln("Error deleting job: ", err) -} -fmt.Println("Job deleted: ", droidJobs[2].Name) -``` - -The `job-scheduler.go` also defines the `schedule`, `get`, and `delete` functions, calling from `job-service.go`. - -```go -// Schedules a job by invoking grpc service from job-service passing a DroidJob as an argument -func schedule(droidJob DroidJob) error { - jobData, err := json.Marshal(droidJob) - if err != nil { - fmt.Println("Error marshalling job content") - return err - } - - content := &daprc.DataContent{ - ContentType: "application/json", - Data: []byte(jobData), - } - - // Schedule Job - _, err = app.daprClient.InvokeMethodWithContent(context.Background(), "job-service", "scheduleJob", "POST", content) - if err != nil { - fmt.Println("Error invoking method: ", err) - return err - } - - return nil -} - -// Gets a job by invoking grpc service from job-service passing a job name as an argument -func get(droidJob DroidJob) (string, error) { - content := &daprc.DataContent{ - ContentType: "text/plain", - Data: []byte(droidJob.Name), - } - - //get job - resp, err := app.daprClient.InvokeMethodWithContent(context.Background(), "job-service", "getJob", "GET", content) - if err != nil { - fmt.Println("Error invoking method: ", err) - return "", err - } - - return string(resp), nil -} - -// Deletes a job by invoking grpc service from job-service passing a job name as an argument -func delete(droidJob DroidJob) error { - content := &daprc.DataContent{ - ContentType: "text/plain", - Data: []byte(droidJob.Name), - } - - _, err := app.daprClient.InvokeMethodWithContent(context.Background(), "job-service", "deleteJob", "DELETE", content) - if err != nil { - fmt.Println("Error invoking method: ", err) - return err - } - - return nil -} -``` +Unpack what happened in the [`job-service`]({{< ref "#job-service-app" >}}) and [`job-scheduler`]({{< ref "#job-scheduler-app" >}}) applications when you ran `dapr run`. {{% /codetab %}}