Skip to content

access to HybridRelations Model from Queued event Listeners #1675

Closed
@irajtaghlidi

Description

@irajtaghlidi

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions