job-queue-test-plugin.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { Injectable, OnModuleInit } from '@nestjs/common';
  2. import { Args, Mutation, Resolver } from '@nestjs/graphql';
  3. import { JobQueue, JobQueueService, Logger, PluginCommonModule, VendurePlugin } from '@vendure/core';
  4. import { gql } from 'apollo-server-core';
  5. @Injectable()
  6. export class JobQueueTestService implements OnModuleInit {
  7. private myQueue: JobQueue<{ intervalMs: number; shouldFail: boolean }>;
  8. constructor(private jobQueueService: JobQueueService) {}
  9. async onModuleInit() {
  10. this.myQueue = await this.jobQueueService.createQueue({
  11. name: 'my-queue',
  12. process: async job => {
  13. Logger.info(`Starting job ${job.id}, shouldFail: ${JSON.stringify(job.data.shouldFail)}`);
  14. let progress = 0;
  15. while (progress < 100) {
  16. // Logger.info(`Job ${job.id} progress: ${progress}`);
  17. await new Promise(resolve => setTimeout(resolve, job.data.intervalMs));
  18. progress += 10;
  19. job.setProgress(progress);
  20. if (progress > 70 && job.data.shouldFail) {
  21. Logger.warn(`Job ${job.id} will fail`);
  22. throw new Error(`Job failed!!`);
  23. }
  24. }
  25. Logger.info(`Completed job ${job.id}`);
  26. },
  27. });
  28. }
  29. async startTask(intervalMs: number, shouldFail: boolean) {
  30. await this.myQueue.add({ intervalMs, shouldFail }, { retries: 3 });
  31. return true;
  32. }
  33. }
  34. @Resolver()
  35. export class JobQueueTestResolver {
  36. constructor(private service: JobQueueTestService) {}
  37. @Mutation()
  38. startTask(@Args() args: any) {
  39. return this.service.startTask(args.intervalMs, args.shouldFail);
  40. }
  41. }
  42. /**
  43. * A plugin which can be used to test job queue strategies. Exposes a mutation `startTask` in
  44. * the Admin API which triggers a job.
  45. */
  46. @VendurePlugin({
  47. imports: [PluginCommonModule],
  48. adminApiExtensions: {
  49. resolvers: [JobQueueTestResolver],
  50. schema: gql`
  51. extend type Mutation {
  52. startTask(intervalMs: Int, shouldFail: Boolean!): Boolean!
  53. }
  54. `,
  55. },
  56. providers: [JobQueueTestService],
  57. })
  58. export class JobQueueTestPlugin {}