wekan/packages/wekan-cfs-power-queue/README.md

137 lines
4.7 KiB
Markdown
Raw Normal View History

wekan-cfs-power-queue [![Build Status](https://travis-ci.org/CollectionFS/Meteor-powerqueue.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-powerqueue)
=========
~~Looking for maintainers - please reach out!~~
This package is to be archived due to inability to find contributors, thanks to everyone who helped make it possible.
**If you're looking for an alternative, we highly recommend [Meteor-Files](https://github.com/VeliovGroup/Meteor-Files) by [VeliovGroup](https://github.com/VeliovGroup)**
---
PowerQueue is a native Meteor package for memory-backed job queue processing. Features include:
* async tasks
* throttling resource usage
* retrying failed tasks
* managing sub-queues
* powered by Meteor's reactive sugar
* etc.
PowerQueue can use one of two [spinal-queue](https://github.com/zcfs/Meteor-power-queue/blob/master/spinal-queue.spec.md) packages, [ReactiveList](https://github.com/zcfs/Meteor-reactive-list) or [MicroQueue](https://github.com/zcfs/Meteor-micro-queue).
## Demos
**Check out the cool [live queue demo](http://power-queue-test.meteor.com) and [live sub queue example](http://power-queue-sub-test.meteor.com).**
Source code for both can be found in the two branches of the [power-queue-example repo](https://github.com/zcfs/power-queue-example).
Kind regards,
Eric(@aldeed) and Morten(@raix)
Happy coding!
# API
All getters and setters are reactive.
[API Documentation](api.md)
## Helpers / Getters / Setters:
* PowerQueue.length - Number of tasks in queue
* PowerQueue.progress - Current progress in percent
* PowerQueue.usage - Current load in percent
* PowerQueue.total - Sum of tasks to run in current queue
* PowerQueue.isPaused - True if queue is paused
* PowerQueue.isHalted - True if queue is paused or stopped
* PowerQueue.processing - Number of tasks being processed
* PowerQueue.errors - Failures where task is passed to the errorHandler
* PowerQueue.failures - Number of failures in current queue
* PowerQueue.isRunning - True if queue is active
* PowerQueue.maxProcessing - Getter + Setter for max tasks to run in parallel
* PowerQueue.autostart - Getter + Setter for autostart flag - Allow add task to start the queue
* PowerQueue.maxFailures - Max allowed retries for failing tasks before marked as an error
* options.queue - Use custom micro-queue compatible queue
* options.onEnded - Called when queue has ended
* options.onRelease(remainingTasks) - Called when queue has ended or paused
* options.onAutostart - Called when queue was autostarted
## Methods
* PowerQueue.add(data) - Add a task to queue
* PowerQueue.run() - Start the queue
* PowerQueue.pause() - Pause the queue
* PowerQueue.resume() - Resume the queue if paused
* PowerQueue.reset() - Reset the queue
* PowerQueue.taskHandler(data, next, failures) - Default task handler, where data is a `function(done)`, can be overwritten
* PowerQueue.errorHandler(data, addTask, failures) - Default error handler, can be overwritten
# Example 1
```js
var queue = new PowerQueue({
isPaused: true
});
queue.add(function(done) {
console.log('task 1');
done();
});
queue.add(function(done) {
console.log('task 2');
done();
});
queue.add(function(done) {
console.log('task 3');
done();
});
console.log('Ready to run queue');
queue.run();
```
# Example 2
This is a very rough example of how to make custom task handling.
```js
queue.errorHandler = function(data, addTask) {
// This error handler lets the task drop, but we could use addTask to
// Put the task into the queue again
tasks.update({ _id: data.id }, { $set: { status: 'error'} });
};
queue.taskHandler = function(data, next) {
// The task is now processed...
tasks.update({ _id: data.id }, { $set: { status: 'processing'} });
Meteor.setTimeout(function() {
if (Math.random() > 0.5) {
// We random fail the task
tasks.update({ _id: data.id }, { $set: { status: 'failed'} });
// Returning error to next
next('Error: Fail task');
} else {
// We are done!
tasks.update({ _id: data.id }, { $set: { status: 'done'} });
// Trigger next task
next();
}
// This async task duration is between 500 - 1000ms
}, Math.round(500 + 500 * Math.random()));
};
// Add the task:
var taskId = 0;
queue.add({ id: tasks.insert({ status: 'added', index: ++taskId }) });
```
# Contribute
Here's the [complete API documentation](internal.api.md), including private methods.
To update the docs, run `npm install docmeteor` then `docmeteor`.
## TODO / Wishlist
* scheduling jobs to run in the future, like [meteor-queue](https://github.com/artwells/meteor-queue#features) - see [issue #15](https://github.com/zcfs/Meteor-power-queue/issues/15)