20111015-2
@@ -3,18 +3,18 @@ | ||
3 | 3 | /** |
4 | 4 | * OkuyamaClientが一度のリクエストでは取得しきれないような<br> |
5 | 5 | * 大量のデータを扱う場合に利用するResultSetクラス.<br> |
6 | - * 以下のような構文にてデータを取得する | |
7 | - * 以下は、Tagを利用して全ての紐付くKeyとValueを出力している | |
8 | - * ----------------------------------------------------------------- | |
9 | - * OkuyamaResultSet resultSet = client.getTagKeysResult(tagStr); | |
6 | + * 以下のような構文にてデータを取得する<br> | |
7 | + * 以下は、Tagを利用して全ての紐付くKeyとValueを出力している<br> | |
8 | + * -----------------------------------------------------------------<br> | |
9 | + * OkuyamaResultSet resultSet = client.getTagKeysResult(tagStr);<br> | |
10 | + * <br> | |
11 | + * while(resultSet.next()) {<br> | |
12 | + * System.out.println("Key=" + (Object)resultSet.getKey());<br> | |
13 | + * System.out.println("Value=" + (Object)resultSet.getValue());<br> | |
14 | + * }<br> | |
15 | + * resultSet.close();<br> | |
16 | + * ------------------------------------------------------------------<br> | |
10 | 17 | * |
11 | - * while(resultSet.next()) { | |
12 | - * System.out.println("Key=" + (Object)resultSet.getKey()); | |
13 | - * System.out.println("Value=" + (Object)resultSet.getValue()); | |
14 | - * } | |
15 | - * resultSet.close(); | |
16 | - * ------------------------------------------------------------------ | |
17 | - * | |
18 | 18 | * |
19 | 19 | * @author T.Okuyama |
20 | 20 | * @license GPL(Lv3) |
@@ -5998,7 +5998,7 @@ | ||
5998 | 5998 | /** |
5999 | 5999 | * MasterNodeからTagを複数を指定することで紐付くKeyが取得可能な、OkuyamaResultSetを取得する.<br> |
6000 | 6000 | * Tagは打たれているが実際は既に存在しないValueが紐付くKey値は取得出来ない.<br> |
6001 | - * またANDとORを指定可能であり、getMultiTagKeysと同じように動くが、こちらを使えば一度にメモリ上に展開出来ないような、<br> | |
6001 | + * 指定したTagはANDの扱いでデータは選別される。getMultiTagKeysと同じように動くが、こちらを使えば一度にメモリ上に展開出来ないような、<br> | |
6002 | 6002 | * 大量のTagに紐付くデータを対象にする場合に向いている。少量のデータに対して複数Tagで取得したい場合は、従来通りgetMultiTagKeysを使うことを推奨する.<br> |
6003 | 6003 | * |
6004 | 6004 | * @param tagList Tag値の配列 |
@@ -6154,16 +6154,6 @@ | ||
6154 | 6154 | } |
6155 | 6155 | |
6156 | 6156 | |
6157 | - | |
6158 | - | |
6159 | - | |
6160 | - | |
6161 | - | |
6162 | - | |
6163 | - | |
6164 | - | |
6165 | - | |
6166 | - | |
6167 | 6157 | /** |
6168 | 6158 | * MasterNodeからTagとKey格納bucketのIndexを使用してKey値配列を取得する.<br> |
6169 | 6159 | * 本メソッドは、OkuyamaTagKeysResultSetクラスからの利用を想定して作成されているため、 |
@@ -4,6 +4,46 @@ | ||
4 | 4 | /** |
5 | 5 | * MasterNodeと通信を行うプログラムインターフェース<br> |
6 | 6 | * okuyamaを利用してキュー機構を実現するClient<br> |
7 | + * 利用手順としては<br> | |
8 | + * 1.MasterNodeへ接続<br> | |
9 | + * 2.createQueueSpaceメソッドで任意の名前でQueue領域を作成(既に作成済みのQueue領域を利用する場合は作成不要)<br> | |
10 | + * 3.putメソッドにデータを登録、もしくはtakeメソッドにて取り出し<br> | |
11 | + * 4.利用終了後closeを呼び出す<br> | |
12 | + * ※.Queue領域を削除する場合は | |
13 | + *<br> | |
14 | + * 実装例)<br> | |
15 | + *-----------------------------------------------------------<br> | |
16 | + * String[] masterNodeInfos = {"127.0.0.1:8888"};<br> | |
17 | + * OkuyamaQueueClient queueClient = new OkuyamaQueueClient();<br> | |
18 | + * queueClient.setConnectionInfos(masterNodeInfos);<br> | |
19 | + * // 接続<br> | |
20 | + * queueClient.autoConnect();<br> | |
21 | + * // Queue領域を作成<br> | |
22 | + * if(queueClient.createQueueSpace("QueueNameXXX1")) {<br> | |
23 | + * System.out.println("Create - Success");<br> | |
24 | + * } else {<br> | |
25 | + * System.out.println("Create - Error");<br> | |
26 | + * }<br> | |
27 | + *<br> | |
28 | + * // Queue領域名"QueueNameXXX1"にデータを登録<br> | |
29 | + * if(queueClient.put("QueueNameXXX1", "Data-0001")) {<br> | |
30 | + * System.out.println("Put - Success");<br> | |
31 | + * } else {<br> | |
32 | + * System.out.println("Put - Error");<br> | |
33 | + * }<br> | |
34 | + *<br> | |
35 | + * String takeData = null;<br> | |
36 | + * // Queue領域名"QueueNameXXX1"からデータを取得<br> | |
37 | + * takeData = queueClient.take("QueueNameXXX1", 10000);<br> | |
38 | + * if (takeData != null) {<br> | |
39 | + * System.out.println("Data NotFound");<br> | |
40 | + * } else {<br> | |
41 | + * System.out.println("Take Data = " + takeData);<br> | |
42 | + * }<br> | |
43 | + *<br> | |
44 | + * // 接続を切断<br> | |
45 | + * queueClient.close();<br> | |
46 | + *-----------------------------------------------------------<br> | |
7 | 47 | * |
8 | 48 | * @author T.Okuyama |
9 | 49 | * @license GPL(Lv3) |
@@ -26,10 +66,11 @@ | ||
26 | 66 | |
27 | 67 | /** |
28 | 68 | * Queue領域の作成.<br> |
69 | + * 既に領域が存在する場合はエラー<br> | |
29 | 70 | * |
30 | - * @param queueName 作成Queue名 | |
31 | - * @retrun boolean 成否 | |
32 | - * @throw OkuyamaClientException | |
71 | + * @param queueName 作成Queue名(上限の長さはOkuyamaClientでのKeyの最大長 - 43byte) | |
72 | + * @retrun boolean 成否 (true=作成成功/false=作成失敗) | |
73 | + * @throws OkuyamaClientException | |
33 | 74 | */ |
34 | 75 | public boolean createQueueSpace(String queueName) throws OkuyamaClientException { |
35 | 76 | boolean ret = true; |
@@ -48,17 +89,43 @@ | ||
48 | 89 | return ret; |
49 | 90 | } |
50 | 91 | |
92 | + | |
93 | + /** | |
94 | + * Queue領域を削除する.<br> | |
95 | + * 不要なデータも削除するため処理時間が長くなる可能性がある<br> | |
96 | + * | |
97 | + * @param queueName 削除Queue名 | |
98 | + * @return boolean true=削除成功/削除失敗 | |
99 | + * @throws OkuyamaClientException | |
100 | + */ | |
51 | 101 | public boolean removeQueueSpace(String queueName) throws OkuyamaClientException { |
52 | - return false; | |
102 | + boolean ret = true; | |
103 | + try { | |
104 | + | |
105 | + String[] removeIndexRet = super.removeValue(QUEUE_NAME_PREFIX + QUEUE_NAME_PREFIX_NOW_INDEX + queueName); | |
106 | + if (!removeIndexRet[0].equals("true")) return false; | |
107 | + | |
108 | + long idx = 1; | |
109 | + while (true) { | |
110 | + String[] removeDataRet = super.removeValue(QUEUE_NAME_PREFIX + QUEUE_NAME_PREFIX_NOW_POINT + queueName + "_" + idx + "_value"); | |
111 | + if (!removeDataRet[0].equals("true")) break; | |
112 | + idx++; | |
113 | + } | |
114 | + } catch (OkuyamaClientException oce) { | |
115 | + throw oce; | |
116 | + } catch (Exception e) { | |
117 | + throw new OkuyamaClientException(e); | |
118 | + } | |
119 | + return ret; | |
53 | 120 | } |
54 | 121 | |
55 | 122 | |
56 | 123 | /** |
57 | - * Queueへの登録.<br> | |
124 | + * Queueへのデータ登録.<br> | |
58 | 125 | * |
59 | - * @param queueName 指定Queue名 | |
126 | + * @param queueName 登録するQueue名 | |
60 | 127 | * @param data 登録データ |
61 | - * @retrun boolean 成否 | |
128 | + * @retrun boolean 成否 (true=登録成功/false=登録失敗) | |
62 | 129 | * @throw OkuyamaClientException |
63 | 130 | */ |
64 | 131 | public boolean put(String queueName, String data) throws OkuyamaClientException { |
@@ -95,11 +162,13 @@ | ||
95 | 162 | |
96 | 163 | |
97 | 164 | /** |
98 | - * Queueから取得.<br> | |
165 | + * Queueからデータ取得.<br> | |
166 | + * 指定したQueue名が存在しない場合はエラー<br> | |
167 | + * Queueにデータが存在しない場合は30秒待った後にnullが返る<br> | |
99 | 168 | * |
100 | - * @param queueName 指定Queue名 | |
169 | + * @param queueName 取得対象のQueue名 | |
101 | 170 | * @return 取得データ(指定時間以内に取得できない場合はnull) |
102 | - * @throw OkuyamaClientException | |
171 | + * @throws OkuyamaClientException | |
103 | 172 | */ |
104 | 173 | public String take(String queueName) throws OkuyamaClientException { |
105 | 174 | return take(queueName, 1000 * 30); |
@@ -107,12 +176,14 @@ | ||
107 | 176 | |
108 | 177 | |
109 | 178 | /** |
110 | - * Queueから取得.<br> | |
179 | + * Queueからデータ取得.<br> | |
180 | + * 指定したQueue名が存在しない場合はエラー<br> | |
181 | + * Queueにデータが存在しない場合の待ち時間を設定出来る<br> | |
111 | 182 | * |
112 | - * @param queueName 指定Queue名 | |
183 | + * @param queueName 取得対象のQueue名 | |
113 | 184 | * @param timeOut 待ち受けタイムアウト時間(ミリ秒/単位) |
114 | 185 | * @return 取得データ(指定時間以内に取得できない場合はnull) |
115 | - * @throw OkuyamaClientException | |
186 | + * @throws OkuyamaClientException | |
116 | 187 | */ |
117 | 188 | public String take(String queueName, long timeOut) throws OkuyamaClientException { |
118 | 189 |
@@ -98,16 +98,24 @@ | ||
98 | 98 | |
99 | 99 | String[] tmpTagIndexList = (String[])this.tagIndexListMap.get(this.tagStrList[idx]); |
100 | 100 | |
101 | - for (int tmpIdx = 0; tmpIdx < tmpTagIndexList.length; tmpIdx++) { | |
102 | - Map equalTagGroupMap = (Map)this.getIndexMap.get(new Integer(Integer.parseInt(tmpTagIndexList[tmpIdx]) / buketMaxLinkGroupSize)); | |
103 | - if (equalTagGroupMap != null) { | |
104 | - equalTagGroupMap.put(this.tagStrList[idx], tmpTagIndexList[tmpIdx]); | |
105 | - } else { | |
106 | - equalTagGroupMap = new HashMap(8); | |
107 | - equalTagGroupMap.put(this.tagStrList[idx], tmpTagIndexList[tmpIdx]); | |
101 | + if (tmpTagIndexList == null) { | |
102 | + // ANDの場合はどれかのTagの情報がとれないだけでしゅう終了 | |
103 | + if (this.margeType) { | |
104 | + this.getIndexMap.clear(); | |
105 | + break; | |
108 | 106 | } |
109 | - | |
110 | - this.getIndexMap.put(new Integer(Integer.parseInt(tmpTagIndexList[tmpIdx]) / buketMaxLinkGroupSize), equalTagGroupMap); | |
107 | + } else { | |
108 | + for (int tmpIdx = 0; tmpIdx < tmpTagIndexList.length; tmpIdx++) { | |
109 | + Map equalTagGroupMap = (Map)this.getIndexMap.get(new Integer(Integer.parseInt(tmpTagIndexList[tmpIdx]) / buketMaxLinkGroupSize)); | |
110 | + if (equalTagGroupMap != null) { | |
111 | + equalTagGroupMap.put(this.tagStrList[idx], tmpTagIndexList[tmpIdx]); | |
112 | + } else { | |
113 | + equalTagGroupMap = new HashMap(8); | |
114 | + equalTagGroupMap.put(this.tagStrList[idx], tmpTagIndexList[tmpIdx]); | |
115 | + } | |
116 | + | |
117 | + this.getIndexMap.put(new Integer(Integer.parseInt(tmpTagIndexList[tmpIdx]) / buketMaxLinkGroupSize), equalTagGroupMap); | |
118 | + } | |
111 | 119 | } |
112 | 120 | } |
113 | 121 |
@@ -227,8 +235,7 @@ | ||
227 | 235 | if (bucketKeysRet[0].equals("true")) { |
228 | 236 | String[] keysStrList = (String[])bucketKeysRet[1]; |
229 | 237 | for (int buketIdx = 0; buketIdx < keysStrList.length; buketIdx++) { |
230 | - | |
231 | - | |
238 | + | |
232 | 239 | margeKeyMap.put(keysStrList[buketIdx], null); |
233 | 240 | } |
234 | 241 | } |