{"_id":"@bthn/adonisjs-jobs","_rev":"5-11756899ade69290302754279761b999","name":"@bthn/adonisjs-jobs","dist-tags":{"latest":"0.2.4"},"versions":{"0.2.0":{"name":"@bthn/adonisjs-jobs","version":"0.2.0","keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"license":"MIT","_id":"@bthn/adonisjs-jobs@0.2.0","maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","c8":{"exclude":["tests/**"],"reporter":["text","html"]},"np":{"tag":"latest","branch":"main","message":"chore(release): %s","anyBranch":false},"dist":{"shasum":"7a1696961aef566493200ab7d3813bc4a638f526","tarball":"https://registry.npmjs.org/@bthn/adonisjs-jobs/-/adonisjs-jobs-0.2.0.tgz","fileCount":38,"integrity":"sha512-5kd7lx8eFC+ZYjh0AfAbFCet2GfH6SzgxHoT0cSi9UGckaBuAbgB8Vkcdxq0lLXns6uL0jmpPBAeJuBerhLqRA==","signatures":[{"sig":"MEQCIBtnfo1PuRDS1TlIfCKxZhHGI2qkNjOAZD8+nQ7iUU0jAiBi5TXlWcRGNQ5IoqJEvH5DYusmDyRSOC/fKebHGkyANw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35642},"type":"module","engines":{"node":">=20.6.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./commands":"./build/commands/main.js","./commands/*":"./build/commands/*.js","./services/*":"./build/services/*.js","./jobs_provider":"./build/providers/jobs_provider.js"},"gitHead":"437637aa73112b4a2a0e0538814bb528e611e3f0","scripts":{"lint":"eslint . --ext=.ts","test":"c8 npm run quick:test","build":"tsc && npm run index:commands","clean":"del-cli build","format":"prettier --write .","pretest":"npm run lint","release":"np","version":"npm run build","prebuild":"npm run lint && npm run clean","postbuild":"npm run copy:templates","typecheck":"tsc --noEmit","quick:test":"node --import=./tsnode.esm.js --enable-source-maps bin/test.ts","copy:templates":"copyfiles \"stubs/**/*.stub\" build","index:commands":"adonis-kit index build/commands","prepublishOnly":"npm run build"},"_npmUser":{"name":"bthn","email":"katircib@gmail.com"},"prettier":"@adonisjs/prettier-config","_npmVersion":"11.6.2","description":"Job processing for AdonisJS","directories":{},"_nodeVersion":"25.2.1","dependencies":{"bullmq":"^5.4.5","devalue":"^5.6.2","@trpc/server":"^11.12.0","@queuedash/api":"^3.17.0","@poppinss/utils":"^6.7.3","import-meta-resolve":"^4.1.0"},"eslintConfig":{"extends":"@adonisjs/eslint-config/package"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^9.1.0","np":"^10.0.5","eslint":"^8.57.0","del-cli":"^5.1.0","ts-node":"^10.9.2","prettier":"^3.3.1","@swc/core":"^1.5.25","copyfiles":"^2.4.1","typescript":"^5.4.5","@types/node":"^20.14.2","@japa/assert":"^2.1.0","@japa/runner":"^3.1.1","@types/luxon":"^3.7.1","@adonisjs/core":"^6.9.1","@adonisjs/tsconfig":"^1.3.0","@adonisjs/assembler":"^7.7.0","@adonisjs/eslint-config":"^1.3.0","@adonisjs/prettier-config":"^1.3.0"},"peerDependencies":{"luxon":"^3.7.2","@adonisjs/core":"^6.2.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adonisjs-jobs_0.2.0_1772839336378_0.3206685031759011","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bthn/adonisjs-jobs","version":"0.2.1","keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"license":"MIT","_id":"@bthn/adonisjs-jobs@0.2.1","maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","c8":{"exclude":["tests/**"],"reporter":["text","html"]},"np":{"tag":"latest","branch":"main","message":"chore(release): %s","anyBranch":false},"dist":{"shasum":"a7cf27ffeb0ee3f6050ce08d9dabf403bd6fdead","tarball":"https://registry.npmjs.org/@bthn/adonisjs-jobs/-/adonisjs-jobs-0.2.1.tgz","fileCount":38,"integrity":"sha512-k2+sHC49RErUJ5zBX6an6oliHKtz8NvW1V2PWhfaM99bXEjnTZaOPVsN4o2QM+jcnnxpQ0vVLmYnZTjpkmD+AA==","signatures":[{"sig":"MEQCIDxmPXD21YL+k1TJoIGZZg8RtG5NIBoktDaoLqTIglHSAiAHRrLK3qBFfZw9mEhwMQMZb8JOc/9+nhqlG+urUEN9FQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35921},"type":"module","engines":{"node":">=20.6.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./commands":"./build/commands/main.js","./commands/*":"./build/commands/*.js","./services/*":"./build/services/*.js","./jobs_provider":"./build/providers/jobs_provider.js"},"gitHead":"437637aa73112b4a2a0e0538814bb528e611e3f0","scripts":{"lint":"eslint . --ext=.ts","test":"c8 npm run quick:test","build":"tsc && npm run index:commands","clean":"del-cli build","format":"prettier --write .","pretest":"npm run lint","release":"np","version":"npm run build","prebuild":"npm run lint && npm run clean","postbuild":"npm run copy:templates","typecheck":"tsc --noEmit","quick:test":"node --import=./tsnode.esm.js --enable-source-maps bin/test.ts","copy:templates":"copyfiles \"stubs/**/*.stub\" build","index:commands":"adonis-kit index build/commands","prepublishOnly":"npm run build"},"_npmUser":{"name":"bthn","email":"katircib@gmail.com"},"prettier":"@adonisjs/prettier-config","_npmVersion":"11.6.2","description":"Job processing for AdonisJS","directories":{},"_nodeVersion":"25.2.1","dependencies":{"bullmq":"^5.4.5","devalue":"^5.6.2","@trpc/server":"^11.12.0","@queuedash/api":"^3.17.0","@poppinss/utils":"^6.7.3","import-meta-resolve":"^4.1.0"},"eslintConfig":{"extends":"@adonisjs/eslint-config/package"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^9.1.0","np":"^10.0.5","eslint":"^8.57.0","del-cli":"^5.1.0","ts-node":"^10.9.2","prettier":"^3.3.1","@swc/core":"^1.5.25","copyfiles":"^2.4.1","typescript":"^5.4.5","@types/node":"^20.14.2","@japa/assert":"^2.1.0","@japa/runner":"^3.1.1","@types/luxon":"^3.7.1","@adonisjs/core":"^6.9.1","@adonisjs/tsconfig":"^1.3.0","@adonisjs/assembler":"^7.7.0","@adonisjs/eslint-config":"^1.3.0","@adonisjs/prettier-config":"^1.3.0"},"peerDependencies":{"luxon":"^3.7.2","@adonisjs/core":"^6.2.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adonisjs-jobs_0.2.1_1772840334431_0.9083829489192299","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bthn/adonisjs-jobs","version":"0.2.2","keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"license":"MIT","_id":"@bthn/adonisjs-jobs@0.2.2","maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","c8":{"exclude":["tests/**"],"reporter":["text","html"]},"np":{"tag":"latest","branch":"main","message":"chore(release): %s","anyBranch":false},"dist":{"shasum":"80232d2a0eab4c45dd4bc4c6ab61a70d45cdce73","tarball":"https://registry.npmjs.org/@bthn/adonisjs-jobs/-/adonisjs-jobs-0.2.2.tgz","fileCount":38,"integrity":"sha512-sYNJFElFbVcbKeIqzjJzxlupvi2EY32jGSTY8enAbDnJtVk/u4RozcKH5fpCrjHT83f7DHmoyzNd7tf9Mc7vBQ==","signatures":[{"sig":"MEYCIQCDsVzIi+rKOMwhu/9R723hV53aZYKRBG9gG2unCukOgwIhAKHVbVgLvqGbqgXD8ef6Uib3OwGTCYLw17fnqrpqPnEO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36063},"type":"module","engines":{"node":">=20.6.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./commands":"./build/commands/main.js","./commands/*":"./build/commands/*.js","./services/*":"./build/services/*.js","./jobs_provider":"./build/providers/jobs_provider.js"},"gitHead":"437637aa73112b4a2a0e0538814bb528e611e3f0","scripts":{"lint":"eslint . --ext=.ts","test":"c8 npm run quick:test","build":"tsc && npm run index:commands","clean":"del-cli build","format":"prettier --write .","pretest":"npm run lint","release":"np","version":"npm run build","prebuild":"npm run lint && npm run clean","postbuild":"npm run copy:templates","typecheck":"tsc --noEmit","quick:test":"node --import=./tsnode.esm.js --enable-source-maps bin/test.ts","copy:templates":"copyfiles \"stubs/**/*.stub\" build","index:commands":"adonis-kit index build/commands","prepublishOnly":"npm run build"},"_npmUser":{"name":"bthn","email":"katircib@gmail.com"},"prettier":"@adonisjs/prettier-config","_npmVersion":"11.6.2","description":"Job processing for AdonisJS","directories":{},"_nodeVersion":"25.2.1","dependencies":{"bullmq":"^5.4.5","devalue":"^5.6.2","@trpc/server":"^11.12.0","@queuedash/api":"^3.17.0","@poppinss/utils":"^6.7.3","import-meta-resolve":"^4.1.0"},"eslintConfig":{"extends":"@adonisjs/eslint-config/package"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^9.1.0","np":"^10.0.5","eslint":"^8.57.0","del-cli":"^5.1.0","ts-node":"^10.9.2","prettier":"^3.3.1","@swc/core":"^1.5.25","copyfiles":"^2.4.1","typescript":"^5.4.5","@types/node":"^20.14.2","@japa/assert":"^2.1.0","@japa/runner":"^3.1.1","@types/luxon":"^3.7.1","@adonisjs/core":"^6.9.1","@adonisjs/tsconfig":"^1.3.0","@adonisjs/assembler":"^7.7.0","@adonisjs/eslint-config":"^1.3.0","@adonisjs/prettier-config":"^1.3.0"},"peerDependencies":{"luxon":"^3.7.2","@adonisjs/core":"^6.2.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adonisjs-jobs_0.2.2_1772840824188_0.5328292011349058","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bthn/adonisjs-jobs","version":"0.2.3","keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"license":"MIT","_id":"@bthn/adonisjs-jobs@0.2.3","maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","c8":{"exclude":["tests/**"],"reporter":["text","html"]},"np":{"tag":"latest","branch":"main","message":"chore(release): %s","anyBranch":false},"dist":{"shasum":"2fcf13e93fc3bc6f1dc0a5fd428713b447791b60","tarball":"https://registry.npmjs.org/@bthn/adonisjs-jobs/-/adonisjs-jobs-0.2.3.tgz","fileCount":38,"integrity":"sha512-zs1ffoKIrsyI6s5dOwwZ/ZEJE6Tse7Zam4GD4obNTjnsCFim56CbehoUt87BGM1F/RwjE3jO0Tf2TnfYaElsPA==","signatures":[{"sig":"MEUCIQDEUADVilEpsKY+WSbgXJI4v75446xSU+jxd/GdG2YyxgIgIILXtJ6BM64KiX99H04UPR6M83kAIWSD/yCtM7EGxWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36060},"type":"module","engines":{"node":">=20.6.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./commands":"./build/commands/main.js","./commands/*":"./build/commands/*.js","./services/*":"./build/services/*.js","./jobs_provider":"./build/providers/jobs_provider.js"},"gitHead":"437637aa73112b4a2a0e0538814bb528e611e3f0","scripts":{"lint":"eslint . --ext=.ts","test":"c8 npm run quick:test","build":"tsc && npm run index:commands","clean":"del-cli build","format":"prettier --write .","pretest":"npm run lint","release":"np","version":"npm run build","prebuild":"npm run lint && npm run clean","postbuild":"npm run copy:templates","typecheck":"tsc --noEmit","quick:test":"node --import=./tsnode.esm.js --enable-source-maps bin/test.ts","copy:templates":"copyfiles \"stubs/**/*.stub\" build","index:commands":"adonis-kit index build/commands","prepublishOnly":"npm run build"},"_npmUser":{"name":"bthn","email":"katircib@gmail.com"},"prettier":"@adonisjs/prettier-config","_npmVersion":"11.6.2","description":"Job processing for AdonisJS","directories":{},"_nodeVersion":"25.2.1","dependencies":{"bullmq":"^5.4.5","devalue":"^5.6.2","@trpc/server":"^11.12.0","@queuedash/api":"^3.17.0","@poppinss/utils":"^6.7.3","import-meta-resolve":"^4.1.0"},"eslintConfig":{"extends":"@adonisjs/eslint-config/package"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^9.1.0","np":"^10.0.5","eslint":"^8.57.0","del-cli":"^5.1.0","ts-node":"^10.9.2","prettier":"^3.3.1","@swc/core":"^1.5.25","copyfiles":"^2.4.1","typescript":"^5.4.5","@types/node":"^20.14.2","@japa/assert":"^2.1.0","@japa/runner":"^3.1.1","@types/luxon":"^3.7.1","@adonisjs/core":"^6.9.1","@adonisjs/tsconfig":"^1.3.0","@adonisjs/assembler":"^7.7.0","@adonisjs/eslint-config":"^1.3.0","@adonisjs/prettier-config":"^1.3.0"},"peerDependencies":{"luxon":"^3.7.2","@adonisjs/core":"^6.2.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adonisjs-jobs_0.2.3_1772841164929_0.2615174824748414","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bthn/adonisjs-jobs","description":"Job processing for AdonisJS","homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","license":"MIT","author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"version":"0.2.4","engines":{"node":">=20.6.0"},"type":"module","exports":{".":"./build/index.js","./types":"./build/src/types.js","./jobs_provider":"./build/providers/jobs_provider.js","./commands":"./build/commands/main.js","./commands/*":"./build/commands/*.js","./services/*":"./build/services/*.js"},"scripts":{"clean":"del-cli build","copy:templates":"copyfiles \"stubs/**/*.stub\" build","typecheck":"tsc --noEmit","lint":"eslint . --ext=.ts","format":"prettier --write .","quick:test":"node --import=./tsnode.esm.js --enable-source-maps bin/test.ts","pretest":"npm run lint","test":"c8 npm run quick:test","prebuild":"npm run lint && npm run clean","build":"tsc && npm run index:commands","postbuild":"npm run copy:templates","release":"np","version":"npm run build","prepublishOnly":"npm run build","index:commands":"adonis-kit index build/commands"},"devDependencies":{"@adonisjs/assembler":"^7.7.0","@adonisjs/core":"^6.9.1","@adonisjs/eslint-config":"^1.3.0","@adonisjs/prettier-config":"^1.3.0","@adonisjs/tsconfig":"^1.3.0","@japa/assert":"^2.1.0","@japa/runner":"^3.1.1","@swc/core":"^1.5.25","@types/luxon":"^3.7.1","@types/node":"^20.14.2","c8":"^9.1.0","copyfiles":"^2.4.1","del-cli":"^5.1.0","eslint":"^8.57.0","np":"^10.0.5","prettier":"^3.3.1","ts-node":"^10.9.2","typescript":"^5.4.5"},"peerDependencies":{"@adonisjs/core":"^6.2.0 || ^7.0.0","luxon":"^3.7.2"},"publishConfig":{"access":"public","tag":"latest"},"np":{"message":"chore(release): %s","tag":"latest","branch":"main","anyBranch":false},"c8":{"reporter":["text","html"],"exclude":["tests/**"]},"eslintConfig":{"extends":"@adonisjs/eslint-config/package"},"prettier":"@adonisjs/prettier-config","dependencies":{"@poppinss/utils":"^6.7.3","@queuedash/api":"^3.17.0","@trpc/server":"^11.12.0","bullmq":"^5.4.5","devalue":"^5.6.2","import-meta-resolve":"^4.1.0"},"gitHead":"437637aa73112b4a2a0e0538814bb528e611e3f0","_id":"@bthn/adonisjs-jobs@0.2.4","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-VHCszRHkidRH+Gi3//NeG60cCuGRT0fnFftvHq08qVO7+oY5S9RHzYabIQBuhv7ZON4dlSyOAMesGnFIymGdqA==","shasum":"efb81544d1305f0e0b9cab98e4efa83d3eddf37c","tarball":"https://registry.npmjs.org/@bthn/adonisjs-jobs/-/adonisjs-jobs-0.2.4.tgz","fileCount":38,"unpackedSize":35795,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHh7kicmCV/moFbSXY5zCpFWaeZUJH9If797/Y7Yt3aXAiEAtuDOMqXD6b1oMXf9KXzo9G1M0q6WnZusE5jA1ODzmc4="}]},"_npmUser":{"name":"bthn","email":"katircib@gmail.com"},"directories":{},"maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adonisjs-jobs_0.2.4_1772841495315_0.08179415343687091"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T23:22:16.290Z","modified":"2026-03-06T23:58:15.561Z","0.2.0":"2026-03-06T23:22:16.533Z","0.2.1":"2026-03-06T23:38:54.567Z","0.2.2":"2026-03-06T23:47:04.351Z","0.2.3":"2026-03-06T23:52:45.083Z","0.2.4":"2026-03-06T23:58:15.463Z"},"author":{"name":"Georges KABBOUCHI","email":"georges.kabbouchi@gmail.com"},"license":"MIT","homepage":"https://github.com/KABBOUCHI/adonisjs-jobs#readme","keywords":["adonisjs","jobs","queue","background-jobs","redis","bullmq"],"description":"Job processing for AdonisJS","maintainers":[{"name":"bthn","email":"katircib@gmail.com"}],"readme":"<div align=\"center\">\n  <h1><b>AdonisJS Jobs</b></h1>\n\n  <p>Job processing for AdonisJS v6 using <a href=\"https://bullmq.io/\" target=\"_blank\">BullMQ</a></p>\n</div>\n\n## Getting Started\n\nThis package is available in the npm registry.\n\n```bash\npnpm install adonisjs-jobs\n```\n\nNext, configure the package by running the following command.\n\n```bash\nnode ace configure adonisjs-jobs\n```\n\n## Creating Jobs\n\nYou can create a new job by running the following command.\n\n```sh\nnode ace jobs:make SendEmail\n```\n\n## Listening for Jobs\n\nFirst, you need to start the jobs listener, you can spawn multiple listeners to process jobs concurrently.\n\n```sh\nnode ace jobs:listen  # default queue from env `REDIS_QUEUE`\n\nnode ace jobs:listen --queue=high\nnode ace jobs:listen --queue=high --queue=medium\nnode ace jobs:listen --queue=high,medium,low\n\nnode ace jobs:listen --queue=high --concurrency=3\n```\n\n## Dispatching Jobs\n\nDispatching jobs is as simple as importing the job class and calling\n\n```ts\nimport SendEmail from 'path/to/jobs/send_email.js'\n\nawait SendEmail.dispatch({ ... })\n\nawait SendEmail.dispatch({ ... }, { // for more job options check https://docs.bullmq.io/\n  attempts: 3,\n  delay: 1000,\n})\n```\n\n## Import Aliases (optional)\n\nupdate your `package.json` and `tsconfig.json` to use import aliases\n\n`package.json`\n\n```json\n{\n  \"imports\": {\n    \"#jobs/*\": \"./app/jobs/*.js\"\n  }\n}\n```\n\n`tsconfig.json`\n\n```json\n{\n  \"compilerOptions\": {\n    \"paths\": {\n      \"#jobs/*\": [\"./app/jobs/*.js\"]\n    }\n  }\n}\n```\n\n```ts\nimport SendEmail from '#jobs/send_email.js'\n\nawait SendEmail.dispatch({ ... })\n```\n\n## Jobs Dashboard\n\nYou can view the jobs dashboard by adding the following route to your `start/routes.ts` file.\n\n```ts\nimport router from '@adonisjs/core/services/router'\n\nrouter.jobs() // default is /jobs\n\n// or\n\nrouter.jobs('/my-jobs-dashboard')\n```\n\n`router.jobs()` returns a route group, you can add middleware to the group\n\n```ts\nrouter.jobs().use(\n  middleware.auth({\n    guards: ['basicAuth'],\n  })\n)\n```\n\n## Tips\n\n### Job Completion on Kubernetes\n\nIn Kubernetes, prevent job termination by adjusting `terminationGracePeriodSeconds` (default is 30s) to allow jobs to finish gracefully.\n\n```yaml\nspec:\n  containers:\n    - name: listen-jobs\n      image: <IMAGE>\n      command: ['node']\n      args: ['ace', 'jobs:listen']\nterminationGracePeriodSeconds: 1800\n```\n\n## Experimental Features\n\n### Dispatch Closure\n\n```ts\nimport { dispatch } from 'adonisjs-jobs/services/main'\n\nawait dispatch(async () => {\n  const { default: User } = await import('#models/user')\n\n  console.log(await User.query().count('*'))\n})\n\nawait dispatch(async () => {\n  const { default: mail } = await import('@adonisjs/mail/services/main')\n\n  await mail.send((message) => {\n    message\n      .to('doe@example.org')\n      .from('info@example.org')\n      .subject('Verify your email address')\n      .htmlView('emails/verify_email')\n  })\n})\n```\n\n## Alternative Ways to Run the Job Worker\n\nBesides using `node ace jobs:listen`, you can also manually initialize and control the job worker in your code:\n\n```ts\nimport { Worker } from 'adonisjs-jobs'\nimport app from '@adonisjs/core/services/app'\n\nconst worker = new Worker(app, {\n  queues: ['default', 'mail'],\n  concurrency: 1,\n})\n\napp.terminating(async () => {\n  await worker.stop()\n})\n\nawait worker.start()\n```\n","readmeFilename":"README.md"}