当前位置: 首页 > news >正文

laravel 使用异步队列,context带的上下文造成反序列化出问题

2025年5月8日17:03:44
如果你是单个应用,异步递交任务,是在应用内部使用,一般不会发生这样的问题

但是现在app项目是 app是一个应用,admin是一个应用,app吧为了接口性能吧异步任务丢给admin去执行,如果两个应用的。就会出现部分使用

   Context::add('laravel_unique_job_key', 4444);Context::addHidden('eeee', 333333);$tokenInfo = new TokenInfo();Context::add('tokenInfo', $tokenInfo);

如果 增加的 储存在上下文的value部分有对象的值的时候,比如 TokenInfo的在发送 dispatchJob($job);
就会吧 Context里面 datahidden部分会带入 payload

{"displayName": "App\\Jobs\\Job","job": "Illuminate\\Queue\\CallQueuedHandler@call","maxTries": 3,"maxExceptions": null,"failOnTimeout": false,"backoff": null,"timeout": null,"retryUntil": null,"data": {"commandName": "App\\Jobs\\Job","command": "O:27:\"App\\Jobs\\Job\":1:{s:7:\"orderId\";i:221;}"},"illuminate:log:context": {"data": {"tokenInfo": "O:40:\"App\\Http\\TokenInfo\":2:{s:4:\"uuid\";s:0:\"\";s:2:\"id\";i:0;}","zx": "i:11111;"},"hidden": {"eeee": "i:333333;"}}
}

如果admin 没有 TokenInfo的对象就会报错,

RuntimeException: Value is incomplete class: {"__PHP_Incomplete_Class_Name":"App\\Http\\TokenInfo","uuid":"","id":0} 

解决方案:
1,在上游分发异步任务的时候,就不要有 Context 相关的使用 对象类型的数据
2,在下游执行任务的项目,吧存储的对象也复制一份
3,自己封装一个分发方法


if (!function_exists('dispatchJob')) {function dispatchJob(mixed $job){//需要排除的key,这些key可能会影响队列的部分功能,需要先排除$excludeKey = ['laravel_unique_job_cache_store', 'laravel_unique_job_key'];$stay = $all = Context::all();$stayHidden = $allHidden = Context::allHidden();// 判断是否有上下文,如果没有直接 分发jobif (empty($all) && empty($allHidden)) {dispatch($job);} else {//先 forget 所有比不需要的key,dispatch 之后在还给 Context//需要删除的 context key$filterKey = Arr::except($all, $excludeKey);$filterHiddenKey = Arr::except($allHidden, $excludeKey);$keys = array_keys($filterKey);$hiddenKeys = array_keys($filterHiddenKey);// 删除不必要的keyif (!empty($keys)) {foreach ($keys as $key) {Context::forget($key);}}// 删除不必要的隐藏keyif (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::forgetHidden($hiddenKey);}}//分发任务dispatch($job);//归还上下文if (!empty($keys)) {foreach ($keys as $key) {Context::add($key, $all[$key]);}}if (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::addHidden($hiddenKey, $allHidden[$hiddenKey]);}}}}
}

相关文章:

  • day05_java中常见的运算符
  • python学生作业提交管理系统-在线作业提交系统
  • Hutool的`BeanUtil.toBean`方法详解
  • 自定义Widget开发:自定义布局实现
  • Spring Boot Controller 如何处理HTTP请求体
  • 力扣刷题Day 42:缺失的第一个正数(238)
  • javaStream流toMap小坑
  • 算法与数据结构 - 常用图算法总结
  • 视频编解码学习六之视频采集和存储
  • C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
  • 大模型备案材料解析:模型服务协议涵盖内容
  • SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
  • 【hadoop】Sqoop数据迁移工具的安装部署
  • 车载网络TOP20核心概念科普
  • 如何使用极狐GitLab 软件包仓库功能托管 ruby?
  • 3.2.3 掌握RDD转换算子 - 2. 过滤算子 - filter()
  • 按摩椅的机芯类型和材质
  • vue中router和route的区别
  • 矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践
  • 2025年3月青少年机器人技术等级考试(二级)实际操作真题试卷
  • 来论|建设性推进缅北和平进程——中国的智慧与担当
  • 乡村快递取件“跑腿费”屡禁不止?云南元江县公布举报电话
  • 国家主席习近平同普京总统举行小范围会谈
  • 华为招聘:未与任何第三方开展过任何形式的实习合作
  • 印方称若巴方决定升级局势,印方已做好反击准备
  • 诺和诺德一季度减重版司美格鲁肽收入增83%,美国市场竞争激烈下调全年业绩预期