您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
TaskController重构到repo中(解决队列的delay无效问题)
发布时间:2024-11-08 14:53:05编辑:雪饮阅读()
-
重构岛repo中倒是问题不大。
新建如Y:\root\example-app\app\Repositories\UserTaskRepository.php
构造就随意了,然后update方法就把UserTask控制器的update方法的实现照搬过来稍微修改下
public function update($request)
{
$id=$request->input("id");
if($id){
$userTask=\App\Models\UserTask::find($id);
if (! Gate::allows('update-user-task', $userTask)) {
abort(403);
}
}
if(!$id){
$userTask=new \App\Models\UserTask();
}
$uid=$request->user()->id;
$type=$request->input("type");
$param=$request->input("param");
$userTask->uid=$uid;
$userTask->type=$type;
$userTask->param=json_encode($param);
ProcessSendEmail::dispatch($param)->delay(strtotime($param["sendTime"]));
//删除原来的job
if($id){
if($userTask->job_id){
Jobs::find($userTask->job_id)->delete();
}
//兼容处理原来的数据没有job_id
$userTask->job_id=Jobs::orderBy("id","desc")->value("id");
}
if(!$id){
$userTask->job_id=Jobs::orderBy("id","desc")->value("id");
}
$userTask->save();
}
然后原来的UserTask控制器中的update其实就可以更简化了,但我觉得无论是新增还是编辑后应该跳回user task列表,所以这里update实现如
public function update(TaskUpdateRequest $request):RedirectResponse
{
$id=$request->input("id");
$this->userTaskRepository->update($request);
return Redirect::route('user_task.index');
}
然后现在我们其实已经关联了jobID,并且如果一直新增UserTask的时候都要url输入也是不方便,所以也需要UserTask列表里面有新增按钮实现才对,所以user task列表调整如
Y:\root\example-app\resources\js\Pages\UserTask\Index.vue
在这里的li标签里面多加job id
<li>
<div>
<label>id:</label>
<span>{{task.id}}</span>
</div>
<div>
<label>jobId:</label>
<span>{{task.job_id}}</span>
</div>
<div style="display: flex;justify-content: flex-end;">
<el-link :icon="Edit" :href="'/user_task/add?id='+task.id">Edit</el-link>
</div>
</li>
并在task列表右边增加“add”按钮
<div style="display: flex;justify-content: space-between;">
<h1>task列表</h1>
<el-link :icon="Plus" :href="'/user_task/add'">Add</el-link>
</div>
同时为了更方便集成到用户资料菜单中,方便图形化从用户资料菜单导航到用户的task列表,所以Y:\root\example-app\resources\js\Layouts\AuthenticatedLayout.vue新增实现如
<DropdownLink
:href="route('user_task.index')"
>
User Task
</DropdownLink>
解决延迟投递队列不生效的问题
我默认延迟投递提交task后的10分钟。但是发现久久没有执行。
经过我排查发现php所在的容器的时间和我物理机时间相差太多。
我想要同步到北京时间
交互式进入咱们的sail容器
docker exec -it $(docker ps | grep sail|awk '{print $1}') /bin/bash
apt-get update
apt-get install system
可能需要梯子
而且解析下了使用timedatectl命令可能会报错
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
安装下面这个也不行
apt-get install systemctl
/usr/bin/timedatectl: No such file or directory
所以正确的方式是使用tzselect

最后再执行命令
TZ='Asia/Shanghai'
因为我设置的是北京时间
然后验证时间与物理机时间是否相同
date +"%Y-%m-%d %H:%M:%S"
但最后测试发现队列的delay好像还是没有执行嘛。
那么真正的端倪在于这里
$delayTime=strtotime($param["sendTime"])-time();
$param["body"]=$param["body"].",".$param["sendTime"];
ProcessSendEmail::dispatch($param)->delay($delayTime);
其实这里delay不接受字符串参数,你发现你把案例的now()->addMinutes(10)如果用var_export打印出来确实是字符串,但其实不是,用gettype得到的类型其实在object,
那么咋一看语法之下,好像意思是可以int形式的完整时间呢,其实如果这里是int形式,则是秒数,并不是从1970年以来的那种完整秒数。这点确实挺坑到我了。
调整后就ok了。
本期词汇
SCOUT 侦察兵,侦察机
ineffective 无效果的,不起作用的
above 前文述及的,上述的
关键字词:laravel11,laravel,delay,无效,队列
相关文章
- 编辑Task相关的数据验证及权限(laravel11队列关联用户
- Task编辑保存相关的逻辑(laravel11表单请求的验证消息
- Task标记完成的逻辑、新建Task相关的数据验证及权限(la
- 列出已完成和未完成的Task(laravel11队列中job完成的a
- 新建Task相关的逻辑(laravel11队列的实现)
- SOC原则与repository设计模式(laravel11)
- 项目显示相关的逻辑、resource路由与resource control
- 权限与数据归属问题的几个方法(laravel11)
- laravel11编辑项目的数据验证逻辑、同一页面多表单错
- 编辑保存项目的逻辑(laravel里的两种数据绑定)