问题
I have tried on two different servers to get beanstalkd up and running and do a couple tests (locally on MacOSX compiled from source, and on a CentOS server installed with yum)
I can get the server running either with
sudo beanstalkd -d -p 11300
or
sudo beanstalkd -p 11300 &
I then tried using the php lib and it just froze. Connecting directly:
telnet localhost 11300
I do the following to mimic the PHP test script:
use foo
USING foo
put 0 0 120 5
hello
INSERTED 1
reserve-with-timeout 0
TIMED_OUT
If I just run
reserve
It's stuck indefinitely.
PHP code is
/**
* BeanStalk 0.10 - Example code
*
* This is a quick example to get you started using the client.
*/
require(dirname(__FILE__).'/../src/BeanStalk.class.php');
/**
* Connect to the beanstalkd server(s)
*
* Option array:
*
* array(
* 'servers' => array( 'ip:port'[, 'ip:port'[, ...]] ),
* 'select' => 'random wait',
* 'connection_timeout' => 0.5,
* 'peek_usleep' => 2500,
* 'connection_retries' => 3,
* 'auto_unyaml' => true
* );
*
* select -> this tells the client what type of blocking to use when selecting from
* different servers. There are currently four choices:
*
* random wait: pick a random server from the list and wait for a job
*
* sequential wait: pick the next server in the list and wait for a job
*
* random peek: in a loop, pick a random server and peek-ready(), looking for a job
* until a server is found that has something available.
*
* sequential peek: in a loop, pick the next server and peek-ready() ... etc.
*
* the *peek modes have a companion setting, peek_usleep, which tells the client how long
* to usleep() for between peeks to servers.
*
* auto_unyaml -> if true, this causes the client to assume the presence of the syck yaml
* parser, and attempts to 'unyamlize' yaml output for you before returning it.
*/
echo "opening\n";
$beanstalk = BeanStalk::open(array(
'servers' => array( '127.0.0.1:11300' ),
'select' => 'random peek'
));
echo "switching tube\n";
// As in the protocol doc.
$beanstalk->use_tube('foo');
echo "putting job\n";
// As in the protocol doc.
$beanstalk->put(0, 0, 120, 'say hello world'); // Add a job to the queue with highest priority,
// no delay, 120 seconds TTR, with the contents
// 'say hello world'.
// NOTE: the put() method here supports a final optional
// argument, a tube name. If supplied, the server will
// first switch to that tube, write the job, then switch
// back to the old tube again.
echo "trying to reserve\n";
// As in the protocol doc.
$job = $beanstalk->reserve(); // Assuming there was nothing in the queue before
// we started, this will give us our 'hello world'
// job back.
echo "about to output\n";
// This is a BeanQueueJob object.
echo $job->get(); // Output: 'say hello world'
Beanstalk::delete($job); // Delete the job.
and just freezes on "trying to reserve". Original code from:
http://sourceforge.net/projects/beanstalk/
Any ideas? Thanks in advance.
回答1:
To use tubes other than default it looks like you need to add a "watch" for that tube. For example:
use foo
USING foo
put 0 0 120 5
hello
INSERTED 1
reserve-with-timeout 5
TIMED_OUT
list-tubes
OK 20
---
- default
- foo
watch foo
WATCHING 2
reserve-with-timeout 5
RESERVED 1 5
hello
This isn't too clear on the documentation, which seems to imply that the "use" command automatically has reserve commands using the tube - just as put automatically uses that tube.
Hope this helps other beanstalkd newbies!
回答2:
https://raw.github.com/kr/beanstalkd/master/doc/protocol.txt
This document is more clear.
The "use" command is for producers. Subsequent put commands will put jobs into the tube specified by this command. If no use command has been issued, jobs will be put into the tube named "default".
The "watch" command adds the named tube to the watch list for the current connection. A reserve command will take a job from any of the tubes in the watch list. For each new connection, the watch list initially consists of one tube, named "default".
so in consumer you don't need to call "use", but to call "watch"
回答3:
It's designed to block on reserve - it's waiting for a job. In another terminal, put a job into the tube - your reserve command will return with the new job.
来源:https://stackoverflow.com/questions/2818184/unable-to-reserve-a-job-with-beanstalkd