Если я отправляю задание по соединению, используя драйвер sync
, например:
$pd = SomeJob::dispatch($param)->onConnection('testing');
Задание не запускается до тех пор, пока объект PendingDispatch
, возвращенный dispatch()
, не будет уничтожен, либо когда сценарий заканчивается или другая работа была поставлена в очередь другой диспетчеризацией. Я могу позвонить $pd->__destruct()
, и он выполнит задание и заблокирует его до тех пор, пока это не будет сделано, однако задание будет выполнено во второй раз, когда PendingDispatch
будет фактически уничтожен.
Я пытался unset($pd)
, но выстрелить не имеет никакого эффекта, так как где-то в автобусе есть какая-то другая ссылка. Иногда я могу посылать диспетчеру syn c драйвер с последующим вызовом dispatch()
или dispatchNow()
, но такое поведение противоречиво.
Я думаю, что существует какой-то объект, который я могу разрешить из сервисного контейнера для принудительного выполнения задания. Буду признателен за помощь в поиске.
Но зачем мне это делать?
У меня есть кодовая база, где различные задания отправляют различные другие задания изнутри своих handle()
методов. Во время установки, тестирования и отладки бывают моменты, когда я хотел бы иметь возможность выполнять целые цепочки заданий синхронно. Вы можете увидеть мой предыдущий вопрос для некоторого контекста: Обнаружение, если задание было отправлено с использованием dispatchNow
Я мог бы заменить операторы dispatch()
условными, которые я обрисовал в своем ответе там, однако это может вызвать проблемы, так как существуют ситуации, когда dispatchNow()
вызывается в рабочей среде и не ожидается, что блокирование будет распространяться на вызываемые им задания. Для этой цели я рассмотрел создание нового соединения под названием «test», которое использует драйвер syn c, а также проверяет и передает его вместо dispatchNow()
. Есть, конечно, другие способы решения этой проблемы. Я мог бы, например, извлечь все мои задания из базового класса Job с помощью специального метода static
dispatchInTest()
и свойства inTest
и изменить код диспетчеризации в методах handle()
работ для проверки и распространения inTest
собственность на детскую работу. Возможно, я даже смогу перегрузить метод static
dispatch()
, поэтому мне даже не нужно ничего менять в методах handle()
, хотя кажется более чистым предоставить метод экземпляра в базовом классе для централизации логики c вместо.
Но меня не интересует такое решение. Я просто хочу знать, возможно ли принудительно запустить задание, только что переведенное на соединение syn c, и заблокировать его до завершения.