Я работаю с заданиями по отправке обратных веб-запросов (GET) на URL-адреса, определенные пользователем.
Чтобы сохранить нагрузку на мой сервер, я хотел бы отключить доступ API к пользователю после 5 попыток (что все не удалось).
Вот полный код моей работы (исключая импорт & некоторые ненужные части кода (отключение доступа к API и т. д.).
use Exception;
class SendGetCallback implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
public $address;
public $new_transaction;
//Address $address, Transaction $new_transaction
public function __construct ($address, $new_transaction)
{
$this->address = $address;
$this->new_transaction = $new_transaction;
}
public function handle()
{
Log::info("run: " . $this->attempts());
if ($this->attempts() <= 5) {
if ($this->attempts() > 1) {
Log::info("retry part");
//retry to send the callback
try{
Log::info("try part");
//prepare webrequest
if ($res->getStatusCode() != 200 || $res->getBody()->getContents() != "*ok*")
throw new Exception('callback url not reachable');
}
//if job failed again, release job after 300 seconds
catch(Exception $e){
Log::info("catch part");
$this->release(300);
}
}
//first run of job, just process normal
else{
//prepare webrequest
if ($res->getStatusCode() != 200 || $res->getBody()->getContents() != "*ok*")
throw new Exception('callback url not reachable');
}
}
//disable API access and inform user
else{
Log::info("disable access");
Mail::to($this->address->user->email)->send(new ApiAccessDisabled($this->address->user, $this->address->merchant_access));
$merchant_access = MerchantAccess::where('id', $this->address->merchant_access->id)->first();
$merchant_access->update([
'is_online' => false,
]);
}
}
public function failed(Exception $exception)
{
Log::info("failed called!");
}
}
Я думаю, что по какой-то причине задержка, которую я использую, не сработала. Работа просто заканчивается без ожидания.
Вот часть файла журнала:
[2017-01-01 18:25:02] local.INFO: run: 2
[2017-01-01 18:25:02] local.INFO: retry part
[2017-01-01 18:25:02] local.INFO: try part
[2017-01-01 18:25:03] local.INFO: catch part
[2017-01-01 18:25:14] local.INFO: run: 3
[2017-01-01 18:25:14] local.INFO: retry part
[2017-01-01 18:25:14] local.INFO: try part
[2017-01-01 18:25:14] local.INFO: catch part
[2017-01-01 18:25:24] local.INFO: run: 4
[2017-01-01 18:25:24] local.INFO: retry part
[2017-01-01 18:25:24] local.INFO: try part
[2017-01-01 18:25:24] local.INFO: catch part
[2017-01-01 18:25:35] local.INFO: run: 5
[2017-01-01 18:25:35] local.INFO: retry part
[2017-01-01 18:25:35] local.INFO: try part
[2017-01-01 18:25:35] local.INFO: catch part
[2017-01-01 18:25:45] local.INFO: run: 6
[2017-01-01 18:25:45] local.INFO: disable access
Есть идеи, где что-то пойдет не так?
Вот как должен работать метод handle ():
—> проверить, не выполнен ли запрос get, например, когда веб-сервер пользователя находится в автономном режиме (выдает исключение) -> если да, установить задержку для задания в 5 минут
—> если задание запускалось 5 раз, доступ к API должен быть отключен (работает нормально)
Задача ещё не решена.
Других решений пока нет …