[ { "id": "flow-bullmq-features", "type": "tab", "label": "BullMQ feature examples", "disabled": false, "info": "Simple BullMQ examples for Node-RED: delayed jobs, priorities, deduplication, rate limits, schedulers, events, manual acknowledgement, and flows." }, { "id": "queue-bullmq-features", "type": "bull-queue-server", "name": "bullmq-features", "deployment": "single", "address": "localhost", "port": "6379", "db": "", "clusterNodes": "", "sentinels": "", "sentinelMasterName": "", "username": "", "sentinelUsername": "", "tls": false, "sentinelTls": false, "tlsRejectUnauthorized": true, "tlsServerName": "", "prefix": "" }, { "id": "inject-delay-example", "type": "inject", "z": "flow-bullmq-features", "name": "delay: send later", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "run this job after 10 seconds", "payloadType": "str", "x": 160, "y": 100, "wires": [["fn-delay-example"]] }, { "id": "fn-delay-example", "type": "function", "z": "flow-bullmq-features", "name": "msg.jobopts.delay", "func": "msg.cmd = \"add\";\nmsg.jobName = \"delayed\";\nmsg.jobopts = {\n delay: 10000,\n removeOnComplete: true\n};\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 410, "y": 100, "wires": [["cmd-feature-examples"]] }, { "id": "inject-priority-example", "type": "inject", "z": "flow-bullmq-features", "name": "priority: high priority", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "process before normal priority jobs", "payloadType": "str", "x": 180, "y": 180, "wires": [["fn-priority-example"]] }, { "id": "fn-priority-example", "type": "function", "z": "flow-bullmq-features", "name": "msg.jobopts.priority", "func": "msg.cmd = \"add\";\nmsg.jobName = \"priority\";\nmsg.jobopts = {\n priority: 1,\n removeOnComplete: true\n};\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 420, "y": 180, "wires": [["cmd-feature-examples"]] }, { "id": "inject-dedupe-example", "type": "inject", "z": "flow-bullmq-features", "name": "dedupe: same job once", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "customer-42-report", "payloadType": "str", "x": 170, "y": 260, "wires": [["fn-dedupe-example"]] }, { "id": "fn-dedupe-example", "type": "function", "z": "flow-bullmq-features", "name": "msg.jobopts.deduplication", "func": "msg.cmd = \"add\";\nmsg.jobName = \"deduplicated\";\nmsg.jobopts = {\n deduplication: { id: msg.payload },\n removeOnComplete: true\n};\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 440, "y": 260, "wires": [["cmd-feature-examples"]] }, { "id": "inject-rate-limit-example", "type": "inject", "z": "flow-bullmq-features", "name": "rate limit: 2 per second", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"max\":2,\"duration\":1000}", "payloadType": "json", "x": 180, "y": 340, "wires": [["fn-rate-limit-example"]] }, { "id": "fn-rate-limit-example", "type": "function", "z": "flow-bullmq-features", "name": "setGlobalRateLimit", "func": "msg.cmd = \"setGlobalRateLimit\";\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 430, "y": 340, "wires": [["cmd-feature-examples"]] }, { "id": "inject-scheduler-example", "type": "inject", "z": "flow-bullmq-features", "name": "scheduler: every minute", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "scheduled heartbeat", "payloadType": "str", "x": 180, "y": 420, "wires": [["fn-scheduler-example"]] }, { "id": "fn-scheduler-example", "type": "function", "z": "flow-bullmq-features", "name": "repeat.pattern", "func": "msg.cmd = \"add\";\nmsg.jobName = \"heartbeat\";\nmsg.jobopts = {\n jobId: \"heartbeat-every-minute\",\n repeat: { pattern: \"*/1 * * * *\" },\n removeOnComplete: true\n};\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 410, "y": 420, "wires": [["cmd-feature-examples"]] }, { "id": "cmd-feature-examples", "type": "bull cmd", "z": "flow-bullmq-features", "name": "send command", "queue": "queue-bullmq-features", "x": 690, "y": 260, "wires": [["debug-feature-command"]] }, { "id": "run-immediate-example", "type": "bull run", "z": "flow-bullmq-features", "name": "worker: immediate complete", "queue": "queue-bullmq-features", "completionMode": "immediate", "ackTimeout": 300000, "concurrency": 1, "limiterMax": "", "limiterDuration": "", "x": 190, "y": 540, "wires": [["debug-worker-output"]] }, { "id": "run-manual-example", "type": "bull run", "z": "flow-bullmq-features", "name": "manual ack worker", "queue": "queue-bullmq-features", "completionMode": "manual", "ackTimeout": 300000, "concurrency": 1, "limiterMax": "", "limiterDuration": "", "x": 170, "y": 620, "wires": [["job-progress-example"]] }, { "id": "job-progress-example", "type": "bull job", "z": "flow-bullmq-features", "name": "progress 50%", "action": "progress", "x": 390, "y": 620, "wires": [["job-complete-example"]] }, { "id": "job-complete-example", "type": "bull job", "z": "flow-bullmq-features", "name": "complete job", "action": "complete", "x": 610, "y": 620, "wires": [["debug-worker-output"]] }, { "id": "events-feature-example", "type": "bull events", "z": "flow-bullmq-features", "name": "events: completed failed delayed deduped", "queue": "queue-bullmq-features", "events": "completed,failed,delayed,deduplicated,duplicated,progress", "x": 220, "y": 720, "wires": [["debug-feature-events"]] }, { "id": "inject-flow-example", "type": "inject", "z": "flow-bullmq-features", "name": "flow: parent plus child", "props": [{ "p": "payload" }], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"name\":\"parent-report\",\"queueName\":\"bullmq-features\",\"data\":{\"payload\":\"parent\"},\"children\":[{\"name\":\"child-report\",\"queueName\":\"bullmq-features\",\"data\":{\"payload\":\"child\"}}]}", "payloadType": "json", "x": 190, "y": 820, "wires": [["flow-feature-example"]] }, { "id": "flow-feature-example", "type": "bull flow", "z": "flow-bullmq-features", "name": "add parent/child flow", "queue": "queue-bullmq-features", "x": 450, "y": 820, "wires": [["debug-feature-command"]] }, { "id": "debug-feature-command", "type": "debug", "z": "flow-bullmq-features", "name": "command result", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 940, "y": 260, "wires": [] }, { "id": "debug-worker-output", "type": "debug", "z": "flow-bullmq-features", "name": "worker output", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 900, "y": 600, "wires": [] }, { "id": "debug-feature-events", "type": "debug", "z": "flow-bullmq-features", "name": "event output", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 900, "y": 720, "wires": [] } ]