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 连接