我创建了一个运行cron作业的调度程序。我的代码:
protected function schedule(Schedule $schedule)
{
$user = User::first();
$schedule->job((new SoapRequest)->checkStatusApplication($user))->everyMinute();
}
任务是对Web服务进行soap调用以检查应用程序状态更改
这是checkStatusApplication
类中执行soap调用以检查的方法SoapRequest
:
<?php
namespace App\ClientRequests;
use App\User;
use SoapClient;
use SoapFault;
use SoapParam;
use SoapVar;
class SoapRequest
{
protected $password = config('application.password');
protected $wsdl;
protected $soapClient;
public function __construct()
{
$this->soapClient = $this->makeSoapClient();
}
private function makeSoapClient()
{
return new SoapClient($this->wsdl, [
'local_cert' => base_path('storage/')
'passphrase' => $this->password,
'soap_version' => SOAP_1_1,
'trace' => 1,
]);
}
public static function checkStatusApplication(User $user)
{
$init = new self;
$params = $init->makeSoapParams($init->makeXML($user));
$response = $init->request('SubmitV2', [$params]);
return $response;
}
private function request($functionName, $params)
{
try {
return $this->soapClient->__soapCall($functionName, $params);
} catch (SoapFault $e) {
log_system(' fial: ', $this->soapClient->__getLastResponse());
dd($e->getMessage());
}
}
}
INFO`:这项工作应该在后台运行。
我的要点是:我想从数据库中获取所有未被批准用于该应用程序的状态的用户,并在后台向Web服务进行soap调用,
问题假设我有200个用户需要检查状态更改。
问题 *如果来自200个用户说我的第三个请求我得到异常或api服务器已关闭,我的其他请求/调度程序会发生什么或任何想法如何处理该怎么办?如何确保我的调度程序在完成所有请求后才会再次运行示例api的超时时间。
注意我想每分钟运行一次调度程序
答案 0 :(得分:0)
您应该能够使用withoutOverlapping
方法阻止您的任务重叠。
$schedule->job((new SoapRequest)->checkStatusApplication($user))->everyMinute()->withoutOverlapping();
https://laravel.com/docs/5.5/scheduling#preventing-task-overlaps
默认情况下,即使先前的任务实例仍在运行,也会运行计划任务。为防止这种情况,您可以使用withoutOverlapping方法: