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