Customizing Zend_Queue

Creating your own adapter

Zend_Queue will accept any adapter that implements Zend_Queue_Adapter_AdapterAbstract. You can create your own adapter by extending one of the existing adapters, or the abstract class Zend_Queue_Adapter_AdapterAbstract. I suggest reviewing Zend_Queue_Adapter_Array as this adapter is the easiest to conceptualize.

  1. class Custom_DbForUpdate extends Zend_Queue_Adapter_Db
  2. {
  3.     /**
  4.      * @see code in tests/Zend/Queue/Custom/DbForUpdate.php
  5.      *
  6.      * Custom_DbForUpdate uses the SELECT ... FOR UPDATE to find it's rows.
  7.      * this is more likely to produce the wanted rows than the existing code.
  8.      *
  9.      * However, not all databases have SELECT ... FOR UPDATE as a feature.
  10.      *
  11.      * Note: this was later converted to be an option for Zend_Queue_Adapter_Db
  12.      *
  13.      * This code still serves as a good example.
  14.      */
  15. }
  16.  
  17. $options = array(
  18.     'name'          => 'queue1',
  19.     'driverOptions' => array(
  20.         'host'      => '127.0.0.1',
  21.         'port'      => '3306',
  22.         'username'  => 'queue',
  23.         'password'  => 'queue',
  24.         'dbname'    => 'queue',
  25.         'type'      => 'pdo_mysql'
  26.     )
  27. );
  28.  
  29. $adapter = new Custom_DbForUpdate($options);
  30. $queue = new Zend_Queue($adapter, $options);

You can also change the adapter on the fly as well.

  1. $adapter = new MyCustom_Adapter($options);
  2. $queue   = new Zend_Queue($options);
  3. $queue->setAdapter($adapter);
  4. echo "Adapter: ", get_class($queue->getAdapter()), "\n";

or

  1. $options = array(
  2.     'name'           => 'queue1',
  3.     'namespace'      => 'Custom',
  4.     'driverOptions'  => array(
  5.         'host'       => '127.0.0.1',
  6.         'port'       => '3306',
  7.         'username'   => 'queue',
  8.         'password'   => 'queue',
  9.         'dbname'     => 'queue',
  10.         'type'       => 'pdo_mysql'
  11.     )
  12. );
  13. $queue = new Zend_Queue('DbForUpdate', $config); // loads Custom_DbForUpdate

Creating your own message class

Zend_Queue will also accept your own message class. Our variables start with an underscore. For example:

  1. class Zend_Queue_Message
  2. {
  3.     protected $_data = array();
  4. }

You can extend the existing messaging class. See the example code in tests/Zend/Queue/Custom/Message.php.

Creating your own message iterator class

Zend_Queue will also accept your own message iterator class. The message iterator class is used to return messages from Zend_Queue_Adapter_Abstract::recieve(). Zend_Queue_Abstract::receive() should always return a container class like Zend_Queue_Message_Iterator, even if there is only one message.

See the example filename in tests/Zend/Queue/Custom/Messages.php.

Creating your own queue class

Zend_Queue can also be overloaded easily.

See the example filename in tests/Zend/Queue/Custom/Queue.php.

blog comments powered by Disqus