4

When my Beanstalkd job has an error, like "exception 'ErrorException' with message 'Notice: Undefined index: id in /var/www/mysite/app/libraries/lib.php line 248' in /var/www/mysite/app/libraries/lib.php:248, how should Beanstalkd knows that an error has occured and mark it as failed so it can be retried again?

Nyxynyx
  • 61,411
  • 155
  • 482
  • 830

2 Answers2

6

Install a monitor for beanstalkd which can be useful when developing/testing your app. Some alternatives that uses PHP: http://mnapoli.github.io/phpBeanstalkdAdmin/ and https://github.com/ptrofimov/beanstalk_console

As for handling the errors, you could define your own error handler for beanstalkd jobs and in that handler decide if you want to:

  • bury (put the job aside for later inspection)
  • kick (put it back into the queue)
  • delete (remove it, if this is safe for your application)

EDIT - Did you manage to solve your problem? The best way might be to use a try/catch around your jobs to catch the exceptions, and then bury it if the exception is raised at the worker. If the exception is raised at the producer it is probably never added into the queue so no need to bury() then, but use a monitor to make sure.

If you want to try to define an own error handler for your object I´ve done something similar before by setting up a custom error handler for your class. It might be a ugly hack by trying to get the pheanstalk (job) object through $errcontext - but might be something to try.. Here is some pseudo-code I quickly put together if you want to try it out (created a subclass to avoid put code into pheanstalk class):

class MyPheanstalk extends Pheanstalk {

    function __construct() {
        //register your custom error_handler for objects of this class
        set_error_handler(array($this, 'myPheanstalk_error_handler'));

        //call parent constructor
        parent::__construct();
    }

    function myPheanstalk_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
        // get the current job that failed
        foreach($errcontext as $val) //print_r($errcontext) to find info on the object(job) you are looking for
        {
            if(is_object($val)) {
                if(get_class($val) == 'Pheanstalk') { //and replace with correct class here
                    //optionally check errstr to decide if you want to delete() or kick() instead of bury()
                    $this->bury($val);
                }
            }
        }
    }
}
am_
  • 2,378
  • 1
  • 21
  • 28
0

Its your script that has the error, not beanstalkd.

try { 

//your code from Line 248 here

} catch (ErrorException $e) { //this section catches the error.

//you can print the error
echo 'An error occurred'. $e->getMessage();
//or do something else like try reporting the ID is bad.

if (!isset($id)) {
echo 'The id was not set!';
}


} //end of try/catch
taco
  • 1,367
  • 17
  • 32