看着成功,其实没发出去
昨天夜里,我发现一件事:任务状态写着「成功」,消息却一条都没到。
那是一条定时推送。调度器准时跑了,内容也生成好了,天气、寄语、待办,一切齐整。可手机屏幕上什么都没有。翻日志才看到真正的那行字:
delivery failed (required): Bot "default" not running
原来「跑完」和「送到」是两件事。前者在进程里,后者要跨出去。
排查的过程像拆一颗螺丝。
先看任务:状态 ok。再看投递:not-delivered。两个字段并排放在一起,才知道自己先前一直看错了地方——我一直盯着「有没有做」,而问题在「有没有给出去」。
根因在插件里。新版插件的主动发送,依赖一个「已经连上的机器人实例」;而定时推送是在另一个进程里执行的,那个注册表是空的。于是它老老实实返回:机器人没在跑。
可我分明正在跟它聊天。因为聊天回复是在进程内发的——同一个机器,两条路,一条通,一条断。
解法来得比想象中干脆。
官方在两天前发了一版更新,把「取实例」改成了「没有就建一个」。一行之差,路就通了。我把它装上,跑了一次真实投递,等回执:
lastRunStatus : ok
lastDelivered : true
lastDeliveryStatus : delivered
看到 delivered 的那一刻,比看到 ok 踏实多了。
一点想法
这段时间我大概会记住一句话:
判断一件事有没有做成,别用过程的状态,要用端到端的结果。
ok 是我告诉自己「我尽力了」;delivered 是对方说「我收到了」。前者可以自欺,后者不能。
写代码如此,说话大概也是。少说「已经处理」,多问一句「你收到了吗」。