https://github.com/stitchng/adonis-queue
An addon/plugin package to provide driver-based job queueing services in AdonisJS 4.0+
https://github.com/stitchng/adonis-queue
adonisjs bee-queue job jobs queues redis worker
Last synced: 3 months ago
JSON representation
An addon/plugin package to provide driver-based job queueing services in AdonisJS 4.0+
- Host: GitHub
- URL: https://github.com/stitchng/adonis-queue
- Owner: stitchng
- License: mit
- Created: 2018-12-10T11:58:45.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2020-04-22T08:41:40.000Z (over 5 years ago)
- Last Synced: 2025-09-29T20:54:00.093Z (3 months ago)
- Topics: adonisjs, bee-queue, job, jobs, queues, redis, worker
- Language: JavaScript
- Homepage:
- Size: 165 KB
- Stars: 34
- Watchers: 1
- Forks: 9
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# adonis-queue
An addon/plugin package to provide driver-based job queueing services in AdonisJS 4.0+
[![NPM Version][npm-image]][npm-url]
[![Build Status][travis-image]][travis-url]
[![Coveralls][coveralls-image]][coveralls-url]

## Getting Started
```bash
adonis install adonisjs-queue
```
## Usage
>Add a job file to the jobs folder using the command. The command below creates the file `app/Jobs/SendEmail.js`. The queue flag in the command is for setting the queue priority channel. The queue flag has only 2 possible values: _high_ and _low_
```bash
$ adonis make:job SendEmail
$ adonis make:job SendEmail --queue=low
```
>OR
```bash
$ node ace make:job SendEmail
```
## Installation Instructions
See the [_instructions.md_](https://github.com/stitchng/adonis-queue/blob/master/instructions.md) file for the complete installation steps and follow as stated.
## Writing A Job
```js
/** @type {typeof import('adonisjs-queue/src/Job')} */
const Job = use('Job')
/** @type {typeof import('@adonisjs/mail/src/Mail')} */
const Mail = use('Mail')
class SendEmail extends Job {
get queue(){
return 'low'
}
constructor(emailAddress, emailFrom, emailSubject, emailBody) {
super(arguments)
this.timeOut = 100; // seconds
this.retryCount = 0;
this.retryUntil = 200; // seconds
this.delayUntil = Date.parse('2038-01-19T03:14:08.000Z') // optional, omit this line if not required
}
async handle(link, done) {
//....
console.log(`Job [${this.constructor.name}] - handler called: status=running; id=${this.id} `)
await link.reportProgress(10)
let _data = link.data // arguments passed into the constructor
let error = null
let result = null
try{
result = await Mail.send(_data.emailBody, {gender:'F', fullname:"Aisha Salihu"}, (message) => {
message.to(_data.emailAddress)
message.from(_data.emailFrom)
message.subject(_data.emailSubject)
})
await link.reportProgress(50)
}catch(err){
error = err
result = undefined
await link.reportProgress(50)
}finally{
await link.reportProgress(100)
}
return new Promise((resolve, reject) => {
error === null ? resolve(result) : reject(error)
});
}
progress(progress) {
console.log(`Job [${this.constructor.name}] - progress:${progress}%: status=running; id=${this.id} `)
}
failed(error) {
console.log(`Job [${this.constructor.name}] - status:failed; id=${this.id} `, error.message)
this.detach() // remove the job from the queue (when the job fails after all retries)
}
retrying(error){
console.log(`Job [${this.constructor.name}] - status:retrying; id=${this.id} `, error.message)
}
succeeded(result){
console.log(`Job [${this.constructor.name}] - status:succeeded; id=${this.id} `, result)
}
}
module.exports = SendEmail
```
>Open the `start/events.js` file of an **AdonisJS Framework** installation and add the following code to it (This package encourages the use of the standard event bus for **AdonisJS**)
```js
'use strict'
/** @type {typeof import('@adonisjs/framework/src/Event')} */
const Event = use('Event')
/** @type {typeof import('adonisjs-queue/src/Queue')} */
const Queue = use('Queue')
const SendEmail = use('App/Jobs/SendEmail')
Event.on('user_registered', async ( _email ) => {
// dispatch to the "high" priority queue
await Queue.select('high').andDispatch(new SendEmail(
_email,
'support@example.com',
'YOU ARE WELCOME',
'emails.template_1' // AdonisJS view template file: "resources/views/emails/template_1.edge"
));
// implicitly calls select('high')
await Queue.dispatch(new SendEmail(
_email,
'support@example.com',
'NEXT STEPS',
'emails.template_2' // AdonisJS view template file: "resources/views/emails/template_2.edge"
));
})
```
>Then, go to the `start/routes.js` file of an **AdonisJS Framework** installation and add the following code to it
```js
/** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
const Route = use('Route')
Route.post('user/register/:type', ({ request, params: { type }, respopnse }) => {
const body = request.post()
Event.fire('user_registered', 'queensaisha04@gmail.com') // Invoke the 'SendEmail' Job (to send an email) via the Event Bus
if (request.format() === 'json') {
return response.status(200).json({
status:'success'
})
}else{
return response.send('success')
}
})
```
## Possible Gocthas
If the `select()` method is explicitly called before a (chained) call `andDispatch()` OR `dispatch()` is made on the `Queue` object, the queue getter value on a **job** instance (`job.queue`) is automatically overridden by the value passed to the *select* method like so `select('low')`. So, be well aware of how calling `select` explicitly affects things.
## More
>You can also access the queue instance via the **AdonisJS Http Context** in a controller/middleware
```js
'use strict'
const SendEmail = use('App/Jobs/SendEmail')
class WorksController {
async sendEmail({ request, queue, session }){
let tenant_id = session.get('tenant_id')
let { email } = request.only([
'email'
])
await queue.dispatch(new SendEmail( // dispatch to the "low" priority queue
email,
'support@example.com',
'YOU ARE WELCOME',
'emails.template' // AdonisJS view template file in "resources/views"
))
}
}
module.exports = WorksController
```
## License
MIT
## Running Tests
```bash
npm i
```
```bash
npm run lint
npm run test
```
## Credits
- [Ifeora Okechukwu](https://twitter.com/isocroft)
- [Ahmad Abdul-Aziz](https://instagram.com/dev_amaz)
## Contributing
See the [CONTRIBUTING.md](https://github.com/stitchng/adonis-queue/blob/master/CONTRIBUTING.md) file for info
[npm-image]: https://img.shields.io/npm/v/adonisjs-queue.svg?style=flat-square
[npm-url]: https://npmjs.org/package/adonisjs-queue
[travis-image]: https://img.shields.io/travis/stitchng/adonis-queue/master.svg?style=flat-square
[travis-url]: https://travis-ci.org/stitchng/adonis-queue
[coveralls-image]: https://img.shields.io/coveralls/stitchng/adonis-queue/master.svg?style=flat-square
[coveralls-url]: https://coveralls.io/github/stitchng/adonis-queue
## Support
**Coolcodes** is a non-profit software foundation (collective) created by **Oparand** - parent company of StitchNG, Synergixe based in Abuja, Nigeria. You'll find an overview of all our work and supported open source projects on our [Facebook Page](https://www.facebook.com/coolcodes/).
>Follow us on facebook if you can to get the latest open source software/freeware news and infomation.
Does your business depend on our open projects? Reach out and support us on [Patreon](https://www.patreon.com/coolcodes/). All pledges will be dedicated to allocating workforce on maintenance and new awesome stuff.