繁体   English   中英

Symfony Messenger 触发但等待执行完成后再发送响应

[英]Symfony Messenger triggers but waits until execution is finished before sending response

这是我的问题的编辑版本,已被删除。 请不要立即投票,因为我正在寻求帮助!

我有一个控制器,它响应来自外部 API (Strava) 的 webhook 事件。 当在外部 API 中创建一个新活动时,它会向我的 webhook url 发送一个 POST。 这一切都很好。 但是,我的控制器必须在 2 秒内响应 POST。 所以我根据 symfony 文档创建了一条消息

    #[Route('/strava/webhook', name:'webhook', methods: ['POST'])]
    public function data(Request $request, MessageBusInterface $bus): Response
    {
        $bus->dispatch(new NewRideMessage($request->getContent()));
        return new Response('EVENT_RECEIVED', Response::HTTP_OK, []);
    }

然后消息由处理函数处理:

    public function __invoke(NewRideMessage $message)
    {
        //Decode json string
        $data = json_decode($message->getContent(),true);
        $aspect_type = $data['aspect_type']; // "create" | "update" | "delete"
        $object_id = $data['object_id']; // activity ID | athlete ID
        $object_type = $data['object_type']; // "activity" | "athlete"
        $owner_id = $data['owner_id']; // athlete ID

        if ($aspect_type == 'create' && $object_type == 'activity') {
            //Does ride already exist in the database
            $entityManager = $this->em->getRepository(Ride::class);
            if ($entityManager->findOneBy(['ride_id' => $object_id]) == null) {
                //Get the user
                $entityManager = $this->em->getRepository(User::class);
                $user = $entityManager->findOneBy(['stravaID' => $owner_id]);

                //set access token
                $token = $this->strava_api->getToken($user);

                //create ride object
                $ride = new Ride();
                $ride->setUser($user);
                $ride->setSource($user->getPreferredProvider());

                //get the activity from strava
                $athleteActivity = $this->strava_api->getAthleteActivity($token, $object_id);

                //if a valid activity is returned
                if ($athleteActivity) {
                    $ride->setRideId($object_id);
                    $ride->setKm($athleteActivity['distance']);
                    $ride->setAverageSpeed($athleteActivity['average']);
                    $ride->setDate($athleteActivity['date']);
                    $ride->setClubRide($this->strava_api->isClubRide($token, $object_id, $athleteActivity['date']));
                    if ($this->strava_api->isRealRide($token, $object_id)){
                        $entityManager = $this->doctrine->getManager();
//                            $entityManager->persist($ride);
//                            $entityManager->flush();
                    }
                }

                //emailmessage a message
                $emailmessage = (new Email())
                ->from(new Address($_ENV['MAILER_FROM'], 'Century Challenge Contact'))
                ->to($_ENV['MAILER_FROM'])
                ->subject('Message from Century Challenge')
                ->text('Message from: '.$_ENV['MAILER_FROM']."\n\r"."hello")
                ->addBcc('martyndwheeler@gmail.com');
                /** @var Symfony\Component\Mailer\SentMessage $sentEmail */
                $sentEmail = $this->mailer->send($emailmessage);
            }
        }
    }

我希望这会触发,然后我的回复会很快得到回复; 但是,它在接收请求和发送响应之间仍然等待几秒钟。 我是根据我之前的问题的建议这样做的,并阅读了建议的链接。 我将不胜感激任何帮助。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM