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