Есть ли способ немедленно обработать ожидающую диспетчеризацию драйвера syn c блокирующим способом? - PullRequest
0 голосов
/ 20 апреля 2020

Если я отправляю задание по соединению, используя драйвер 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, и заблокировать его до завершения.

...