public function clientRequest(Client $client, ExecuteRequest $msg)
    {
        $requestId = $msg->getRequestId();
        if (!$requestId) {
            // No requestId given, generate a unique one.
            do {
                $requestId = sha1(uniqid());
            } while (isset($this->request[$requestId]));
        }

        if ($this->storage->has($requestId)) {
            $this->getLogger()->info(
                sprintf(
                    'Client %s wants to execute request %s. '.
                    'Since there already is a result for that request, '.
                    'it will be sent back immediately.',
                    bin2hex($client->getId()),
                    $requestId
                )
            );

            $this->reply(
                $client,
                new ExecuteResponse(
                    $requestId,
                    $this->storage->get($requestId)
                )
            );

            return;
        }

        // The Client always needs to receive this
        // response, so just send it right away.
        $this->reply($client, new ExecuteResponse($requestId));

        // Now actually handle the message.
        $request = $this->getRequest($requestId);

        if ($request) {
            $this->getLogger()->info(
                sprintf(
                    'Client %s wants to execute already known request %s.',
                    bin2hex($client->getId()),
                    $requestId
                )
            );

            return;
        }

        $action = $msg->getAction();
        $params = $msg->getParams();

        $this->getLogger()->info(
            sprintf(
                'New request %s from client %s for action %s',
                $requestId,
                bin2hex($client->getId()),
                $action
            )
        );

        $this->addRequest(new Request($requestId, $action, $params));

        if (!$this->storage->has($requestId)) {
            $this->addWorkerQueue($requestId);
        }
    }