先说解决方法,再说解决和分析的过程。
在 config.redis 里配置 agent: true
起因是最近在最近在尝试解决集群下单 worker schedule 的问题,但是在 start 方法中,获取不到 redis 对象。 根据 egg-schedule 文档里的建议,要在 agent.js 声明并使用 CustomScheduleStrategy,agent.js 代码如下:
// {app_root}/agent.js
module.exports = function(agent) {
class CustomStrategy extends agent.ScheduleStrategy {
start() {
// such as mq / redis subscribe
agent.redis.subscribe('remote_task', data => {
this.sendOne(data);
});
}
}
agent.schedule.use('custsom', CustomStrategy);
};
看了一眼 egg/lib/loader/agent_work_loader.js 中的代码,通过 agent.redis 实例应该可以取得到,但是没有取到。
const EggLoader = require('egg-core').EggLoader;
/**
* Agent worker process loader
* @see https://github.com/eggjs/egg-loader
*/
class AgentWorkerLoader extends EggLoader {
/**
* loadPlugin first, then loadConfig
*/
loadConfig() {
this.loadPlugin();
super.loadConfig();
}
load() {
this.loadAgentExtend();
this.loadContextExtend();
this.loadCustomAgent();
}
}
module.exports = AgentWorkerLoader;
遂有查了一下 egg-redis 的代码,发现 agent.js 里的代码:
'use strict';
const redis = require('./lib/redis');
module.exports = agent => {
if (agent.config.redis.agent) redis(agent);
};
我在想这个 agent.config.redis.agent
到底是个什么?半天才反应过来,这是个配置项 …
然后赶紧翻了一下 egg-redis/config/config.default.js
'use strict';
exports.redis = {
default: {
},
app: true,
agent: false,
...
}
于是乎,修改 config.js 里的 redis.agent = true,搞定。 整个过程下来感觉 egg-schedule 和 egg-redis 的文档里没有显式的提到这个参数的配置导致浪费了一点时间,可能大家共识就是应该去对应的配置里开启,但是总有像我一样没有考虑到的人,还是希望中间件文档能相对写的详尽一点。