pheanstalk contracts 解析
PheanstalkInterface
这是一个连接实例的接口。
它定义了一个 beanstalkd 连接必须拥有的方法。
常量:
常量 | 描述 |
---|---|
DEFAULT_PORT = 11300 | 默认连接端口号 |
DEFAULT_DELAY = 0 | 默认延迟秒数,0 为不延迟 |
DEFAULT_PRIORITY = 1024 | 默认优先级,0 为最高优先级 |
DEFAULT_TTR = 60 | 默认 TTR 60秒 |
DEFAULT_TUBE = ‘default’ | 默认 tube |
方法
方法 | 用途 |
---|---|
bury | put 一个 buried job ,只有在 kick 后才能被 reserve |
delete | 永久删除一个 job |
ignore | 从 watchlist 中移除一个 tube |
kick | 移动指定数量的 buried 或 delayed job 到 ready 对列中,有buried 会先处理 buried |
kickJob | 将单个 job 移动到 ready 队列中,移动后仍处于该 tube |
listTubes | 当前 server 的所有 tube |
listTubesWatched | 查看当前 watchlist,可通过传入 true 还是 false ,来要求是从服务器获取,还是从缓存获取 |
listTubeUsed | 当前 use 的 tube ,传入 true , 则从服务器请求,传入 false ,则使用上一次的结果(缓存) |
pauseTube | 暂时不让 tube 内的 job 被 reserve |
resumeTube | 恢复被暂停的 Tube |
peek | 查看一个 job ,不论它处于什么 tube |
peekReady | 查看 ready 队列中下一个可被 reserve 的 job (当前 tube 中) |
peekDelayed | 查看 delayed 队列中下一个即将进入 ready 的 job (当前 tube 中) |
peekBuried | 查看下一个 buried job (当前 job 中) |
put | 放入一个 job |
release | 把一个 reserved job 重新放回 ready 队列 |
reserve | 从当前 watchlist 中锁定一个 job (接收一个 job) |
reserveWithTimeout | 有超时时间的 reserve |
statsJob | 查看一个 job 的统计信息 |
statsTube | 查看一个 tube 的统计信息 |
stats | 查看 server 的统计信息 |
touch | 为 job 延长一次 ttr |
useTube | use 一个 tube ,用于接着 put job |
watch | 把一个 tube 加入到 watchlist |
watchOnly | 往 watchlist 中加入一个 tube ,并 ignore 其他所有 tube |
JobIdInterface
方法
方法 | 描述 |
---|---|
getId | 获得 Job 的 id |
CommandInterface
pheanstalk 的设计中,每个 beanstalkd 命令都以一个类的形式呈现,想要向 beanstalkd server 发送命令,需要通过实例化各 command 类来实现。
CommandInterface 接口,是所有 command 类最抽象的形态,我们观察 pheanstalk 的源码,可以发现,AbstractCommand 抽象类实现了这个接口。
而 AbstractCommand 又会被 TubeCommand 、JobCommand 类继承,再往下,还会有具体的命令 command 类继承 Tube 和 Job command 类。
由此,我们也可以看出 pheanstalk 在代码设计上的思路:从 CommandInterface ,到 AbstractCommand ,再到 TubeCommand、JobCommand , 再到具体的命令 command ,它们便是一个典型的从抽象到具体的过程。
在此,我们可以再回去看看 beanstalkd 的协议,熟悉各种命令和用途,结合 pheanstalk 对 command 的封装过程,以提升我们在面向对象上的设计能力。
要求每一个 command 类都必须实现以下几个方法,且拥有以下几个常量。
常量
CommandInterface 的常量格式为 COMMAND_ ,如 COMMAND_PUT 、 COMMAND_USE 。
它分别定义了一系列 beanstalkd 的命令。
*之所以把 put 、 use 等命令,以常量的形式存储,是为了将「具体命令」和「具体业务逻辑」剥离,并将「具体命令」放在最高级抽象的接口中。
这样,如果 beanstalkd 更新后更改了某些命令,如,将 put 改成 put1 ,我们的 pheanstalk 只需要更新 CommandInterface 即可,而其它「相对具体」的代码中,使用的是 CommandInterface 的常量,不会受到影响。
这是利用接口解耦的思路。
而这里的常量,一般用于组装要发送到 beanstalkd server 的命令行字符串。
方法
方法 | 描述 |
---|---|
getCommandLine | 获取当前命令行的字符串形式,会返回即将发送给 beanstalkd server 的命令行字符串形式,但不包括 CRLF ,即 \r\n |
hasData | 此命令是否存在 data |
getData | 返回此命令的 data 数据 |
getDataLength | 返回此命令 data 的 bytes |
getResponseParser | 返回 ResponseParser 实例 |
ResponseInterface
这个接口,定义了一个 beanstalkd 返回实例该有的常量和方法。
常量
此接口下的所有常量,都以 RESPONSE_ 作为前缀,分别定义了 beanstalkd 可能返回的响应前缀,即响应中大写的那一部分。(可以回头参考下 beanstalkd 的协议)
这里的常量,也是用于组装 beantalkd 返回的命令行字符串。
方法
方法 | 描述 |
---|---|
getResponseName | 获取 response 的名字,一般指此 response 是哪个命令的 |
ResponseParserInterface
方法
方法 | 描述 |
---|---|
parseResponse | 将 beanstalkd 返回的命令行字符串,解析为 Response Object |
SocketFactoryInterface
方法
方法 | 描述 |
---|---|
create | 返回一个 socket 连接 |
SocketInterface
此接口定义了 Socket 类所必须存在的操作,Socket 类主要处理和 beastalkd 通信相关事项。
方法
方法 | 描述 |
---|---|
write | 向 socket 写入数据 |
read | 从 socket 读取指定字节量的数据 |
getLine | 获取下一行 |
disconnect | 关闭 socket 连接 |