Description
Problem scenario:
Order
Model is in mysql with a belongsTo
Relationship.
use Illuminate\Database\Eloquent\Model;
class DeviceOrder extends Model
{
protected $connection = 'mysql';
protected $table = 'device_orders';
public function device()
{
return $this->belongsTo('App\Models\Device', 'device_id');
}
}
Device
Model is MongoDB
Model (with HybridRelations
with Order
Model)
use Jenssegers\Mongodb\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
class Device extends Model
{
use HybridRelations;
...
}
I have access to Device model via Eloquent Relationships.
for example :
$order = Order::find(1);
$device = $order->device;
when I create an Event
and pass Order
Model to it. I have access to Device
model via relationships in Event Listener
when Event Listener work without Queue
.
use App\Events\NewOrderSubmitted;
class ProcessOrder # <-----------
{
public function handle(NewOrderSubmitted $event)
{
$order = $event->order;
$device = $order->device; # <-----------
Log::info('Device Info: ' . $device);
}
}
But when I implement ShouldQueue
to Listener
Class, Queue visible in Horizon
but it will timeout after about 300 seconds.
use App\Events\NewOrderSubmitted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessOrder implements ShouldQueue # <-------
{
public function handle(NewOrderSubmitted $event)
{
$order = $event->order;
$device = $order->device; # <-------
Log::info('Device Info: ' . $device);
}
}
Although it work in Queue
mode without Eloquent Relationships and just with ::find()
method.
use App\Events\NewOrderSubmitted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessOrder implements ShouldQueue # <-------
{
public function handle(NewOrderSubmitted $event)
{
$order = $event->order;
$device = Device::find($order->id); # <-------
Log::info('Device Info: ' . $device);
}
}
Timeout Error:
MongoDB\Driver\Exception\ConnectionTimeoutException: Failed to send "find" command with database "shopping": Failed to read 4 bytes: socket error or timeout in /Users/iraj/projects/project/vendor/mongodb/mongodb/src/Operation/Find.php:299
Stack trace:
#0 /Users/iraj/projects/project/vendor/mongodb/mongodb/src/Operation/Find.php(299): MongoDB\Driver\Server->executeQuery('shopping.device...', Object(MongoDB\Driver\Query), Array)
#1 /Users/iraj/projects/project/vendor/mongodb/mongodb/src/Collection.php(624): MongoDB\Operation\Find->execute(Object(MongoDB\Driver\Server))
#2 [internal function]: MongoDB\Collection->find(Array, Array)
#3 /Users/iraj/projects/project/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Collection.php(45): call_user_func_array(Array, Array)
#4 /Users/iraj/projects/project/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Query/Builder.php(394): Jenssegers\Mongodb\Collection->__call('find', Array)
#5 /Users/iraj/projects/project/vendor/jenssegers/mongodb/src/Jenssegers/Mongodb/Query/Builder.php(211): Jenssegers\Mongodb\Query\Builder->getFresh(Array)
#6 /Users/iraj/projects/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(481): Jenssegers\Mongodb\Query\Builder->get(Array)
#7 /Users/iraj/projects/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(465): Illuminate\Database\Eloquent\Builder->getModels(Array)
#8 /Users/iraj/projects/project/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(77): Illuminate\Database\Eloquent\Builder->get(Array)
I do not think it's because of real timeout problems or sothing related with connectTimeoutMS
, socketTimeoutMS
, wTimeoutMS
or maxTimeMS
options.
because in ::find()
mode it is very fast in just milliseconds.
Laravel Framework: 5.6.39
jenssegers/mongodb: 3.4.5
Laravel/horizon: v1.4.3