graze / queue

:postbox: Flexible abstraction for working with queues in PHP.
MIT License
49 stars 10 forks source link

use the result to determine acknowldegement #28

Closed h-bragg closed 8 years ago

h-bragg commented 8 years ago

Resolves: #23

Not sure if this is better than adding checks to the other AcknowledgementHandlers.

As an aside, would the message handling / acknowledgement handling be better split out into their own interfaces. The current Handlers are sort of doing 2 things.

interface MessageHandler {
    public function handle(Iterator $messages, AdapterInterface $adapter, AcknowledgerInterface $acknowledger, callable $worker);
}
class DefaultHandler implements MessageHandler {
    public function handle(Iterator $messages, AdapterInterface $adapter, AcknowledgmentInterface $acknowledger, callable $worker) {
        // Used to break from polling consumer
        $break = false;
        $done = function () use (&$break) {
            $break = true;
        };

        try {
            foreach ($messages as $message) {
                if ($message->isValid()) {
                    $result = call_user_func($worker, $message, $done);
                    $acknowledger->acknowledge($message, $adapter, $result);
                }

                if ($break) {
                    break;
                }
            }
        } catch (Exception $e) {
            $acknowledger->flush($adapter);
            throw $e;
        }

        $this->flush($adapter);
    }
}

interface AcknowledgmentInterface {
    public function acknowledge($message, $adapter, $result);
    public function flush($adapter);
}