使用BullMQ时服务器未运行、代码无输出,如何实现延迟执行函数?
问题分析与修复
一、现有代码的问题
Redis连接配置无效
BullMQ依赖Redis作为消息中间件,你代码里的host: 'myhost'、port: 4346都是虚构配置,Redis默认是本地localhost、端口6379,若Redis未设置密码,password字段可直接移除。连接失败会导致队列完全无法工作,任务得不到处理,自然不会输出Hello World。代码执行顺序错误
你先调用await myQueue.add('my-job', {})添加任务,之后才注册process处理器。虽BullMQ会在处理器注册后重试未处理任务,但如果初始连接就失败,这个顺序问题会加重异常。正确逻辑是先注册处理器,再添加任务。未处理异步顶层代码(Node.js环境)
若在Node.js中运行这段代码,顶层await需要确保文件是ES模块(在package.json中设置"type": "module"),否则会直接报错终止代码运行。localhost:3000服务器未启动
你的代码完全没有启动HTTP服务器的逻辑(比如用Express、Node.js内置http模块),BullMQ是队列处理库,和HTTP服务无关联,所以3000端口没有服务是正常情况。若需要启动服务器,需单独编写HTTP服务代码。
二、修复后的代码示例
先确保本地已安装并启动Redis服务,修改代码如下:
import { Queue } from 'bullmq'; // 1. 创建队列,使用正确的Redis连接配置 const myQueue = new Queue('myqueue', { connection: { host: 'localhost', // Redis默认本地地址 port: 6379, // Redis默认端口 // 若Redis未设密码,移除password字段 // password: 'your-redis-password' } }); const myFunction = () => { console.log('Hello World'); }; // 2. 先注册任务处理器 myQueue.process('my-job', (job) => { myFunction(); }); // 3. 再添加任务 const job = await myQueue.add('my-job', {}); myQueue.resume();
三、实现10秒后执行指定函数
BullMQ支持通过delay参数设置任务延迟执行,单位为毫秒。修改add方法的配置即可:
// 延迟10秒(10*1000毫秒)执行任务 const job = await myQueue.add('my-job', {}, { delay: 10000 });
完整延迟执行代码示例:
import { Queue } from 'bullmq'; const myQueue = new Queue('delay-queue', { connection: { host: 'localhost', port: 6379 } }); const delayedFunction = () => { console.log('10秒后执行的函数'); }; // 注册处理器 myQueue.process('delayed-job', (job) => { delayedFunction(); }); // 添加延迟任务 await myQueue.add('delayed-job', {}, { delay: 10000 }); console.log('任务已加入队列,将在10秒后执行');
内容的提问来源于stack exchange,提问作者cwecae
相关产品推荐
相关产品推荐

