Okay, I've created a custom adapter class and a custom queue class, so I can
set the timeout from the send() method of my custom queue class.

I'm trying to understand the logic of the timeout variable. The database
type is a decimal (14,4). I had hoped this would be a unix timestamp. I
would be grateful if anyone knows the logic behind how this variable works
or where a doc page is. Thanks!

Also, does anyone know if I'm correct in assuming that by setting this
timeout I can properly delay my queued jobs?

Here are the custom classes in case they are helpful to anyone else (my
namespace is GM).

Queue class:

<?php

class GM_Queue extends Zend_Queue
{
  public function send($message, $timeout = null)
    {
        return $this->getAdapter()->send($message, null, $timeout);
    }
}

Adapter class:

<?php 

class GM_Queue_Adapter_Db extends Zend_Queue_Adapter_Db
{
        public function send($message, Zend_Queue $queue = null, $timeout = 
null)
        {
        if ($queue === null) {
            $queue = $this->_queue;
        }

        if (is_scalar($message)) {
            $message = (string) $message;
        }
        if (is_string($message)) {
            $message = trim($message);
        }

        if (!$this->isExists($queue->getName())) {
            require_once 'Zend/Queue/Exception.php';
            throw new Zend_Queue_Exception('Queue does not exist:' .
$queue->getName());
        }

        $msg           = $this->_messageTable->createRow();
        $msg->queue_id = $this->getQueueId($queue->getName());
        $msg->created  = time();
        $msg->body     = $message;
        $msg->md5      = md5($message);
        $msg->timeout  = $timeout;

        try {
            $msg->save();
        } catch (Exception $e) {
            require_once 'Zend/Queue/Exception.php';
            throw new Zend_Queue_Exception($e->getMessage(), $e->getCode());
        }

        $options = array(
            'queue' => $queue,
            'data'  => $msg->toArray(),
        );

        $classname = $queue->getMessageClass();
        if (!class_exists($classname)) {
            require_once 'Zend/Loader.php';
            Zend_Loader::loadClass($classname);
        }
        return new $classname($options);
        }
}

And I was hoping usage could be something like:

<?php 

$options = array(
    'name' => Zend_Registry::get('config')->queue->message->event,
    'driverOptions' =>
Zend_Registry::get('config')->queue->driverOptions->toArray()
);
$queue = new GM_Queue(new GM_Queue_Adapter_Db($options), $options);
$queue->send('Test', mktime() + 300); /* delay for 5 minutes */




DorkFest wrote:
> 
> I'm using Zend_Queue with the database adapter. And i have a job daemon
> running that checks the the queue regularly and executes jobs.
> 
> One need I have is to delay the execution of some jobs until precisely a
> certain amount of time has passed. I see each message has a timeout field
> in the table. But it doesn't seem as though Zend_Queue allows a way of
> setting this at the time you send a message to the queue (in other words,
> a timeout specific to that message).
> 
> I'm thinking the approach is to extend the Zend_Queue class and simply add
> this parameter to the send method. And then I would add that many seconds
> to the timeout field for that job. And I suppose it could be tens of
> thousands of seconds just fine (if it were weeks off, say). I wondered if
> this functionality is achievable in a simpler way currently and if anyone
> has any thoughts on this particular approach.
> 
> Thanks!
> Eddie
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Zend_Queue-and-delayed-jobs-tp26053039p26054350.html
Sent from the Zend Framework mailing list archive at Nabble.com.

Reply via email to