질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요.


이벤트 + 큐 로 메일을 보내고 있습니다.

큐를 쓰지 않고 이벤트로 메일이 보내지는 것은 확인하였습니다.


그런데 리스너에 implements ShouldQueue 만 붙이면 에러가 터집니다.

php artisan queue:work --tries=3 로 실행하였고요..



에러 내용은 이렇습니다.




코드는 :

라우터

Route::get('mail', function () {
	$order = new \App\Order;
	$order->company = '테스트 입니다.';
	$order->name = '고길동';
	$order->phone = '010-1234-1234';
	$order->email = 'test@test.com';
	$order->context = '이것은 저렇게 해주시고요\n 이건 저렇게 해주시고\n 이건 저렇게 해주세요\n 그리고 이건 이렇게 해주세요';
	event(new \App\Events\Mail($order));
});


이벤트


<?php

namespace App\Events;

use \App\Order;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class Mail
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $order;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Order $order)
    {
        \Illuminate\Support\Facades\Log::info('Mail Start');
        $this->order = $order;
    }

    public function get_order()
    {
        return $this->order;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}



리스너

<?php

namespace App\Listeners;

use App\Events\Mail;
use App\Order;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class MailListener implements ShouldQueue
{
    public function handle(Mail $event)
    {
         \Log::info('MailListener Start');
        $order = $event->get_order();
        $mail = \Illuminate\Support\Facades\Mail::to('nug22@naver.com')->send(new \App\Mail\OrderShipped($order));
    }
}


    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      잘 하셨습니다.

      최근(5.4) 라라벨 파운데이션 코드를 많이 들여다보진 못했는데, 기억을 더듬어보면...

      라라벨이 큐에 데이터를 넣을 때 직렬화(Serialize)를 하는데, 엘로퀀트 모델인 경우에는 모델의 ID만 넣고, 큐를 처리할 때 데이터를 역직렬화하고, 역직렬화된 ID로 모델을 재생했던 것으로 기억합니다.

      해서 유성님의 코드에서 Order 모델은 메모리에서만 존재하는 상태로 아직 ID가 부여되지 않았으므로, 큐가 작동하지 않았던 것 같습니다.

      혹시 다시 테스트하게된다면 $order→save(); 를 해 준후, event(new \App\Events\Mail($order→fresh())); 로 해 보시고 성공 여부를 여기에 다시 공유해주시면 좋겠네요.

      1. 안유성

        $order→save()를 하게 되면 DB에 저장하게 되어서 작동되는 것을 확인하였습니다.


        그런데 이번 프로젝트는 개인정보를

        자회사에 보관하지 않는 것을 원칙으로 하기 때문에,

        디비를 쓰면안되어서 어쩔수 없이 다시 배열로 돌려놓았네요 ㅠ..ㅠ


      CommentAdd your comment...
    2.  
      1
      0
      -1

      자문자답입니다.

      그냥 이벤트로 할 경우 생성자에서 

      fn_name(Order $order) 이렇게 했을 경우 문제가 없지만,

      큐의 경우는 id를 찾지 못해서 에러가 나네요..


      그래서 건네주고 받는 것을 모두 배열로 바꿔서 그냥

      fn_name($order) 식으로 했더니 처리 되었습니다.

        CommentAdd your comment...