MasterManagerHelper list struct method add
@@ -874,14 +874,23 @@ | ||
874 | 874 | case 51 : |
875 | 875 | |
876 | 876 | // リスト構造を作成する |
877 | + boolean compulsiveFlg = false; | |
877 | 878 | String createListName = clientParameterList[1]; // List名 |
878 | 879 | transactionCode = clientParameterList[2]; // TransactionCode |
880 | + if (clientParameterList.length > 3 && clientParameterList[3].equals("1")) { | |
881 | + compulsiveFlg = true; // 強制作成 | |
882 | + } | |
879 | 883 | |
880 | 884 | // メソッド呼び出し |
881 | - retParams = this.createListStruct(createListName, transactionCode); | |
885 | + retParams = this.createListStruct(createListName, compulsiveFlg, transactionCode); | |
882 | 886 | retParamBuf.append(retParams[0]); |
883 | 887 | retParamBuf.append(ImdstDefine.keyHelperClientParamSep); |
884 | 888 | retParamBuf.append(retParams[1]); |
889 | + if (retParams.length > 2) { | |
890 | + retParamBuf.append(ImdstDefine.keyHelperClientParamSep); | |
891 | + retParamBuf.append(retParams[2]); | |
892 | + } | |
893 | + | |
885 | 894 | break; |
886 | 895 | case 52 : |
887 | 896 |
@@ -901,7 +910,6 @@ | ||
901 | 910 | } |
902 | 911 | break; |
903 | 912 | case 53 : |
904 | - | |
905 | 913 | // Listの後端に値を登録する |
906 | 914 | String rPushListName = clientParameterList[1]; // List名 |
907 | 915 | String rPushValue = clientParameterList[2]; // 登録する値 |
@@ -916,7 +924,6 @@ | ||
916 | 924 | retParamBuf.append(ImdstDefine.keyHelperClientParamSep); |
917 | 925 | retParamBuf.append(retParams[2]); |
918 | 926 | } |
919 | - | |
920 | 927 | break; |
921 | 928 | case 54 : |
922 | 929 |
@@ -935,6 +942,7 @@ | ||
935 | 942 | retParamBuf.append(ImdstDefine.keyHelperClientParamSep); |
936 | 943 | retParamBuf.append(retParams[2]); |
937 | 944 | } |
945 | + | |
938 | 946 | break; |
939 | 947 | case 55 : |
940 | 948 |
@@ -970,6 +978,24 @@ | ||
970 | 978 | retParamBuf.append(retParams[2]); |
971 | 979 | } |
972 | 980 | break; |
981 | + | |
982 | + case 57 : | |
983 | + | |
984 | + // Listサイズを取得する | |
985 | + String lenListName = clientParameterList[1]; // List名 | |
986 | + transactionCode = clientParameterList[2]; // TransactionCode | |
987 | + | |
988 | + // メソッド呼び出し | |
989 | + retParams = this.listLen(lenListName, transactionCode); | |
990 | + retParamBuf.append(retParams[0]); | |
991 | + retParamBuf.append(ImdstDefine.keyHelperClientParamSep); | |
992 | + retParamBuf.append(retParams[1]); | |
993 | + | |
994 | + if (retParams.length > 2) { | |
995 | + retParamBuf.append(ImdstDefine.keyHelperClientParamSep); | |
996 | + retParamBuf.append(retParams[2]); | |
997 | + } | |
998 | + break; | |
973 | 999 | case 60 : |
974 | 1000 | |
975 | 1001 | // KeyMapManagerのデータサイズを返す |
@@ -1186,6 +1212,7 @@ | ||
1186 | 1212 | closeFlg = true; |
1187 | 1213 | reloopSameClient = false; |
1188 | 1214 | } catch (ArrayIndexOutOfBoundsException aie) { |
1215 | +aie.printStackTrace(); | |
1189 | 1216 | logger.error("KeyManagerHelper No Method_1 =[" + clientParameterList[0] + "]"); |
1190 | 1217 | reloopSameClient = false; |
1191 | 1218 | } catch (NumberFormatException nfe) { |
@@ -2209,27 +2236,45 @@ | ||
2209 | 2236 | |
2210 | 2237 | |
2211 | 2238 | // リスト構造体を作成する |
2212 | - private String[] createListStruct(String listName, String transactionCode) { | |
2239 | + private String[] createListStruct(String listName, boolean compulsiveFlg, String transactionCode) { | |
2213 | 2240 | String[] retStrs = new String[3]; |
2214 | 2241 | |
2215 | 2242 | try { |
2216 | - if(!this.keyMapManager.checkError()) { | |
2243 | + if (listName.length() < ImdstDefine.saveKeyMaxSize) { | |
2217 | 2244 | |
2218 | - this.keyMapManager.createListStruct(listName, transactionCode); | |
2219 | - | |
2220 | - retStrs[0] = "51"; | |
2221 | - retStrs[1] = "true"; | |
2222 | - retStrs[2] = "OK"; | |
2245 | + if(!this.keyMapManager.checkError()) { | |
2246 | + int retSts = this.keyMapManager.createListStruct(listName, compulsiveFlg, transactionCode); | |
2247 | + | |
2248 | + if (retSts == 0) { | |
2249 | + | |
2250 | + retStrs[0] = "51"; | |
2251 | + retStrs[1] = "true"; | |
2252 | + retStrs[2] = "OK"; | |
2253 | + } else if (retSts == 2) { | |
2254 | + // 既に存在する | |
2255 | + retStrs[0] = "51"; | |
2256 | + retStrs[1] = "false"; | |
2257 | + retStrs[2] = "ListName=[" + listName + "] already exists"; | |
2258 | + } else if (retSts == 1) { | |
2259 | + retStrs[0] = "51"; | |
2260 | + retStrs[1] = "false"; | |
2261 | + retStrs[2] = "ListName=[" + listName + "] create error"; | |
2262 | + } | |
2263 | + } else { | |
2264 | + | |
2265 | + retStrs[0] = "51"; | |
2266 | + retStrs[1] = "error"; | |
2267 | + retStrs[2] = "NG:KeyMapManager - createListStruct - CheckError - NG"; | |
2268 | + } | |
2223 | 2269 | } else { |
2224 | - | |
2225 | 2270 | retStrs[0] = "51"; |
2226 | 2271 | retStrs[1] = "false"; |
2227 | - retStrs[2] = "NG:KeyMapManager - createListStruct - CheckError - NG"; | |
2272 | + retStrs[2] = "List name max length error"; | |
2228 | 2273 | } |
2229 | 2274 | } catch (BatchException be) { |
2230 | 2275 | logger.debug("KeyManagerHelper - createListStruct - Error = [" + listName + "]", be); |
2231 | 2276 | retStrs[0] = "51"; |
2232 | - retStrs[1] = "false"; | |
2277 | + retStrs[1] = "error"; | |
2233 | 2278 | retStrs[2] = "NG:KeyManagerHelper - createListStruct - Exception - " + be.toString(); |
2234 | 2279 | } |
2235 | 2280 |
@@ -2260,13 +2305,13 @@ | ||
2260 | 2305 | } else { |
2261 | 2306 | |
2262 | 2307 | retStrs[0] = "52"; |
2263 | - retStrs[1] = "false"; | |
2308 | + retStrs[1] = "error"; | |
2264 | 2309 | retStrs[2] = "NG:KeyMapManager - listLPush - CheckError - NG"; |
2265 | 2310 | } |
2266 | 2311 | } catch (BatchException be) { |
2267 | 2312 | logger.debug("KeyManagerHelper - listLPush - Error = [" + listName + "]", be); |
2268 | 2313 | retStrs[0] = "52"; |
2269 | - retStrs[1] = "false"; | |
2314 | + retStrs[1] = "error"; | |
2270 | 2315 | retStrs[2] = "NG:KeyManagerHelper - listLPush - Exception - " + be.toString(); |
2271 | 2316 | } |
2272 | 2317 |
@@ -2298,13 +2343,13 @@ | ||
2298 | 2343 | } else { |
2299 | 2344 | |
2300 | 2345 | retStrs[0] = "53"; |
2301 | - retStrs[1] = "false"; | |
2346 | + retStrs[1] = "error"; | |
2302 | 2347 | retStrs[2] = "NG:KeyMapManager - listRPush - CheckError - NG"; |
2303 | 2348 | } |
2304 | 2349 | } catch (BatchException be) { |
2305 | 2350 | logger.debug("KeyManagerHelper - listRPush - Error = [" + listName + "]", be); |
2306 | 2351 | retStrs[0] = "53"; |
2307 | - retStrs[1] = "false"; | |
2352 | + retStrs[1] = "error"; | |
2308 | 2353 | retStrs[2] = "NG:KeyManagerHelper - listRPush - Exception - " + be.toString(); |
2309 | 2354 | } |
2310 | 2355 |
@@ -2342,13 +2387,13 @@ | ||
2342 | 2387 | } else { |
2343 | 2388 | |
2344 | 2389 | retStrs[0] = "54"; |
2345 | - retStrs[1] = "false"; | |
2390 | + retStrs[1] = "error"; | |
2346 | 2391 | retStrs[2] = "NG:KeyMapManager - listGetData - CheckError - NG"; |
2347 | 2392 | } |
2348 | 2393 | } catch (BatchException be) { |
2349 | 2394 | logger.debug("KeyManagerHelper - listGetData - Error = [" + listName + "]", be); |
2350 | 2395 | retStrs[0] = "54"; |
2351 | - retStrs[1] = "false"; | |
2396 | + retStrs[1] = "error"; | |
2352 | 2397 | retStrs[2] = "NG:KeyManagerHelper - listGetData - Exception - " + be.toString(); |
2353 | 2398 | } |
2354 | 2399 |
@@ -2377,13 +2422,13 @@ | ||
2377 | 2422 | } else { |
2378 | 2423 | |
2379 | 2424 | retStrs[0] = "55"; |
2380 | - retStrs[1] = "false"; | |
2425 | + retStrs[1] = "error"; | |
2381 | 2426 | retStrs[2] = "NG:KeyMapManager - listLPop - CheckError - NG"; |
2382 | 2427 | } |
2383 | 2428 | } catch (BatchException be) { |
2384 | 2429 | logger.debug("KeyManagerHelper - listLPop - Error = [" + listName + "]", be); |
2385 | 2430 | retStrs[0] = "55"; |
2386 | - retStrs[1] = "false"; | |
2431 | + retStrs[1] = "error"; | |
2387 | 2432 | retStrs[2] = "NG:KeyManagerHelper - listGetData - Exception - " + be.toString(); |
2388 | 2433 | } |
2389 | 2434 |
@@ -2411,13 +2456,13 @@ | ||
2411 | 2456 | } else { |
2412 | 2457 | |
2413 | 2458 | retStrs[0] = "56"; |
2414 | - retStrs[1] = "false"; | |
2459 | + retStrs[1] = "error"; | |
2415 | 2460 | retStrs[2] = "NG:KeyMapManager - listRPop - CheckError - NG"; |
2416 | 2461 | } |
2417 | 2462 | } catch (BatchException be) { |
2418 | 2463 | logger.debug("KeyManagerHelper - listRPop - Error = [" + listName + "]", be); |
2419 | 2464 | retStrs[0] = "56"; |
2420 | - retStrs[1] = "false"; | |
2465 | + retStrs[1] = "error"; | |
2421 | 2466 | retStrs[2] = "NG:KeyManagerHelper - listRPop - Exception - " + be.toString(); |
2422 | 2467 | } |
2423 | 2468 |
@@ -2425,7 +2470,41 @@ | ||
2425 | 2470 | } |
2426 | 2471 | |
2427 | 2472 | |
2473 | + // リスト構造体のサイズを取得する | |
2474 | + private String[] listLen(String listName, String transactionCode) { | |
2475 | + String[] retStrs = new String[3]; | |
2428 | 2476 | |
2477 | + try { | |
2478 | + if(!this.keyMapManager.checkError()) { | |
2479 | + | |
2480 | + String ret = this.keyMapManager.listLen(listName, transactionCode); | |
2481 | + if (ret != null) { | |
2482 | + | |
2483 | + retStrs[0] = "57"; | |
2484 | + retStrs[1] = "true"; | |
2485 | + retStrs[2] = ret; | |
2486 | + } else { | |
2487 | + retStrs = new String[2]; | |
2488 | + retStrs[0] = "57"; | |
2489 | + retStrs[1] = "false"; | |
2490 | + } | |
2491 | + } else { | |
2492 | + | |
2493 | + retStrs[0] = "57"; | |
2494 | + retStrs[1] = "false"; | |
2495 | + retStrs[2] = "NG:KeyMapManager - listLen - CheckError - NG"; | |
2496 | + } | |
2497 | + } catch (BatchException be) { | |
2498 | + logger.debug("KeyManagerHelper - listLen - Error = [" + listName + "]", be); | |
2499 | + retStrs[0] = "57"; | |
2500 | + retStrs[1] = "false"; | |
2501 | + retStrs[2] = "NG:KeyManagerHelper - listLen - Exception - " + be.toString(); | |
2502 | + } | |
2503 | + | |
2504 | + return retStrs; | |
2505 | + } | |
2506 | + | |
2507 | + | |
2429 | 2508 | /** |
2430 | 2509 | * Clientとの接続を切断する.<br> |
2431 | 2510 | * |
@@ -860,6 +860,41 @@ | ||
860 | 860 | retParams[1] = "false"; |
861 | 861 | } |
862 | 862 | break; |
863 | + case 51 : | |
864 | + | |
865 | + // List構造体を作成する | |
866 | + retParams = this.createListStruct(clientParameterList[1], clientParameterList[2]); | |
867 | + break; | |
868 | + case 52 : | |
869 | + | |
870 | + // List構造の先頭に値を追加する | |
871 | + retParams = this.listLPush(clientParameterList[1], clientParameterList[2], clientParameterList[3]); | |
872 | + break; | |
873 | + case 53 : | |
874 | + | |
875 | + // List構造の末尾に値を追加する | |
876 | + retParams = this.listRPush(clientParameterList[1], clientParameterList[2], clientParameterList[3]); | |
877 | + break; | |
878 | + case 54 : | |
879 | + | |
880 | + // List構造からIndex指定で値を取得する | |
881 | + retParams = this.listIndex(clientParameterList[1], clientParameterList[2], clientParameterList[3]); | |
882 | + break; | |
883 | + case 55 : | |
884 | + | |
885 | + // List構造の先頭から値を取得する | |
886 | + retParams = this.listLPop(clientParameterList[1], clientParameterList[2]); | |
887 | + break; | |
888 | + case 56 : | |
889 | + | |
890 | + // List構造の末尾から値を取得する | |
891 | + retParams = this.listRPop(clientParameterList[1], clientParameterList[2]); | |
892 | + break; | |
893 | + case 57 : | |
894 | + | |
895 | + // List構造のサイズを取得する | |
896 | + retParams = this.listLen(clientParameterList[1], clientParameterList[2]); | |
897 | + break; | |
863 | 898 | case 61 : |
864 | 899 | |
865 | 900 | if (StatusUtil.isMainMasterNode()) { |
@@ -2035,8 +2070,734 @@ | ||
2035 | 2070 | return retStrs; |
2036 | 2071 | } |
2037 | 2072 | |
2073 | + /** | |
2074 | + * List構造を作成する.<br> | |
2075 | + * 既に作成済みの場合は失敗する.<br> | |
2076 | + * | |
2077 | + * @param listNameStr List名文字列 | |
2078 | + * @return String[] 結果 | |
2079 | + * @throws BatchException | |
2080 | + */ | |
2081 | + private String[] createListStruct(String listNameStr, String transactionCode) throws BatchException { | |
2082 | + //logger.debug("MasterManagerHelper - createListStruct - start"); | |
2083 | + String[] retStrs = new String[3]; | |
2038 | 2084 | |
2085 | + // data部分はブランクの場合はブランク規定文字列で送られてくるのでそのまま保存する | |
2086 | + String[] tagKeyPair = null; | |
2087 | + String[] keyNodeSaveRet = null; | |
2088 | + | |
2089 | + | |
2090 | + try { | |
2091 | + | |
2092 | + if (DataDispatcher.hasOldRule()) { | |
2093 | + // DataNode追加処理中は本メソッドはエラーとなる。 | |
2094 | + // これは完全性を維持することが出来ないためである。 | |
2095 | + retStrs[0] = "51"; | |
2096 | + retStrs[1] = "false"; | |
2097 | + retStrs[2] = "This method cannot use during \"DataNode\" addition processing."; | |
2098 | + return retStrs; | |
2099 | + } | |
2100 | + | |
2101 | + // KeyをIsolation変換実行 | |
2102 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2103 | + | |
2104 | + // Key値チェック | |
2105 | + if (!this.checkKeyLength(listNameStr)) { | |
2106 | + // 保存失敗 | |
2107 | + retStrs[0] = "51"; | |
2108 | + retStrs[1] = "false"; | |
2109 | + retStrs[2] = "List name Length Error"; | |
2110 | + return retStrs; | |
2111 | + } | |
2112 | + | |
2113 | + // List名で作成をする | |
2114 | + // 保存先問い合わせ | |
2115 | + String[] keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2116 | + | |
2117 | + | |
2118 | + // 保存実行 | |
2119 | + // スレーブKeyNodeが存在する場合で値を変更 | |
2120 | + if (keyNodeInfo.length == 3) { | |
2121 | + keyNodeSaveRet = this.createListStruct(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], null, null, null, listNameStr, transactionCode); | |
2122 | + } else if (keyNodeInfo.length == 6) { | |
2123 | + keyNodeSaveRet = this.createListStruct(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, transactionCode); | |
2124 | + } else if (keyNodeInfo.length == 9) { | |
2125 | + keyNodeSaveRet = this.createListStruct(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, transactionCode); | |
2126 | + } | |
2127 | + | |
2128 | + | |
2129 | + // 保存結果確認 | |
2130 | + if (keyNodeSaveRet[1].equals("false")) { | |
2131 | + // 保存失敗 | |
2132 | + retStrs[0] = "51"; | |
2133 | + retStrs[1] = "false"; | |
2134 | + retStrs[2] = keyNodeSaveRet[2]; | |
2135 | + | |
2136 | + return retStrs; | |
2137 | + } | |
2138 | + | |
2139 | + | |
2140 | + retStrs[0] = "51"; | |
2141 | + retStrs[1] = "true"; | |
2142 | + retStrs[2] = "OK"; | |
2143 | + | |
2144 | + } catch (BatchException be) { | |
2145 | + | |
2146 | + logger.info("MasterManagerHelper - createListStruct - Error", be); | |
2147 | + retStrs[0] = "51"; | |
2148 | + retStrs[1] = "error"; | |
2149 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2150 | + } catch (Exception e) { | |
2151 | + logger.info("MasterManagerHelper - createListStruct - Error", e); | |
2152 | + retStrs[0] = "51"; | |
2153 | + retStrs[1] = "false"; | |
2154 | + retStrs[2] = "MasterNode - Exception"; | |
2155 | + } | |
2156 | + //logger.debug("MasterManagerHelper - createListStruct - end"); | |
2157 | + return retStrs; | |
2158 | + } | |
2159 | + | |
2160 | + | |
2039 | 2161 | /** |
2162 | + * List構造の先頭に値を追加する.<br> | |
2163 | + * 構造体を事前に作成していない場合は失敗する<br> | |
2164 | + * | |
2165 | + * @param listNameStr List名文字列 | |
2166 | + * @param listData Listへ追加するデータ | |
2167 | + * @return String[] 結果 | |
2168 | + * @throws BatchException | |
2169 | + */ | |
2170 | + private String[] listLPush(String listNameStr, String listData, String transactionCode) throws BatchException { | |
2171 | + //logger.debug("MasterManagerHelper - listLPush - start"); | |
2172 | + String[] retStrs = new String[3]; | |
2173 | + | |
2174 | + // data部分はブランクの場合はブランク規定文字列で送られてくるのでそのまま保存する | |
2175 | + String[] tagKeyPair = null; | |
2176 | + String[] keyNodeSaveRet = null; | |
2177 | + | |
2178 | + | |
2179 | + try { | |
2180 | + | |
2181 | + if (DataDispatcher.hasOldRule()) { | |
2182 | + // DataNode追加処理中は本メソッドはエラーとなる。 | |
2183 | + // これは完全性を維持することが出来ないためである。 | |
2184 | + retStrs[0] = "52"; | |
2185 | + retStrs[1] = "false"; | |
2186 | + retStrs[2] = "This method cannot use during \"DataNode\" addition processing."; | |
2187 | + return retStrs; | |
2188 | + } | |
2189 | + | |
2190 | + // KeyをIsolation変換実行 | |
2191 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2192 | + | |
2193 | + // Key値チェック | |
2194 | + if (!this.checkKeyLength(listNameStr)) { | |
2195 | + // 保存失敗 | |
2196 | + retStrs[0] = "52"; | |
2197 | + retStrs[1] = "false"; | |
2198 | + retStrs[2] = "List name Length Error"; | |
2199 | + return retStrs; | |
2200 | + } | |
2201 | + | |
2202 | + | |
2203 | + // Data値チェック | |
2204 | + if (!this.checkValueLength(listData)) { | |
2205 | + // 保存失敗 | |
2206 | + retStrs[0] = "52"; | |
2207 | + retStrs[1] = "false"; | |
2208 | + retStrs[2] = "listData Length Error"; | |
2209 | + return retStrs; | |
2210 | + } | |
2211 | + | |
2212 | + // List名で作成をする | |
2213 | + // 保存先問い合わせ | |
2214 | + String[] keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2215 | + | |
2216 | + | |
2217 | + // 保存実行 | |
2218 | + // スレーブKeyNodeが存在する場合で値を変更 | |
2219 | + if (keyNodeInfo.length == 3) { | |
2220 | + keyNodeSaveRet = this.listLPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], null, null, null, listNameStr, listData, transactionCode); | |
2221 | + } else if (keyNodeInfo.length == 6) { | |
2222 | + keyNodeSaveRet = this.listLPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, listData, transactionCode); | |
2223 | + } else if (keyNodeInfo.length == 9) { | |
2224 | + keyNodeSaveRet = this.listLPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, listData, transactionCode); | |
2225 | + } | |
2226 | + | |
2227 | + | |
2228 | + // 保存結果確認 | |
2229 | + if (keyNodeSaveRet[1].equals("false") || keyNodeSaveRet[1].equals("false")) { | |
2230 | + // 保存失敗 | |
2231 | + if (keyNodeSaveRet.length > 2) { | |
2232 | + | |
2233 | + retStrs[0] = "52"; | |
2234 | + retStrs[1] = "false"; | |
2235 | + retStrs[2] = keyNodeSaveRet[2]; | |
2236 | + } else { | |
2237 | + retStrs = new String[2]; | |
2238 | + | |
2239 | + retStrs[0] = "52"; | |
2240 | + retStrs[1] = keyNodeSaveRet[1]; | |
2241 | + } | |
2242 | + return retStrs; | |
2243 | + } | |
2244 | + | |
2245 | + // 成功 | |
2246 | + retStrs[0] = "52"; | |
2247 | + retStrs[1] = "true"; | |
2248 | + retStrs[2] = "OK"; | |
2249 | + | |
2250 | + } catch (BatchException be) { | |
2251 | + | |
2252 | + logger.info("MasterManagerHelper - listLPush - Error", be); | |
2253 | + retStrs[0] = "52"; | |
2254 | + retStrs[1] = "error"; | |
2255 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2256 | + } catch (Exception e) { | |
2257 | + logger.info("MasterManagerHelper - listLPush - Error", e); | |
2258 | + retStrs[0] = "52"; | |
2259 | + retStrs[1] = "false"; | |
2260 | + retStrs[2] = "MasterNode - Exception"; | |
2261 | + } | |
2262 | + //logger.debug("MasterManagerHelper - listLPush - end"); | |
2263 | + return retStrs; | |
2264 | + } | |
2265 | + | |
2266 | + | |
2267 | + /** | |
2268 | + * List構造の最後尾に値を追加する.<br> | |
2269 | + * 構造体を事前に作成していない場合は失敗する<br> | |
2270 | + * | |
2271 | + * @param listNameStr List名文字列 | |
2272 | + * @param listData Listへ追加するデータ | |
2273 | + * @return String[] 結果 | |
2274 | + * @throws BatchException | |
2275 | + */ | |
2276 | + private String[] listRPush(String listNameStr, String listData, String transactionCode) throws BatchException { | |
2277 | + //logger.debug("MasterManagerHelper - listRPush - start"); | |
2278 | + String[] retStrs = new String[3]; | |
2279 | + | |
2280 | + // data部分はブランクの場合はブランク規定文字列で送られてくるのでそのまま保存する | |
2281 | + String[] tagKeyPair = null; | |
2282 | + String[] keyNodeSaveRet = null; | |
2283 | + | |
2284 | + | |
2285 | + try { | |
2286 | + | |
2287 | + if (DataDispatcher.hasOldRule()) { | |
2288 | + // DataNode追加処理中は本メソッドはエラーとなる。 | |
2289 | + // これは完全性を維持することが出来ないためである。 | |
2290 | + retStrs[0] = "53"; | |
2291 | + retStrs[1] = "false"; | |
2292 | + retStrs[2] = "This method cannot use during \"DataNode\" addition processing."; | |
2293 | + return retStrs; | |
2294 | + } | |
2295 | + | |
2296 | + // KeyをIsolation変換実行 | |
2297 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2298 | + | |
2299 | + // Key値チェック | |
2300 | + if (!this.checkKeyLength(listNameStr)) { | |
2301 | + // 保存失敗 | |
2302 | + retStrs[0] = "53"; | |
2303 | + retStrs[1] = "false"; | |
2304 | + retStrs[2] = "List name Length Error"; | |
2305 | + return retStrs; | |
2306 | + } | |
2307 | + | |
2308 | + | |
2309 | + // Data値チェック | |
2310 | + if (!this.checkValueLength(listData)) { | |
2311 | + // 保存失敗 | |
2312 | + retStrs[0] = "53"; | |
2313 | + retStrs[1] = "false"; | |
2314 | + retStrs[2] = "listData Length Error"; | |
2315 | + return retStrs; | |
2316 | + } | |
2317 | + | |
2318 | + // List名で作成をする | |
2319 | + // 保存先問い合わせ | |
2320 | + String[] keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2321 | + | |
2322 | + | |
2323 | + // 保存実行 | |
2324 | + // スレーブKeyNodeが存在する場合で値を変更 | |
2325 | + if (keyNodeInfo.length == 3) { | |
2326 | + keyNodeSaveRet = this.listRPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], null, null, null, listNameStr, listData, transactionCode); | |
2327 | + } else if (keyNodeInfo.length == 6) { | |
2328 | + keyNodeSaveRet = this.listRPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, listData, transactionCode); | |
2329 | + } else if (keyNodeInfo.length == 9) { | |
2330 | + keyNodeSaveRet = this.listRPush(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, listData, transactionCode); | |
2331 | + } | |
2332 | + | |
2333 | + | |
2334 | + // 保存結果確認 | |
2335 | + if (keyNodeSaveRet[1].equals("false") || keyNodeSaveRet[1].equals("false")) { | |
2336 | + // 保存失敗 | |
2337 | + if (keyNodeSaveRet.length > 2) { | |
2338 | + | |
2339 | + retStrs[0] = "53"; | |
2340 | + retStrs[1] = "false"; | |
2341 | + retStrs[2] = keyNodeSaveRet[2]; | |
2342 | + } else { | |
2343 | + retStrs = new String[2]; | |
2344 | + | |
2345 | + retStrs[0] = "53"; | |
2346 | + retStrs[1] = keyNodeSaveRet[1]; | |
2347 | + } | |
2348 | + return retStrs; | |
2349 | + } | |
2350 | + | |
2351 | + // 成功 | |
2352 | + retStrs[0] = "53"; | |
2353 | + retStrs[1] = "true"; | |
2354 | + retStrs[2] = "OK"; | |
2355 | + | |
2356 | + } catch (BatchException be) { | |
2357 | + | |
2358 | + logger.info("MasterManagerHelper - listRPush - Error", be); | |
2359 | + retStrs[0] = "53"; | |
2360 | + retStrs[1] = "error"; | |
2361 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2362 | + } catch (Exception e) { | |
2363 | + logger.info("MasterManagerHelper - listRPush - Error", e); | |
2364 | + retStrs[0] = "53"; | |
2365 | + retStrs[1] = "false"; | |
2366 | + retStrs[2] = "MasterNode - Exception"; | |
2367 | + } | |
2368 | + //logger.debug("MasterManagerHelper - listRPush - end"); | |
2369 | + return retStrs; | |
2370 | + } | |
2371 | + | |
2372 | + | |
2373 | + /** | |
2374 | + * List構造の指定Indexの値を取得する.<br> | |
2375 | + * 構造体を事前に作成していない場合は失敗する<br> | |
2376 | + * 指定位置が存在しない場合は結果はなしとなる<br> | |
2377 | + * | |
2378 | + * @param listNameStr List名文字列 | |
2379 | + * @param listData Listへ追加するデータ | |
2380 | + * @return String[] 結果 | |
2381 | + * @throws BatchException | |
2382 | + */ | |
2383 | + private String[] listIndex(String listNameStr, String index, String transactionCode) throws BatchException { | |
2384 | + //logger.debug("MasterManagerHelper - listIndex - start"); | |
2385 | + String[] retStrs = new String[3]; | |
2386 | + | |
2387 | + // data部分はブランクの場合はブランク規定文字列で送られてくるのでそのまま保存する | |
2388 | + String[] tagKeyPair = null; | |
2389 | + String[] keyNodeListIndexRet = null; | |
2390 | + | |
2391 | + | |
2392 | + try { | |
2393 | + | |
2394 | + if (DataDispatcher.hasOldRule()) { | |
2395 | + // DataNode追加処理中は本メソッドはエラーとなる。 | |
2396 | + // これは完全性を維持することが出来ないためである。 | |
2397 | + retStrs[0] = "54"; | |
2398 | + retStrs[1] = "false"; | |
2399 | + retStrs[2] = "This method cannot use during \"DataNode\" addition processing."; | |
2400 | + return retStrs; | |
2401 | + } | |
2402 | + | |
2403 | + // KeyをIsolation変換実行 | |
2404 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2405 | + | |
2406 | + // Key値チェック | |
2407 | + if (!this.checkKeyLength(listNameStr)) { | |
2408 | + // List名が長すぎる | |
2409 | + retStrs[0] = "54"; | |
2410 | + retStrs[1] = "false"; | |
2411 | + retStrs[2] = "List name Length Error"; | |
2412 | + return retStrs; | |
2413 | + } | |
2414 | + | |
2415 | + // Indexが数字であるかチェック | |
2416 | + try { | |
2417 | + Long indexChk = new Long(index); | |
2418 | + } catch (NumberFormatException nfe) { | |
2419 | + // 保存失敗 | |
2420 | + retStrs[0] = "54"; | |
2421 | + retStrs[1] = "false"; | |
2422 | + retStrs[2] = "Please specify \"index\" numerically."; | |
2423 | + return retStrs; | |
2424 | + } | |
2425 | + | |
2426 | + | |
2427 | + // List名で作成をする | |
2428 | + // 保存先問い合わせ | |
2429 | + String[] keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2430 | + | |
2431 | + | |
2432 | + // 保存実行 | |
2433 | + // スレーブKeyNodeが存在する場合で値を変更 | |
2434 | + if (keyNodeInfo.length == 3) { | |
2435 | + keyNodeListIndexRet = this.listIndex(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], null, null, null, listNameStr, index, transactionCode); | |
2436 | + } else if (keyNodeInfo.length == 6) { | |
2437 | + keyNodeListIndexRet = this.listIndex(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, index, transactionCode); | |
2438 | + } else if (keyNodeInfo.length == 9) { | |
2439 | + keyNodeListIndexRet = this.listIndex(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, index, transactionCode); | |
2440 | + } | |
2441 | + | |
2442 | + | |
2443 | + // 保存結果確認 | |
2444 | + if (keyNodeListIndexRet[1].equals("false")) { | |
2445 | + // 値なし | |
2446 | + retStrs[0] = "54"; | |
2447 | + retStrs[1] = "false"; | |
2448 | + retStrs[2] = ""; | |
2449 | + return retStrs; | |
2450 | + } else if (keyNodeListIndexRet[1].equals("true")) { | |
2451 | + // 値あり | |
2452 | + retStrs[0] = keyNodeListIndexRet[0]; | |
2453 | + retStrs[1] = "true"; | |
2454 | + retStrs[2] = keyNodeListIndexRet[2]; | |
2455 | + } else { | |
2456 | + // Error | |
2457 | + retStrs[0] = "54"; | |
2458 | + retStrs[1] = "error"; | |
2459 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2460 | + } | |
2461 | + } catch (BatchException be) { | |
2462 | + | |
2463 | + logger.info("MasterManagerHelper - listIndex - Error", be); | |
2464 | + retStrs[0] = "54"; | |
2465 | + retStrs[1] = "error"; | |
2466 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2467 | + } catch (Exception e) { | |
2468 | + logger.info("MasterManagerHelper - listIndex - Error", e); | |
2469 | + retStrs[0] = "54"; | |
2470 | + retStrs[1] = "error"; | |
2471 | + retStrs[2] = "MasterNode - Exception"; | |
2472 | + } | |
2473 | + //logger.debug("MasterManagerHelper - listIndex - end"); | |
2474 | + return retStrs; | |
2475 | + } | |
2476 | + | |
2477 | + | |
2478 | + /** | |
2479 | + * 指定したList構造体の先頭から要素を取得する。取得された要素は削除されListは先頭から1つ詰められる.<br> | |
2480 | + * 要素が存在しない場合はnullが返る。リストが存在しない場合はエラーとなる<br> | |
2481 | + * | |
2482 | + * @param listNameStr | |
2483 | + * @param transactionCode | |
2484 | + * @return String[] 結果 | |
2485 | + * @throws BatchException | |
2486 | + */ | |
2487 | + private String[] listLPop(String listNameStr, String transactionCode) throws BatchException { | |
2488 | + //logger.debug("MasterManagerHelper - listLPop - start"); | |
2489 | + String[] retStrs = new String[3]; | |
2490 | + | |
2491 | + String[] keyNodeRet = null; | |
2492 | + String[] keyNodeInfo = null; | |
2493 | + | |
2494 | + try { | |
2495 | + | |
2496 | + // Isolation変換実行 | |
2497 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2498 | + | |
2499 | + if (!this.checkKeyLength(listNameStr)) { | |
2500 | + // 保存失敗 | |
2501 | + retStrs[0] = "55"; | |
2502 | + retStrs[1] = "false"; | |
2503 | + retStrs[2] = "List name Length Error"; | |
2504 | + return retStrs; | |
2505 | + } | |
2506 | + | |
2507 | + // キー値を使用して取得先を決定 | |
2508 | + keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2509 | + | |
2510 | + // 取得実行 | |
2511 | + // Main | |
2512 | + try { | |
2513 | + if (keyNodeInfo.length > 2) { | |
2514 | + keyNodeRet = this.listLPop(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], listNameStr, transactionCode); | |
2515 | + } | |
2516 | + if (keyNodeRet == null) { | |
2517 | + throw new Exception(""); | |
2518 | + } | |
2519 | + } catch (Exception e1) { | |
2520 | + keyNodeRet = new String[3]; | |
2521 | + keyNodeRet[0] = "55"; | |
2522 | + keyNodeRet[1] = "error"; | |
2523 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2524 | + } | |
2525 | + | |
2526 | + // Sub | |
2527 | + try { | |
2528 | + if (keyNodeInfo.length > 5) { | |
2529 | + String[] retTmp = this.listLPop(keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, transactionCode); | |
2530 | + if (keyNodeRet != null && keyNodeRet.length > 1 && keyNodeRet[1].equals("error")) { | |
2531 | + keyNodeRet = retTmp; | |
2532 | + } | |
2533 | + } | |
2534 | + | |
2535 | + if (keyNodeRet == null) { | |
2536 | + throw new Exception(""); | |
2537 | + } | |
2538 | + } catch (Exception e2) { | |
2539 | + keyNodeRet = new String[3]; | |
2540 | + keyNodeRet[0] = "55"; | |
2541 | + keyNodeRet[1] = "error"; | |
2542 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2543 | + } | |
2544 | + | |
2545 | + | |
2546 | + // Third | |
2547 | + try { | |
2548 | + if (keyNodeInfo.length > 8) { | |
2549 | + String[] retTmp = this.listLPop(keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, transactionCode); | |
2550 | + if (keyNodeRet != null && keyNodeRet.length > 1 && keyNodeRet[1].equals("error")) { | |
2551 | + keyNodeRet = retTmp; | |
2552 | + } | |
2553 | + } | |
2554 | + | |
2555 | + if (keyNodeRet == null) { | |
2556 | + throw new Exception(""); | |
2557 | + } | |
2558 | + } catch (Exception e2) { | |
2559 | + keyNodeRet = new String[3]; | |
2560 | + keyNodeRet[0] = "55"; | |
2561 | + keyNodeRet[1] = "error"; | |
2562 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2563 | + } | |
2564 | + | |
2565 | + // 取得結果確認 | |
2566 | + if (keyNodeRet[1].equals("false")) { | |
2567 | + | |
2568 | + // 取得失敗(データなし) | |
2569 | + retStrs[0] = "55"; | |
2570 | + retStrs[1] = "false"; | |
2571 | + retStrs[2] = ""; | |
2572 | + } else if (keyNodeRet != null && keyNodeRet.length > 2) { | |
2573 | + | |
2574 | + // trueもしくはerrorの可能性あり | |
2575 | + retStrs[0] = "55"; | |
2576 | + retStrs[1] = keyNodeRet[1]; | |
2577 | + retStrs[2] = keyNodeRet[2]; | |
2578 | + } else { | |
2579 | + retStrs[0] = "55"; | |
2580 | + retStrs[1] = "error"; | |
2581 | + retStrs[2] = "DataNode - Exception"; | |
2582 | + } | |
2583 | + } catch (Exception e) { | |
2584 | + logger.error("MasterManagerHelper - listLPop - Error", e); | |
2585 | + retStrs[0] = "55"; | |
2586 | + retStrs[1] = "error"; | |
2587 | + retStrs[2] = "MasterNode - Exception"; | |
2588 | + } | |
2589 | + //logger.debug("MasterManagerHelper - listLPop - end"); | |
2590 | + return retStrs; | |
2591 | + } | |
2592 | + | |
2593 | + | |
2594 | + | |
2595 | + /** | |
2596 | + * 指定したList構造体の末尾から要素を取得する。取得された要素は削除されListは末尾が1つ詰められる.<br> | |
2597 | + * 要素が存在しない場合はnullが返る。リストが存在しない場合はエラーとなる<br> | |
2598 | + * | |
2599 | + * @param listNameStr | |
2600 | + * @param transactionCode | |
2601 | + * @return String[] 結果 | |
2602 | + * @throws BatchException | |
2603 | + */ | |
2604 | + private String[] listRPop(String listNameStr, String transactionCode) throws BatchException { | |
2605 | + //logger.debug("MasterManagerHelper - listLPop - start"); | |
2606 | + String[] retStrs = new String[3]; | |
2607 | + | |
2608 | + String[] keyNodeRet = null; | |
2609 | + String[] keyNodeInfo = null; | |
2610 | + | |
2611 | + try { | |
2612 | + | |
2613 | + // Isolation変換実行 | |
2614 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2615 | + | |
2616 | + if (!this.checkKeyLength(listNameStr)) { | |
2617 | + // 保存失敗 | |
2618 | + retStrs[0] = "55"; | |
2619 | + retStrs[1] = "false"; | |
2620 | + retStrs[2] = "List name Length Error"; | |
2621 | + return retStrs; | |
2622 | + } | |
2623 | + | |
2624 | + // キー値を使用して取得先を決定 | |
2625 | + keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2626 | + | |
2627 | + // 取得実行 | |
2628 | + // Main | |
2629 | + try { | |
2630 | + if (keyNodeInfo.length > 2) { | |
2631 | + keyNodeRet = this.listRPop(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], listNameStr, transactionCode); | |
2632 | + } | |
2633 | + if (keyNodeRet == null) { | |
2634 | + throw new Exception(""); | |
2635 | + } | |
2636 | + } catch (Exception e1) { | |
2637 | + keyNodeRet = new String[3]; | |
2638 | + keyNodeRet[0] = "56"; | |
2639 | + keyNodeRet[1] = "error"; | |
2640 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2641 | + } | |
2642 | + | |
2643 | + // Sub | |
2644 | + try { | |
2645 | + if (keyNodeInfo.length > 5) { | |
2646 | + String[] retTmp = this.listRPop(keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, transactionCode); | |
2647 | + if (keyNodeRet != null && keyNodeRet.length > 1 && keyNodeRet[1].equals("error")) { | |
2648 | + keyNodeRet = retTmp; | |
2649 | + } | |
2650 | + } | |
2651 | + | |
2652 | + if (keyNodeRet == null) { | |
2653 | + throw new Exception(""); | |
2654 | + } | |
2655 | + } catch (Exception e2) { | |
2656 | + keyNodeRet = new String[3]; | |
2657 | + keyNodeRet[0] = "56"; | |
2658 | + keyNodeRet[1] = "error"; | |
2659 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2660 | + } | |
2661 | + | |
2662 | + | |
2663 | + // Third | |
2664 | + try { | |
2665 | + if (keyNodeInfo.length > 8) { | |
2666 | + String[] retTmp = this.listRPop(keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, transactionCode); | |
2667 | + if (keyNodeRet != null && keyNodeRet.length > 1 && keyNodeRet[1].equals("error")) { | |
2668 | + keyNodeRet = retTmp; | |
2669 | + } | |
2670 | + } | |
2671 | + | |
2672 | + if (keyNodeRet == null) { | |
2673 | + throw new Exception(""); | |
2674 | + } | |
2675 | + } catch (Exception e2) { | |
2676 | + keyNodeRet = new String[3]; | |
2677 | + keyNodeRet[0] = "56"; | |
2678 | + keyNodeRet[1] = "error"; | |
2679 | + keyNodeRet[2] = "MasterNode - Exception"; | |
2680 | + } | |
2681 | + | |
2682 | + // 取得結果確認 | |
2683 | + if (keyNodeRet[1].equals("false")) { | |
2684 | + | |
2685 | + // 取得失敗(データなし) | |
2686 | + retStrs[0] = "56"; | |
2687 | + retStrs[1] = "false"; | |
2688 | + retStrs[2] = ""; | |
2689 | + } else if (keyNodeRet != null && keyNodeRet.length > 2) { | |
2690 | + | |
2691 | + // trueもしくはerrorの可能性あり | |
2692 | + retStrs[0] = "56"; | |
2693 | + retStrs[1] = keyNodeRet[1]; | |
2694 | + retStrs[2] = keyNodeRet[2]; | |
2695 | + } else { | |
2696 | + retStrs[0] = "56"; | |
2697 | + retStrs[1] = "error"; | |
2698 | + retStrs[2] = "DataNode - Exception"; | |
2699 | + } | |
2700 | + } catch (Exception e) { | |
2701 | + logger.error("MasterManagerHelper - listRPop - Error", e); | |
2702 | + retStrs[0] = "56"; | |
2703 | + retStrs[1] = "error"; | |
2704 | + retStrs[2] = "MasterNode - Exception"; | |
2705 | + } | |
2706 | + //logger.debug("MasterManagerHelper - listRPop - end"); | |
2707 | + return retStrs; | |
2708 | + } | |
2709 | + | |
2710 | + | |
2711 | + | |
2712 | + /** | |
2713 | + * List構造のサイズを取得する.<br> | |
2714 | + * 構造体を事前に作成していない場合は失敗する<br> | |
2715 | + * | |
2716 | + * @param listNameStr List名文字列 | |
2717 | + * @param listData Listへ追加するデータ | |
2718 | + * @return String[] 結果 | |
2719 | + * @throws BatchException | |
2720 | + */ | |
2721 | + private String[] listLen(String listNameStr, String transactionCode) throws BatchException { | |
2722 | + //logger.debug("MasterManagerHelper - listLen - start"); | |
2723 | + String[] retStrs = new String[3]; | |
2724 | + | |
2725 | + // data部分はブランクの場合はブランク規定文字列で送られてくるのでそのまま保存する | |
2726 | + String[] tagKeyPair = null; | |
2727 | + String[] keyNodeListLenRet = null; | |
2728 | + | |
2729 | + | |
2730 | + try { | |
2731 | + | |
2732 | + if (DataDispatcher.hasOldRule()) { | |
2733 | + // DataNode追加処理中は本メソッドはエラーとなる。 | |
2734 | + // これは完全性を維持することが出来ないためである。 | |
2735 | + retStrs[0] = "57"; | |
2736 | + retStrs[1] = "false"; | |
2737 | + retStrs[2] = "This method cannot use during \"DataNode\" addition processing."; | |
2738 | + return retStrs; | |
2739 | + } | |
2740 | + | |
2741 | + // KeyをIsolation変換実行 | |
2742 | + listNameStr = this.encodeIsolationConvert(listNameStr); | |
2743 | + | |
2744 | + // Key値チェック | |
2745 | + if (!this.checkKeyLength(listNameStr)) { | |
2746 | + // List名が長すぎる | |
2747 | + retStrs[0] = "57z"; | |
2748 | + retStrs[1] = "false"; | |
2749 | + retStrs[2] = "List name Length Error"; | |
2750 | + return retStrs; | |
2751 | + } | |
2752 | + | |
2753 | + | |
2754 | + // List名で作成をする | |
2755 | + // 保存先問い合わせ | |
2756 | + String[] keyNodeInfo = DataDispatcher.dispatchKeyNode(listNameStr, false); | |
2757 | + | |
2758 | + | |
2759 | + // 保存実行 | |
2760 | + // スレーブKeyNodeが存在する場合で値を変更 | |
2761 | + if (keyNodeInfo.length == 3) { | |
2762 | + keyNodeListLenRet = this.listLen(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], null, null, null, listNameStr, transactionCode); | |
2763 | + } else if (keyNodeInfo.length == 6) { | |
2764 | + keyNodeListLenRet = this.listLen(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], listNameStr, transactionCode); | |
2765 | + } else if (keyNodeInfo.length == 9) { | |
2766 | + keyNodeListLenRet = this.listLen(keyNodeInfo[0], keyNodeInfo[1], keyNodeInfo[2], keyNodeInfo[3], keyNodeInfo[4], keyNodeInfo[5], keyNodeInfo[6], keyNodeInfo[7], keyNodeInfo[8], listNameStr, transactionCode); | |
2767 | + } | |
2768 | + | |
2769 | + | |
2770 | + // 保存結果確認 | |
2771 | + if (keyNodeListLenRet[1].equals("false")) { | |
2772 | + // 値なし | |
2773 | + retStrs[0] = "57"; | |
2774 | + retStrs[1] = "false"; | |
2775 | + retStrs[2] = ""; | |
2776 | + return retStrs; | |
2777 | + } else if (keyNodeListLenRet[1].equals("true")) { | |
2778 | + // 値あり | |
2779 | + retStrs[0] = keyNodeListLenRet[0]; | |
2780 | + retStrs[1] = "true"; | |
2781 | + retStrs[2] = keyNodeListLenRet[2]; | |
2782 | + } | |
2783 | + } catch (BatchException be) { | |
2784 | + | |
2785 | + logger.info("MasterManagerHelper - listLen - Error", be); | |
2786 | + retStrs[0] = "57"; | |
2787 | + retStrs[1] = "error"; | |
2788 | + retStrs[2] = "NG:MasterNode - Exception"; | |
2789 | + } catch (Exception e) { | |
2790 | + logger.info("MasterManagerHelper - listLen - Error", e); | |
2791 | + retStrs[0] = "57"; | |
2792 | + retStrs[1] = "error"; | |
2793 | + retStrs[2] = "MasterNode - Exception"; | |
2794 | + } | |
2795 | + //logger.debug("MasterManagerHelper - listLen - end"); | |
2796 | + return retStrs; | |
2797 | + } | |
2798 | + | |
2799 | + | |
2800 | + /** | |
2040 | 2801 | * KeyでValueを取得する.<br> |
2041 | 2802 | * 処理フロー.<br> |
2042 | 2803 | * 1.DataDispatcherにKeyを使用してValueの保存先を問い合わせる<br> |
@@ -5924,6 +6685,1687 @@ | ||
5924 | 6685 | |
5925 | 6686 | |
5926 | 6687 | /** |
6688 | + * List構造体を作成する.<br> | |
6689 | + * 既に登録されている場合は失敗する.<br> | |
6690 | + * | |
6691 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
6692 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
6693 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
6694 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
6695 | + * @param thirdKeyNodeName サードデータノードの名前(IPなど) | |
6696 | + * @param thirdKeyNodePort サードデータノードのアクセスポート番号 | |
6697 | + * | |
6698 | + * @param listName 作成するList名 | |
6699 | + * @return String[] 結果 | |
6700 | + * @throws BatchException | |
6701 | + */ | |
6702 | + private String[] createListStruct(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String thirdKeyNodeName, String thirdKeyNodePort, String thirdKeyNodeFullName, String listName, String transactionCode) throws BatchException { | |
6703 | + boolean exceptionFlg = false; | |
6704 | + String[] ret = null; | |
6705 | + String[] thirdRet = null; | |
6706 | + BatchException retBe = null; | |
6707 | + | |
6708 | + try { | |
6709 | + | |
6710 | + ret = this.createListStruct(keyNodeName, keyNodePort, keyNodeFullName, subKeyNodeName, subKeyNodePort, subKeyNodeFullName, listName, transactionCode); | |
6711 | + } catch (BatchException be) { | |
6712 | + | |
6713 | + retBe = be; | |
6714 | + exceptionFlg = true; | |
6715 | + } catch (Exception e) { | |
6716 | + | |
6717 | + retBe = new BatchException(e); | |
6718 | + exceptionFlg = true; | |
6719 | + } finally { | |
6720 | + | |
6721 | + try { | |
6722 | + if (exceptionFlg) { | |
6723 | + thirdRet = this.createListStruct(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, transactionCode); | |
6724 | + ret = thirdRet; | |
6725 | + } else { | |
6726 | + if (ret[1].equals("true")) { | |
6727 | + | |
6728 | + // 保存成功 | |
6729 | + // まだ登録されていない | |
6730 | + // 無条件で登録 | |
6731 | + thirdRet = this.createListStruct(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, transactionCode); | |
6732 | + } else { | |
6733 | + // サードノードの使用終了のみマーク | |
6734 | + if (thirdKeyNodeFullName != null) | |
6735 | + super.execNodeUseEnd(thirdKeyNodeFullName); | |
6736 | + } | |
6737 | + } | |
6738 | + } catch (Exception e) { | |
6739 | + if (exceptionFlg) throw retBe; | |
6740 | + } | |
6741 | + } | |
6742 | + | |
6743 | + return ret; | |
6744 | + } | |
6745 | + | |
6746 | + /** | |
6747 | + * List構造体を作成する.<br> | |
6748 | + * 既に登録されている場合は失敗する.<br> | |
6749 | + * | |
6750 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
6751 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
6752 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
6753 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
6754 | + * @param listName 送信データ | |
6755 | + * @return String[] 結果 | |
6756 | + * @throws BatchException | |
6757 | + */ | |
6758 | + private String[] createListStruct(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String listName, String transactionCode) throws BatchException { | |
6759 | + | |
6760 | + KeyNodeConnector keyNodeConnector = null; | |
6761 | + | |
6762 | + String nodeName = keyNodeName; | |
6763 | + String nodePort = keyNodePort; | |
6764 | + String nodeFullName = keyNodeFullName; | |
6765 | + | |
6766 | + String[] retParams = null; | |
6767 | + String[] mainRetParams = null; | |
6768 | + String[] subRetParams = null; | |
6769 | + | |
6770 | + int counter = 0; | |
6771 | + | |
6772 | + String tmpSaveHost = null; | |
6773 | + String[] tmpSaveData = null; | |
6774 | + String retParam = null; | |
6775 | + | |
6776 | + boolean mainNodeSave = false; | |
6777 | + boolean mainNodeNetworkError = false; | |
6778 | + boolean subNodeSave = false; | |
6779 | + boolean subNodeNetworkError = false; | |
6780 | + | |
6781 | + try { | |
6782 | + | |
6783 | + // TransactionModeの状態に合わせてLock状態を確かめる | |
6784 | + if (transactionMode) { | |
6785 | + while (true) { | |
6786 | + | |
6787 | + // TransactionMode時 | |
6788 | + // TransactionManagerに処理を依頼 | |
6789 | + String[] keyNodeLockRet = hasLockKeyNode(transactionManagerInfo[0], transactionManagerInfo[1], listName); | |
6790 | + | |
6791 | + // 取得結果確認 | |
6792 | + if (keyNodeLockRet[1].equals("true")) { | |
6793 | + | |
6794 | + if (keyNodeLockRet[2].equals(transactionCode)) break; | |
6795 | + } else { | |
6796 | + break; | |
6797 | + } | |
6798 | + } | |
6799 | + } | |
6800 | + | |
6801 | + | |
6802 | + // まずメインデータノードへデータ登録 | |
6803 | + // KeyNodeとの接続を確立 | |
6804 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, false); | |
6805 | + | |
6806 | + if (keyNodeConnector != null) { | |
6807 | + try { | |
6808 | + | |
6809 | + // Key値でデータノード名を保存 | |
6810 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
6811 | + String sendStr = null; | |
6812 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
6813 | + buf.append("51"); // Type | |
6814 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
6815 | + buf.append(this.stringCnv(listName)); // Key値 | |
6816 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
6817 | + buf.append(transactionCode); // Transaction値 | |
6818 | + sendStr = buf.toString(); | |
6819 | + | |
6820 | + // 送信 | |
6821 | + keyNodeConnector.println(sendStr); | |
6822 | + keyNodeConnector.flush(); | |
6823 | + | |
6824 | + // 返却値取得 | |
6825 | + retParam = keyNodeConnector.readLine(sendStr); | |
6826 | + | |
6827 | + // 使用済みの接続を戻す | |
6828 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
6829 | + | |
6830 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
6831 | + //retParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
6832 | + if (retParam.indexOf(ImdstDefine.keyNodeListStructCreateSuccessStr) == 0) { | |
6833 | + | |
6834 | + mainNodeSave = true; | |
6835 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
6836 | + } else { | |
6837 | + | |
6838 | + mainNodeSave = false; | |
6839 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
6840 | + } | |
6841 | + } catch (SocketException se) { | |
6842 | + mainNodeNetworkError = true; | |
6843 | + if (keyNodeConnector != null) { | |
6844 | + keyNodeConnector.close(); | |
6845 | + keyNodeConnector = null; | |
6846 | + } | |
6847 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 8, se); | |
6848 | + logger.debug(se); | |
6849 | + } catch (IOException ie) { | |
6850 | + mainNodeNetworkError = true; | |
6851 | + if (keyNodeConnector != null) { | |
6852 | + keyNodeConnector.close(); | |
6853 | + keyNodeConnector = null; | |
6854 | + } | |
6855 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 9, ie); | |
6856 | + logger.debug(ie); | |
6857 | + } catch (Exception ee) { | |
6858 | + if (keyNodeConnector != null) { | |
6859 | + keyNodeConnector.close(); | |
6860 | + keyNodeConnector = null; | |
6861 | + } | |
6862 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 10, ee); | |
6863 | + logger.debug(ee); | |
6864 | + } | |
6865 | + | |
6866 | + } else { | |
6867 | + mainNodeNetworkError = true; | |
6868 | + } | |
6869 | + | |
6870 | + | |
6871 | + if (subKeyNodeName != null) { | |
6872 | + // Subノードで実施 | |
6873 | + if (mainNodeSave == true || (mainNodeSave == false && mainNodeNetworkError == true)) { | |
6874 | + String subNodeExecType = ""; | |
6875 | + | |
6876 | + // Mainノードが処理成功もしくは、ネットワークエラーの場合はSubノードの処理を行う。 | |
6877 | + // KeyNodeとの接続を確立 | |
6878 | + keyNodeConnector = this.createKeyNodeConnection(subKeyNodeName, subKeyNodePort, subKeyNodeFullName, false); | |
6879 | + | |
6880 | + if (keyNodeConnector != null) { | |
6881 | + try { | |
6882 | + | |
6883 | + // Key値でデータノード名を保存 | |
6884 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
6885 | + String sendStr = null; | |
6886 | + | |
6887 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
6888 | + buf.append("51"); // Type | |
6889 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
6890 | + buf.append(this.stringCnv(listName)); // Key値 | |
6891 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
6892 | + buf.append(transactionCode); // Transaction値 | |
6893 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
6894 | + buf.append("1"); // 強制登録を表す | |
6895 | + sendStr = buf.toString(); | |
6896 | + | |
6897 | + // 送信 | |
6898 | + keyNodeConnector.println(sendStr); | |
6899 | + keyNodeConnector.flush(); | |
6900 | + | |
6901 | + // 返却値取得 | |
6902 | + retParam = keyNodeConnector.readLine(sendStr); | |
6903 | + | |
6904 | + // 使用済みの接続を戻す | |
6905 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
6906 | + | |
6907 | + | |
6908 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
6909 | + if (retParam.indexOf(ImdstDefine.keyNodeListStructCreateSuccessStr) == 0) { | |
6910 | + | |
6911 | + subNodeSave = true; | |
6912 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
6913 | + } else { | |
6914 | + | |
6915 | + subNodeSave = false; | |
6916 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
6917 | + } | |
6918 | + } catch (SocketException se) { | |
6919 | + subNodeNetworkError = true; | |
6920 | + if (keyNodeConnector != null) { | |
6921 | + keyNodeConnector.close(); | |
6922 | + keyNodeConnector = null; | |
6923 | + } | |
6924 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 11, se); | |
6925 | + logger.debug(se); | |
6926 | + } catch (IOException ie) { | |
6927 | + subNodeNetworkError = true; | |
6928 | + if (keyNodeConnector != null) { | |
6929 | + keyNodeConnector.close(); | |
6930 | + keyNodeConnector = null; | |
6931 | + } | |
6932 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 12, ie); | |
6933 | + logger.debug(ie); | |
6934 | + } catch (Exception ee) { | |
6935 | + if (keyNodeConnector != null) { | |
6936 | + keyNodeConnector.close(); | |
6937 | + keyNodeConnector = null; | |
6938 | + } | |
6939 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 13, ee); | |
6940 | + logger.debug(ee); | |
6941 | + } | |
6942 | + | |
6943 | + } else { | |
6944 | + subNodeNetworkError = true; | |
6945 | + } | |
6946 | + } | |
6947 | + } | |
6948 | + | |
6949 | + // Main、Sub両方ともネットワークでのエラーがであるか確認 | |
6950 | + if (mainNodeNetworkError == true && subNodeNetworkError == true) { | |
6951 | + // ネットワークエラー | |
6952 | + throw new BatchException("Key Node IO Error: detail info for log file"); | |
6953 | + } | |
6954 | + | |
6955 | + // ノードへの保存状況を確認 | |
6956 | + if (mainNodeSave == false) { | |
6957 | + | |
6958 | + // MainNode保存失敗 | |
6959 | + if (mainNodeNetworkError == false) { | |
6960 | + | |
6961 | + // 既に書き込み済みでの失敗 | |
6962 | + retParams = mainRetParams; | |
6963 | + } | |
6964 | + } else { | |
6965 | + | |
6966 | + // MainNode保存成功 | |
6967 | + retParams = mainRetParams; | |
6968 | + } | |
6969 | + | |
6970 | + | |
6971 | + if (subKeyNodeName != null) { | |
6972 | + // スレーブノードが存在する場合のみ | |
6973 | + // MainNodeが既にデータ有りで失敗せずに、成功もしていない | |
6974 | + if (retParams == null) { | |
6975 | + | |
6976 | + if (subNodeSave == false) { | |
6977 | + | |
6978 | + // SubNode保存失敗 | |
6979 | + if (subNodeNetworkError == false) { | |
6980 | + | |
6981 | + // 既に書き込み済みでの失敗 | |
6982 | + retParams = subRetParams; | |
6983 | + } | |
6984 | + } else { | |
6985 | + | |
6986 | + // SubNode保存成功 | |
6987 | + retParams = subRetParams; | |
6988 | + } | |
6989 | + } | |
6990 | + } | |
6991 | + } catch (BatchException be) { | |
6992 | + if (keyNodeConnector != null) { | |
6993 | + keyNodeConnector.close(); | |
6994 | + keyNodeConnector = null; | |
6995 | + } | |
6996 | + throw be; | |
6997 | + } catch (Exception e) { | |
6998 | + if (keyNodeConnector != null) { | |
6999 | + keyNodeConnector.close(); | |
7000 | + keyNodeConnector = null; | |
7001 | + } | |
7002 | + throw new BatchException(e); | |
7003 | + } finally { | |
7004 | + // ノードの使用終了をマーク | |
7005 | + super.execNodeUseEnd(keyNodeFullName); | |
7006 | + | |
7007 | + if (subKeyNodeName != null) | |
7008 | + super.execNodeUseEnd(subKeyNodeFullName); | |
7009 | + } | |
7010 | + | |
7011 | + return retParams; | |
7012 | + } | |
7013 | + | |
7014 | + | |
7015 | + /** | |
7016 | + * List構造体の先頭に値を追加する.<br> | |
7017 | + * | |
7018 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7019 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7020 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7021 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7022 | + * @param thirdKeyNodeName サードデータノードの名前(IPなど) | |
7023 | + * @param thirdKeyNodePort サードデータノードのアクセスポート番号 | |
7024 | + * @param listName 作成するList名 | |
7025 | + * @param listData 追加するData | |
7026 | + * @return String[] 結果 | |
7027 | + * @throws BatchException | |
7028 | + */ | |
7029 | + private String[] listLPush(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String thirdKeyNodeName, String thirdKeyNodePort, String thirdKeyNodeFullName, String listName, String listData, String transactionCode) throws BatchException { | |
7030 | + boolean exceptionFlg = false; | |
7031 | + String[] ret = null; | |
7032 | + String[] thirdRet = null; | |
7033 | + BatchException retBe = null; | |
7034 | + | |
7035 | + try { | |
7036 | + | |
7037 | + ret = this.listLPush(keyNodeName, keyNodePort, keyNodeFullName, subKeyNodeName, subKeyNodePort, subKeyNodeFullName, listName, listData, transactionCode); | |
7038 | + } catch (BatchException be) { | |
7039 | + | |
7040 | + retBe = be; | |
7041 | + exceptionFlg = true; | |
7042 | + } catch (Exception e) { | |
7043 | + | |
7044 | + retBe = new BatchException(e); | |
7045 | + exceptionFlg = true; | |
7046 | + } finally { | |
7047 | + | |
7048 | + try { | |
7049 | + if (exceptionFlg) { | |
7050 | + thirdRet = this.listLPush(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, listData, transactionCode); | |
7051 | + ret = thirdRet; | |
7052 | + } else { | |
7053 | + if (ret[1].equals("true")) { | |
7054 | + | |
7055 | + // 保存成功 | |
7056 | + // まだ登録されていない | |
7057 | + // 無条件で登録 | |
7058 | + thirdRet = this.listLPush(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, listData, transactionCode); | |
7059 | + } else { | |
7060 | + // サードノードの使用終了のみマーク | |
7061 | + if (thirdKeyNodeFullName != null) | |
7062 | + super.execNodeUseEnd(thirdKeyNodeFullName); | |
7063 | + } | |
7064 | + } | |
7065 | + } catch (Exception e) { | |
7066 | + if (exceptionFlg) throw retBe; | |
7067 | + } | |
7068 | + } | |
7069 | + | |
7070 | + return ret; | |
7071 | + } | |
7072 | + | |
7073 | + /** | |
7074 | + * List構造体の先頭に値を追加する.<br> | |
7075 | + * | |
7076 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7077 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7078 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7079 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7080 | + * @param listName 送信データ | |
7081 | + * @param listData 追加するData | |
7082 | + * @return String[] 結果 | |
7083 | + * @throws BatchException | |
7084 | + */ | |
7085 | + private String[] listLPush(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String listName, String listData, String transactionCode) throws BatchException { | |
7086 | + | |
7087 | + KeyNodeConnector keyNodeConnector = null; | |
7088 | + | |
7089 | + String nodeName = keyNodeName; | |
7090 | + String nodePort = keyNodePort; | |
7091 | + String nodeFullName = keyNodeFullName; | |
7092 | + | |
7093 | + String[] retParams = null; | |
7094 | + String[] mainRetParams = null; | |
7095 | + String[] subRetParams = null; | |
7096 | + | |
7097 | + int counter = 0; | |
7098 | + | |
7099 | + String tmpSaveHost = null; | |
7100 | + String[] tmpSaveData = null; | |
7101 | + String retParam = null; | |
7102 | + | |
7103 | + boolean mainNodeSave = false; | |
7104 | + boolean mainNodeNetworkError = false; | |
7105 | + boolean subNodeSave = false; | |
7106 | + boolean subNodeNetworkError = false; | |
7107 | + | |
7108 | + try { | |
7109 | + | |
7110 | + // TransactionModeの状態に合わせてLock状態を確かめる | |
7111 | + if (transactionMode) { | |
7112 | + while (true) { | |
7113 | + | |
7114 | + // TransactionMode時 | |
7115 | + // TransactionManagerに処理を依頼 | |
7116 | + String[] keyNodeLockRet = hasLockKeyNode(transactionManagerInfo[0], transactionManagerInfo[1], listName); | |
7117 | + | |
7118 | + // 取得結果確認 | |
7119 | + if (keyNodeLockRet[1].equals("true")) { | |
7120 | + | |
7121 | + if (keyNodeLockRet[2].equals(transactionCode)) break; | |
7122 | + } else { | |
7123 | + break; | |
7124 | + } | |
7125 | + } | |
7126 | + } | |
7127 | + | |
7128 | + // まずメインデータノードへデータ登録 | |
7129 | + // KeyNodeとの接続を確立 | |
7130 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, false); | |
7131 | + | |
7132 | + if (keyNodeConnector != null) { | |
7133 | + try { | |
7134 | + | |
7135 | + // Key値でデータノード名を保存 | |
7136 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
7137 | + String sendStr = null; | |
7138 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
7139 | + buf.append("52"); // Type | |
7140 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7141 | + buf.append(this.stringCnv(listName)); // List名 | |
7142 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7143 | + buf.append(this.stringCnv(listData)); // 追加Data値 | |
7144 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7145 | + buf.append(transactionCode); // Transaction値 | |
7146 | + sendStr = buf.toString(); | |
7147 | + | |
7148 | + // 送信 | |
7149 | + keyNodeConnector.println(sendStr); | |
7150 | + keyNodeConnector.flush(); | |
7151 | + | |
7152 | + // 返却値取得 | |
7153 | + retParam = keyNodeConnector.readLine(sendStr); | |
7154 | + | |
7155 | + // 使用済みの接続を戻す | |
7156 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7157 | + | |
7158 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
7159 | + //retParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7160 | + if (retParam.indexOf(ImdstDefine.keyNodeLPushSuccessStr) == 0) { | |
7161 | + | |
7162 | + mainNodeSave = true; | |
7163 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7164 | + } else { | |
7165 | + | |
7166 | + mainNodeSave = false; | |
7167 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7168 | + } | |
7169 | + } catch (SocketException se) { | |
7170 | + mainNodeNetworkError = true; | |
7171 | + if (keyNodeConnector != null) { | |
7172 | + keyNodeConnector.close(); | |
7173 | + keyNodeConnector = null; | |
7174 | + } | |
7175 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 8, se); | |
7176 | + logger.debug(se); | |
7177 | + } catch (IOException ie) { | |
7178 | + mainNodeNetworkError = true; | |
7179 | + if (keyNodeConnector != null) { | |
7180 | + keyNodeConnector.close(); | |
7181 | + keyNodeConnector = null; | |
7182 | + } | |
7183 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 9, ie); | |
7184 | + logger.debug(ie); | |
7185 | + } catch (Exception ee) { | |
7186 | + if (keyNodeConnector != null) { | |
7187 | + keyNodeConnector.close(); | |
7188 | + keyNodeConnector = null; | |
7189 | + } | |
7190 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 10, ee); | |
7191 | + logger.debug(ee); | |
7192 | + } | |
7193 | + | |
7194 | + } else { | |
7195 | + mainNodeNetworkError = true; | |
7196 | + } | |
7197 | + | |
7198 | + | |
7199 | + if (subKeyNodeName != null) { | |
7200 | + // Subノードで実施 | |
7201 | + if (mainNodeSave == true || (mainNodeSave == false && mainNodeNetworkError == true)) { | |
7202 | + String subNodeExecType = ""; | |
7203 | + | |
7204 | + // Mainノードが処理成功もしくは、ネットワークエラーの場合はSubノードの処理を行う。 | |
7205 | + // KeyNodeとの接続を確立 | |
7206 | + keyNodeConnector = this.createKeyNodeConnection(subKeyNodeName, subKeyNodePort, subKeyNodeFullName, false); | |
7207 | + | |
7208 | + if (keyNodeConnector != null) { | |
7209 | + try { | |
7210 | + | |
7211 | + // Key値でデータノード名を保存 | |
7212 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
7213 | + String sendStr = null; | |
7214 | + | |
7215 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
7216 | + buf.append("52"); // Type | |
7217 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7218 | + buf.append(this.stringCnv(listName)); // List名 | |
7219 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7220 | + buf.append(this.stringCnv(listData)); // 追加Data値 | |
7221 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7222 | + buf.append(transactionCode); // Transaction値 | |
7223 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7224 | + buf.append("1"); // 強制登録を表す | |
7225 | + sendStr = buf.toString(); | |
7226 | + | |
7227 | + // 送信 | |
7228 | + keyNodeConnector.println(sendStr); | |
7229 | + keyNodeConnector.flush(); | |
7230 | + | |
7231 | + // 返却値取得 | |
7232 | + retParam = keyNodeConnector.readLine(sendStr); | |
7233 | + | |
7234 | + // 使用済みの接続を戻す | |
7235 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7236 | + | |
7237 | + | |
7238 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
7239 | + if (retParam.indexOf(ImdstDefine.keyNodeLPushSuccessStr) == 0) { | |
7240 | + | |
7241 | + subNodeSave = true; | |
7242 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7243 | + } else { | |
7244 | + | |
7245 | + subNodeSave = false; | |
7246 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7247 | + } | |
7248 | + } catch (SocketException se) { | |
7249 | + subNodeNetworkError = true; | |
7250 | + if (keyNodeConnector != null) { | |
7251 | + keyNodeConnector.close(); | |
7252 | + keyNodeConnector = null; | |
7253 | + } | |
7254 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 11, se); | |
7255 | + logger.debug(se); | |
7256 | + } catch (IOException ie) { | |
7257 | + subNodeNetworkError = true; | |
7258 | + if (keyNodeConnector != null) { | |
7259 | + keyNodeConnector.close(); | |
7260 | + keyNodeConnector = null; | |
7261 | + } | |
7262 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 12, ie); | |
7263 | + logger.debug(ie); | |
7264 | + } catch (Exception ee) { | |
7265 | + if (keyNodeConnector != null) { | |
7266 | + keyNodeConnector.close(); | |
7267 | + keyNodeConnector = null; | |
7268 | + } | |
7269 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 13, ee); | |
7270 | + logger.debug(ee); | |
7271 | + } | |
7272 | + | |
7273 | + } else { | |
7274 | + subNodeNetworkError = true; | |
7275 | + } | |
7276 | + } | |
7277 | + } | |
7278 | + | |
7279 | + // Main、Sub両方ともネットワークでのエラーがであるか確認 | |
7280 | + if (mainNodeNetworkError == true && subNodeNetworkError == true) { | |
7281 | + // ネットワークエラー | |
7282 | + throw new BatchException("Key Node IO Error: detail info for log file"); | |
7283 | + } | |
7284 | + | |
7285 | + // ノードへの保存状況を確認 | |
7286 | + if (mainNodeSave == false) { | |
7287 | + | |
7288 | + // MainNode保存失敗 | |
7289 | + if (mainNodeNetworkError == false) { | |
7290 | + | |
7291 | + // 既に書き込み済みでの失敗 | |
7292 | + retParams = mainRetParams; | |
7293 | + } | |
7294 | + } else { | |
7295 | + | |
7296 | + // MainNode保存成功 | |
7297 | + retParams = mainRetParams; | |
7298 | + } | |
7299 | + | |
7300 | + | |
7301 | + if (subKeyNodeName != null) { | |
7302 | + // スレーブノードが存在する場合のみ | |
7303 | + // MainNodeが既にデータ有りで失敗せずに、成功もしていない | |
7304 | + if (retParams == null) { | |
7305 | + | |
7306 | + if (subNodeSave == false) { | |
7307 | + | |
7308 | + // SubNode保存失敗 | |
7309 | + if (subNodeNetworkError == false) { | |
7310 | + | |
7311 | + // 既に書き込み済みでの失敗 | |
7312 | + retParams = subRetParams; | |
7313 | + } | |
7314 | + } else { | |
7315 | + | |
7316 | + // SubNode保存成功 | |
7317 | + retParams = subRetParams; | |
7318 | + } | |
7319 | + } | |
7320 | + } | |
7321 | + } catch (BatchException be) { | |
7322 | + if (keyNodeConnector != null) { | |
7323 | + keyNodeConnector.close(); | |
7324 | + keyNodeConnector = null; | |
7325 | + } | |
7326 | + throw be; | |
7327 | + } catch (Exception e) { | |
7328 | + if (keyNodeConnector != null) { | |
7329 | + keyNodeConnector.close(); | |
7330 | + keyNodeConnector = null; | |
7331 | + } | |
7332 | + throw new BatchException(e); | |
7333 | + } finally { | |
7334 | + // ノードの使用終了をマーク | |
7335 | + super.execNodeUseEnd(keyNodeFullName); | |
7336 | + | |
7337 | + if (subKeyNodeName != null) | |
7338 | + super.execNodeUseEnd(subKeyNodeFullName); | |
7339 | + } | |
7340 | + | |
7341 | + return retParams; | |
7342 | + } | |
7343 | + | |
7344 | + | |
7345 | + | |
7346 | + | |
7347 | + /** | |
7348 | + * List構造体の最後尾に値を追加する.<br> | |
7349 | + * | |
7350 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7351 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7352 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7353 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7354 | + * @param thirdKeyNodeName サードデータノードの名前(IPなど) | |
7355 | + * @param thirdKeyNodePort サードデータノードのアクセスポート番号 | |
7356 | + * @param listName 作成するList名 | |
7357 | + * @param listData 追加するData | |
7358 | + * @return String[] 結果 | |
7359 | + * @throws BatchException | |
7360 | + */ | |
7361 | + private String[] listRPush(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String thirdKeyNodeName, String thirdKeyNodePort, String thirdKeyNodeFullName, String listName, String listData, String transactionCode) throws BatchException { | |
7362 | + boolean exceptionFlg = false; | |
7363 | + String[] ret = null; | |
7364 | + String[] thirdRet = null; | |
7365 | + BatchException retBe = null; | |
7366 | + | |
7367 | + try { | |
7368 | + | |
7369 | + ret = this.listRPush(keyNodeName, keyNodePort, keyNodeFullName, subKeyNodeName, subKeyNodePort, subKeyNodeFullName, listName, listData, transactionCode); | |
7370 | + } catch (BatchException be) { | |
7371 | + | |
7372 | + retBe = be; | |
7373 | + exceptionFlg = true; | |
7374 | + } catch (Exception e) { | |
7375 | + | |
7376 | + retBe = new BatchException(e); | |
7377 | + exceptionFlg = true; | |
7378 | + } finally { | |
7379 | + | |
7380 | + try { | |
7381 | + if (exceptionFlg) { | |
7382 | + thirdRet = this.listRPush(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, listData, transactionCode); | |
7383 | + ret = thirdRet; | |
7384 | + } else { | |
7385 | + if (ret[1].equals("true")) { | |
7386 | + | |
7387 | + // 保存成功 | |
7388 | + // まだ登録されていない | |
7389 | + // 無条件で登録 | |
7390 | + thirdRet = this.listRPush(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listName, listData, transactionCode); | |
7391 | + } else { | |
7392 | + // サードノードの使用終了のみマーク | |
7393 | + if (thirdKeyNodeFullName != null) | |
7394 | + super.execNodeUseEnd(thirdKeyNodeFullName); | |
7395 | + } | |
7396 | + } | |
7397 | + } catch (Exception e) { | |
7398 | + if (exceptionFlg) throw retBe; | |
7399 | + } | |
7400 | + } | |
7401 | + | |
7402 | + return ret; | |
7403 | + } | |
7404 | + | |
7405 | + /** | |
7406 | + * List構造体の最後尾に値を追加する.<br> | |
7407 | + * | |
7408 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7409 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7410 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7411 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7412 | + * @param listName 送信データ | |
7413 | + * @param listData 追加するData | |
7414 | + * @return String[] 結果 | |
7415 | + * @throws BatchException | |
7416 | + */ | |
7417 | + private String[] listRPush(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String listName, String listData, String transactionCode) throws BatchException { | |
7418 | + | |
7419 | + KeyNodeConnector keyNodeConnector = null; | |
7420 | + | |
7421 | + String nodeName = keyNodeName; | |
7422 | + String nodePort = keyNodePort; | |
7423 | + String nodeFullName = keyNodeFullName; | |
7424 | + | |
7425 | + String[] retParams = null; | |
7426 | + String[] mainRetParams = null; | |
7427 | + String[] subRetParams = null; | |
7428 | + | |
7429 | + int counter = 0; | |
7430 | + | |
7431 | + String tmpSaveHost = null; | |
7432 | + String[] tmpSaveData = null; | |
7433 | + String retParam = null; | |
7434 | + | |
7435 | + boolean mainNodeSave = false; | |
7436 | + boolean mainNodeNetworkError = false; | |
7437 | + boolean subNodeSave = false; | |
7438 | + boolean subNodeNetworkError = false; | |
7439 | + | |
7440 | + try { | |
7441 | + | |
7442 | + // TransactionModeの状態に合わせてLock状態を確かめる | |
7443 | + if (transactionMode) { | |
7444 | + while (true) { | |
7445 | + | |
7446 | + // TransactionMode時 | |
7447 | + // TransactionManagerに処理を依頼 | |
7448 | + String[] keyNodeLockRet = hasLockKeyNode(transactionManagerInfo[0], transactionManagerInfo[1], listName); | |
7449 | + | |
7450 | + // 取得結果確認 | |
7451 | + if (keyNodeLockRet[1].equals("true")) { | |
7452 | + | |
7453 | + if (keyNodeLockRet[2].equals(transactionCode)) break; | |
7454 | + } else { | |
7455 | + break; | |
7456 | + } | |
7457 | + } | |
7458 | + } | |
7459 | + | |
7460 | + // まずメインデータノードへデータ登録 | |
7461 | + // KeyNodeとの接続を確立 | |
7462 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, false); | |
7463 | + | |
7464 | + if (keyNodeConnector != null) { | |
7465 | + try { | |
7466 | + | |
7467 | + // Key値でデータノード名を保存 | |
7468 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
7469 | + String sendStr = null; | |
7470 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
7471 | + buf.append("53"); // Type | |
7472 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7473 | + buf.append(this.stringCnv(listName)); // List名 | |
7474 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7475 | + buf.append(this.stringCnv(listData)); // 追加Data値 | |
7476 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7477 | + buf.append(transactionCode); // Transaction値 | |
7478 | + sendStr = buf.toString(); | |
7479 | + | |
7480 | + // 送信 | |
7481 | + keyNodeConnector.println(sendStr); | |
7482 | + keyNodeConnector.flush(); | |
7483 | + | |
7484 | + // 返却値取得 | |
7485 | + retParam = keyNodeConnector.readLine(sendStr); | |
7486 | + | |
7487 | + // 使用済みの接続を戻す | |
7488 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7489 | + | |
7490 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
7491 | + //retParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7492 | + if (retParam.indexOf(ImdstDefine.keyNodeRPushSuccessStr) == 0) { | |
7493 | + | |
7494 | + mainNodeSave = true; | |
7495 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7496 | + } else { | |
7497 | + | |
7498 | + mainNodeSave = false; | |
7499 | + mainRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7500 | + } | |
7501 | + } catch (SocketException se) { | |
7502 | + mainNodeNetworkError = true; | |
7503 | + if (keyNodeConnector != null) { | |
7504 | + keyNodeConnector.close(); | |
7505 | + keyNodeConnector = null; | |
7506 | + } | |
7507 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 8, se); | |
7508 | + logger.debug(se); | |
7509 | + } catch (IOException ie) { | |
7510 | + mainNodeNetworkError = true; | |
7511 | + if (keyNodeConnector != null) { | |
7512 | + keyNodeConnector.close(); | |
7513 | + keyNodeConnector = null; | |
7514 | + } | |
7515 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 9, ie); | |
7516 | + logger.debug(ie); | |
7517 | + } catch (Exception ee) { | |
7518 | + if (keyNodeConnector != null) { | |
7519 | + keyNodeConnector.close(); | |
7520 | + keyNodeConnector = null; | |
7521 | + } | |
7522 | + super.setDeadNode(keyNodeName + ":" + keyNodePort, 10, ee); | |
7523 | + logger.debug(ee); | |
7524 | + } | |
7525 | + | |
7526 | + } else { | |
7527 | + mainNodeNetworkError = true; | |
7528 | + } | |
7529 | + | |
7530 | + | |
7531 | + if (subKeyNodeName != null) { | |
7532 | + // Subノードで実施 | |
7533 | + if (mainNodeSave == true || (mainNodeSave == false && mainNodeNetworkError == true)) { | |
7534 | + String subNodeExecType = ""; | |
7535 | + | |
7536 | + // Mainノードが処理成功もしくは、ネットワークエラーの場合はSubノードの処理を行う。 | |
7537 | + // KeyNodeとの接続を確立 | |
7538 | + keyNodeConnector = this.createKeyNodeConnection(subKeyNodeName, subKeyNodePort, subKeyNodeFullName, false); | |
7539 | + | |
7540 | + if (keyNodeConnector != null) { | |
7541 | + try { | |
7542 | + | |
7543 | + // Key値でデータノード名を保存 | |
7544 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
7545 | + String sendStr = null; | |
7546 | + | |
7547 | + // パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
7548 | + buf.append("53"); // Type | |
7549 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7550 | + buf.append(this.stringCnv(listName)); // List名 | |
7551 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7552 | + buf.append(this.stringCnv(listData)); // 追加Data値 | |
7553 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7554 | + buf.append(transactionCode); // Transaction値 | |
7555 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7556 | + buf.append("1"); // 強制登録を表す | |
7557 | + sendStr = buf.toString(); | |
7558 | + | |
7559 | + // 送信 | |
7560 | + keyNodeConnector.println(sendStr); | |
7561 | + keyNodeConnector.flush(); | |
7562 | + | |
7563 | + // 返却値取得 | |
7564 | + retParam = keyNodeConnector.readLine(sendStr); | |
7565 | + | |
7566 | + // 使用済みの接続を戻す | |
7567 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7568 | + | |
7569 | + | |
7570 | + // splitは遅いので特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
7571 | + if (retParam.indexOf(ImdstDefine.keyNodeRPushSuccessStr) == 0) { | |
7572 | + | |
7573 | + subNodeSave = true; | |
7574 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7575 | + } else { | |
7576 | + | |
7577 | + subNodeSave = false; | |
7578 | + subRetParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
7579 | + } | |
7580 | + } catch (SocketException se) { | |
7581 | + subNodeNetworkError = true; | |
7582 | + if (keyNodeConnector != null) { | |
7583 | + keyNodeConnector.close(); | |
7584 | + keyNodeConnector = null; | |
7585 | + } | |
7586 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 11, se); | |
7587 | + logger.debug(se); | |
7588 | + } catch (IOException ie) { | |
7589 | + subNodeNetworkError = true; | |
7590 | + if (keyNodeConnector != null) { | |
7591 | + keyNodeConnector.close(); | |
7592 | + keyNodeConnector = null; | |
7593 | + } | |
7594 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 12, ie); | |
7595 | + logger.debug(ie); | |
7596 | + } catch (Exception ee) { | |
7597 | + if (keyNodeConnector != null) { | |
7598 | + keyNodeConnector.close(); | |
7599 | + keyNodeConnector = null; | |
7600 | + } | |
7601 | + super.setDeadNode(subKeyNodeName + ":" + subKeyNodePort, 13, ee); | |
7602 | + logger.debug(ee); | |
7603 | + } | |
7604 | + | |
7605 | + } else { | |
7606 | + subNodeNetworkError = true; | |
7607 | + } | |
7608 | + } | |
7609 | + } | |
7610 | + | |
7611 | + // Main、Sub両方ともネットワークでのエラーがであるか確認 | |
7612 | + if (mainNodeNetworkError == true && subNodeNetworkError == true) { | |
7613 | + // ネットワークエラー | |
7614 | + throw new BatchException("Key Node IO Error: detail info for log file"); | |
7615 | + } | |
7616 | + | |
7617 | + // ノードへの保存状況を確認 | |
7618 | + if (mainNodeSave == false) { | |
7619 | + | |
7620 | + // MainNode保存失敗 | |
7621 | + if (mainNodeNetworkError == false) { | |
7622 | + | |
7623 | + // 既に書き込み済みでの失敗 | |
7624 | + retParams = mainRetParams; | |
7625 | + } | |
7626 | + } else { | |
7627 | + | |
7628 | + // MainNode保存成功 | |
7629 | + retParams = mainRetParams; | |
7630 | + } | |
7631 | + | |
7632 | + | |
7633 | + if (subKeyNodeName != null) { | |
7634 | + // スレーブノードが存在する場合のみ | |
7635 | + // MainNodeが既にデータ有りで失敗せずに、成功もしていない | |
7636 | + if (retParams == null) { | |
7637 | + | |
7638 | + if (subNodeSave == false) { | |
7639 | + | |
7640 | + // SubNode保存失敗 | |
7641 | + if (subNodeNetworkError == false) { | |
7642 | + | |
7643 | + // 既に書き込み済みでの失敗 | |
7644 | + retParams = subRetParams; | |
7645 | + } | |
7646 | + } else { | |
7647 | + | |
7648 | + // SubNode保存成功 | |
7649 | + retParams = subRetParams; | |
7650 | + } | |
7651 | + } | |
7652 | + } | |
7653 | + } catch (BatchException be) { | |
7654 | + if (keyNodeConnector != null) { | |
7655 | + keyNodeConnector.close(); | |
7656 | + keyNodeConnector = null; | |
7657 | + } | |
7658 | + throw be; | |
7659 | + } catch (Exception e) { | |
7660 | + if (keyNodeConnector != null) { | |
7661 | + keyNodeConnector.close(); | |
7662 | + keyNodeConnector = null; | |
7663 | + } | |
7664 | + throw new BatchException(e); | |
7665 | + } finally { | |
7666 | + // ノードの使用終了をマーク | |
7667 | + super.execNodeUseEnd(keyNodeFullName); | |
7668 | + | |
7669 | + if (subKeyNodeName != null) | |
7670 | + super.execNodeUseEnd(subKeyNodeFullName); | |
7671 | + } | |
7672 | + | |
7673 | + return retParams; | |
7674 | + } | |
7675 | + | |
7676 | + | |
7677 | + /** | |
7678 | + * KeyNodeのList構造体から指定Indexの値を取得する.<br> | |
7679 | + * | |
7680 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7681 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7682 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7683 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7684 | + * @param listNameStr List名文字列 | |
7685 | + * @param listGetIndex 位置指定のIndex | |
7686 | + * @return String[] 結果 | |
7687 | + * @throws BatchException | |
7688 | + */ | |
7689 | + private String[] listIndex(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String thirdKeyNodeName, String thirdKeyNodePort, String thirdKeyNodeFullName, String listNameStr, String listGetIndex, String transactionCode) throws BatchException { | |
7690 | + boolean exceptionFlg = false; | |
7691 | + String[] ret = null; | |
7692 | + String[] thirdRet = null; | |
7693 | + BatchException retBe = null; | |
7694 | + | |
7695 | + try { | |
7696 | + | |
7697 | + ret = this.listIndex(keyNodeName, keyNodePort, keyNodeFullName, subKeyNodeName, subKeyNodePort, subKeyNodeFullName, listNameStr, listGetIndex, transactionCode); | |
7698 | + } catch (BatchException be) { | |
7699 | + | |
7700 | + retBe = be; | |
7701 | + exceptionFlg = true; | |
7702 | + } catch (Exception e) { | |
7703 | + | |
7704 | + retBe = new BatchException(e); | |
7705 | + exceptionFlg = true; | |
7706 | + } finally { | |
7707 | + | |
7708 | + try { | |
7709 | + if (exceptionFlg) { | |
7710 | + thirdRet = this.listIndex(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listNameStr, listGetIndex, transactionCode); | |
7711 | + ret = thirdRet; | |
7712 | + } else { | |
7713 | + // サードノードの使用終了のみマーク | |
7714 | + if (thirdKeyNodeFullName != null) | |
7715 | + super.execNodeUseEnd(thirdKeyNodeFullName); | |
7716 | + } | |
7717 | + } catch (Exception e) { | |
7718 | + if (exceptionFlg) throw retBe; | |
7719 | + } | |
7720 | + } | |
7721 | + | |
7722 | + return ret; | |
7723 | + } | |
7724 | + | |
7725 | + | |
7726 | + /** | |
7727 | + * KeyNodeからデータを取得する.<br> | |
7728 | + * | |
7729 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
7730 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
7731 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
7732 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
7733 | + * @param listNameStr List名文字列 | |
7734 | + * @param listGetIndex 位置指定のIndex | |
7735 | + * @return String[] 結果 | |
7736 | + * @throws BatchException | |
7737 | + */ | |
7738 | + private String[] listIndex(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String listNameStr, String listGetIndex, String transactionCode) throws BatchException { | |
7739 | + KeyNodeConnector keyNodeConnector = null; | |
7740 | + | |
7741 | + String[] retParams = null; | |
7742 | + String[] cnvConsistencyRet = null; | |
7743 | + | |
7744 | + boolean slaveUse = false; | |
7745 | + boolean mainRetry = false; | |
7746 | + | |
7747 | + String nowUseNodeInfo = null; | |
7748 | + | |
7749 | + | |
7750 | + SocketException se = null; | |
7751 | + IOException ie = null; | |
7752 | + try { | |
7753 | + | |
7754 | + // KeyNodeとの接続を確立 | |
7755 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, false); | |
7756 | + | |
7757 | + while (true) { | |
7758 | + | |
7759 | + // 戻り値がnullの場合は何だかの理由で接続に失敗しているのでスレーブの設定がある場合は接続する | |
7760 | + // スレーブの設定がない場合は、エラーとしてExceptionをthrowする | |
7761 | + if (keyNodeConnector == null) { | |
7762 | + if (subKeyNodeName != null) keyNodeConnector = this.createKeyNodeConnection(subKeyNodeName, subKeyNodePort, subKeyNodeFullName, false); | |
7763 | + | |
7764 | + if (keyNodeConnector == null) throw new BatchException("Key Node IO Error: detail info for log file"); | |
7765 | + slaveUse = true; | |
7766 | + } | |
7767 | + | |
7768 | + | |
7769 | + try { | |
7770 | + // Key値でValueを取得 | |
7771 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
7772 | + String sendStr = null; | |
7773 | + // パラメータ作成 | |
7774 | + buf.append("54"); | |
7775 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7776 | + buf.append(this.stringCnv(listNameStr)); | |
7777 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7778 | + buf.append(listGetIndex); | |
7779 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7780 | + buf.append(transactionCode); | |
7781 | + sendStr = buf.toString(); | |
7782 | + | |
7783 | + // 送信 | |
7784 | + keyNodeConnector.println(buf.toString()); | |
7785 | + keyNodeConnector.flush(); | |
7786 | + | |
7787 | + // 返却値取得 | |
7788 | + String retParam = keyNodeConnector.readLine(sendStr); | |
7789 | + // 返却値を分解 | |
7790 | + // value値にセパレータが入っていても無視する | |
7791 | + retParams = retParam.split(ImdstDefine.keyHelperClientParamSep, 3); | |
7792 | + // 使用済みの接続を戻す | |
7793 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7794 | + | |
7795 | + if (retParams != null && retParams.length > 1 && retParams[1].equals("true")) { | |
7796 | + | |
7797 | + // 一貫性データが付随した状態から通常データに変換する | |
7798 | + // 弱一貫性の場合は時間は使用しない | |
7799 | + cnvConsistencyRet = dataConvert4Consistency(retParams[2]); | |
7800 | + retParams[2] = cnvConsistencyRet[0]; | |
7801 | + break; | |
7802 | + } else if (retParams != null && retParams.length > 1 && retParams[1].equals("false")) { | |
7803 | + // 結果なし 結果部分が返ってこない | |
7804 | + if (retParams.length < 3) { | |
7805 | + String[] tmpRetParams = new String[3]; | |
7806 | + tmpRetParams[0] = retParams[0]; | |
7807 | + tmpRetParams[1] = retParams[1]; | |
7808 | + tmpRetParams[2] = ""; | |
7809 | + retParams = tmpRetParams; | |
7810 | + } | |
7811 | + break; | |
7812 | + } else if (retParams != null && retParams.length > 1 && retParams[1].equals("error")) { | |
7813 | + break; | |
7814 | + } | |
7815 | + } catch(SocketException tSe) { | |
7816 | + // ここでのエラーは通信中に発生しているので、スレーブノードを使用していない場合のみ再度スレーブへの接続を試みる | |
7817 | + se = tSe; | |
7818 | + if (keyNodeConnector != null) { | |
7819 | + keyNodeConnector.close(); | |
7820 | + keyNodeConnector = null; | |
7821 | + } | |
7822 | + } catch(IOException tIe) { | |
7823 | + // ここでのエラーは通信中に発生しているので、スレーブノードを使用していない場合のみ再度スレーブへの接続を試みる | |
7824 | + ie = tIe; | |
7825 | + if (keyNodeConnector != null) { | |
7826 | + keyNodeConnector.close(); | |
7827 | + keyNodeConnector = null; | |
7828 | + } | |
7829 | + } | |
7830 | + | |
7831 | + // 既にスレーブの接続を使用している場合は、もう一度だけメインノードに接続を試みる | |
7832 | + // それで駄目な場合はエラーとする | |
7833 | + if (slaveUse) { | |
7834 | + if (mainRetry) { | |
7835 | + if (se != null) throw se; | |
7836 | + if (ie != null) throw ie; | |
7837 | + throw new BatchException("Key Node IO Error: detail info for log file"); | |
7838 | + } else { | |
7839 | + | |
7840 | + // メインKeyNodeとの接続を確立 | |
7841 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, true); | |
7842 | + if (keyNodeConnector == null) throw new BatchException("Key Node IO Error: detail info for log file"); | |
7843 | + mainRetry = true; | |
7844 | + } | |
7845 | + } else { | |
7846 | + if (subKeyNodeName == null) { | |
7847 | + if (se != null) throw se; | |
7848 | + if (ie != null) throw ie; | |
7849 | + } else{ | |
7850 | + keyNodeConnector = null; | |
7851 | + } | |
7852 | + } | |
7853 | + } | |
7854 | + } catch (Exception e) { | |
7855 | + if (keyNodeConnector != null) { | |
7856 | + keyNodeConnector.close(); | |
7857 | + keyNodeConnector = null; | |
7858 | + } | |
7859 | + throw new BatchException(e); | |
7860 | + } finally { | |
7861 | + // ノードの使用終了をマーク | |
7862 | + super.execNodeUseEnd(keyNodeFullName); | |
7863 | + | |
7864 | + if (subKeyNodeName != null) | |
7865 | + super.execNodeUseEnd(subKeyNodeFullName); | |
7866 | + } | |
7867 | + return retParams; | |
7868 | + } | |
7869 | + | |
7870 | + | |
7871 | + /** | |
7872 | + * KeyNodeにList構造体のLPOPを実行する.<br> | |
7873 | + * 結果を返却する.<br> | |
7874 | + * | |
7875 | + * @param keyNodeName ノードフルネームの名前(IPなど) | |
7876 | + * @param keyNodePort ノードフルネームのアクセスポート番号 | |
7877 | + * @param keyNodeFullName ノードフルネーム | |
7878 | + * @param listNameStr List名 | |
7879 | + * @param transactionCode トランザクションコード | |
7880 | + * @return String[] 結果 | |
7881 | + * @throws BatchException | |
7882 | + */ | |
7883 | + private String[] listLPop(String keyNodeName, String keyNodePort, String keyNodeFullName, String listNameStr, String transactionCode) throws BatchException { | |
7884 | + KeyNodeConnector keyNodeConnector = null; | |
7885 | + | |
7886 | + String nodeName = keyNodeName; | |
7887 | + String nodePort = keyNodePort; | |
7888 | + String nodeFullName = keyNodeFullName; | |
7889 | + | |
7890 | + String[] retParams = null; | |
7891 | + | |
7892 | + int counter = 0; | |
7893 | + | |
7894 | + String tmpSaveHost = null; | |
7895 | + String[] tmpSaveData = null; | |
7896 | + String retParam = null; | |
7897 | + | |
7898 | + boolean mainNodeSave = false; | |
7899 | + | |
7900 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferSmallSize); | |
7901 | + String sendStr = null; | |
7902 | + | |
7903 | + try { | |
7904 | + | |
7905 | + // TransactionModeの状態に合わせてLock状態を確かめる | |
7906 | + if (transactionMode) { | |
7907 | + while (true) { | |
7908 | + | |
7909 | + // TransactionMode時 | |
7910 | + // TransactionManagerに処理を依頼 | |
7911 | + String[] keyNodeLockRet = hasLockKeyNode(transactionManagerInfo[0], transactionManagerInfo[1], listNameStr); | |
7912 | + | |
7913 | + // 取得結果確認 | |
7914 | + if (keyNodeLockRet[1].equals("true")) { | |
7915 | + | |
7916 | + if (keyNodeLockRet[2].equals(transactionCode)) break; | |
7917 | + } else { | |
7918 | + break; | |
7919 | + } | |
7920 | + } | |
7921 | + } | |
7922 | + | |
7923 | + // 送信パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
7924 | + buf.append("55"); | |
7925 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7926 | + buf.append(this.stringCnv(listNameStr)); // List名 | |
7927 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
7928 | + buf.append(transactionCode); // Transaction値 | |
7929 | + | |
7930 | + sendStr = buf.toString(); | |
7931 | + | |
7932 | + // KeyNodeとの接続を確立 | |
7933 | + keyNodeConnector = this.createKeyNodeConnection(nodeName, nodePort, nodeFullName, false); | |
7934 | + | |
7935 | + // DataNodeに送信 | |
7936 | + if (keyNodeConnector != null) { | |
7937 | + // 接続結果と、現在の保存先状況で処理を分岐 | |
7938 | + try { | |
7939 | + | |
7940 | + // 送信 | |
7941 | + // LPOPはReadTimeoutになってもすぐに再送すると2回取り出してしまうので、 | |
7942 | + // ReadTimeout時間を長く設定する。 | |
7943 | + // 特にRecover時の挙動に合わせて長く設定している。 | |
7944 | + keyNodeConnector.setSoTimeout(ImdstDefine.nodeConnectionTimeout4RecoverMode); | |
7945 | + keyNodeConnector.println(sendStr); | |
7946 | + keyNodeConnector.flush(); | |
7947 | + | |
7948 | + // 返却値取得 | |
7949 | + retParam = keyNodeConnector.readLine(sendStr); | |
7950 | + keyNodeConnector.setSoTimeout(ImdstDefine.nodeConnectionTimeout); | |
7951 | + | |
7952 | + // Key値でValueを保存 | |
7953 | + // 特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
7954 | + if (retParam != null && retParam.indexOf(ImdstDefine.keyNodeLPopSuccessStr) == 0) { | |
7955 | + | |
7956 | + // 結果有りで成功 | |
7957 | + mainNodeSave = true; | |
7958 | + } else if (retParam != null && retParam.indexOf(ImdstDefine.keyNodeLPopNullStr) == 0) { | |
7959 | + // 結果なし | |
7960 | + mainNodeSave = true; | |
7961 | + } else { | |
7962 | + // 論理的に登録失敗 | |
7963 | + logger.error("LPOP Error Node =[" + nodeName + ":" + nodePort + "] retParam=[" + retParam + "]" + " Connectoer=[" + keyNodeConnector.connectorDump() + "]"); | |
7964 | + } | |
7965 | + | |
7966 | + // 使用済みの接続を戻す | |
7967 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
7968 | + | |
7969 | + } catch (SocketException se) { | |
7970 | + | |
7971 | + //se.printStackTrace(); | |
7972 | + if (keyNodeConnector != null) { | |
7973 | + keyNodeConnector.close(); | |
7974 | + keyNodeConnector = null; | |
7975 | + } | |
7976 | + super.setDeadNode(nodeName + ":" + nodePort, 5, se); | |
7977 | + logger.debug(se); | |
7978 | + } catch (IOException ie) { | |
7979 | + | |
7980 | + //ie.printStackTrace(); | |
7981 | + if (keyNodeConnector != null) { | |
7982 | + keyNodeConnector.close(); | |
7983 | + keyNodeConnector = null; | |
7984 | + } | |
7985 | + super.setDeadNode(nodeName + ":" + nodePort, 6, ie); | |
7986 | + logger.debug(ie); | |
7987 | + } catch (Exception ee) { | |
7988 | + | |
7989 | + //ee.printStackTrace(); | |
7990 | + if (keyNodeConnector != null) { | |
7991 | + keyNodeConnector.close(); | |
7992 | + keyNodeConnector = null; | |
7993 | + } | |
7994 | + super.setDeadNode(nodeName + ":" + nodePort, 7, ee); | |
7995 | + logger.debug(ee); | |
7996 | + } | |
7997 | + | |
7998 | + } | |
7999 | + | |
8000 | + // ノードへの保存状況を確認 | |
8001 | + if (mainNodeSave == false) { | |
8002 | + retParam = null; | |
8003 | + } | |
8004 | + | |
8005 | + } catch (Exception e) { | |
8006 | + | |
8007 | + if (keyNodeConnector != null) { | |
8008 | + keyNodeConnector.close(); | |
8009 | + keyNodeConnector = null; | |
8010 | + } | |
8011 | + retParam = null; | |
8012 | + } finally { | |
8013 | + | |
8014 | + // ノードの使用終了をマーク | |
8015 | + super.execNodeUseEnd(keyNodeFullName); | |
8016 | + | |
8017 | + // 返却地値をパースする | |
8018 | + if (retParam != null) { | |
8019 | + retParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
8020 | + } | |
8021 | + } | |
8022 | + | |
8023 | + return retParams; | |
8024 | + } | |
8025 | + | |
8026 | + | |
8027 | + /** | |
8028 | + * KeyNodeにList構造体のRPOPを実行する.<br> | |
8029 | + * 結果を返却する.<br> | |
8030 | + * | |
8031 | + * @param keyNodeName ノードフルネームの名前(IPなど) | |
8032 | + * @param keyNodePort ノードフルネームのアクセスポート番号 | |
8033 | + * @param keyNodeFullName ノードフルネーム | |
8034 | + * @param listNameStr List名 | |
8035 | + * @param transactionCode トランザクションコード | |
8036 | + * @return String[] 結果 | |
8037 | + * @throws BatchException | |
8038 | + */ | |
8039 | + private String[] listRPop(String keyNodeName, String keyNodePort, String keyNodeFullName, String listNameStr, String transactionCode) throws BatchException { | |
8040 | + KeyNodeConnector keyNodeConnector = null; | |
8041 | + | |
8042 | + String nodeName = keyNodeName; | |
8043 | + String nodePort = keyNodePort; | |
8044 | + String nodeFullName = keyNodeFullName; | |
8045 | + | |
8046 | + String[] retParams = null; | |
8047 | + | |
8048 | + int counter = 0; | |
8049 | + | |
8050 | + String tmpSaveHost = null; | |
8051 | + String[] tmpSaveData = null; | |
8052 | + String retParam = null; | |
8053 | + | |
8054 | + boolean mainNodeSave = false; | |
8055 | + | |
8056 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferSmallSize); | |
8057 | + String sendStr = null; | |
8058 | + | |
8059 | + try { | |
8060 | + | |
8061 | + // TransactionModeの状態に合わせてLock状態を確かめる | |
8062 | + if (transactionMode) { | |
8063 | + while (true) { | |
8064 | + | |
8065 | + // TransactionMode時 | |
8066 | + // TransactionManagerに処理を依頼 | |
8067 | + String[] keyNodeLockRet = hasLockKeyNode(transactionManagerInfo[0], transactionManagerInfo[1], listNameStr); | |
8068 | + | |
8069 | + // 取得結果確認 | |
8070 | + if (keyNodeLockRet[1].equals("true")) { | |
8071 | + | |
8072 | + if (keyNodeLockRet[2].equals(transactionCode)) break; | |
8073 | + } else { | |
8074 | + break; | |
8075 | + } | |
8076 | + } | |
8077 | + } | |
8078 | + | |
8079 | + // 送信パラメータ作成 キー値のハッシュ値文字列[セパレータ]データノード名 | |
8080 | + buf.append("56"); | |
8081 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
8082 | + buf.append(this.stringCnv(listNameStr)); // List名 | |
8083 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
8084 | + buf.append(transactionCode); // Transaction値 | |
8085 | + | |
8086 | + sendStr = buf.toString(); | |
8087 | + | |
8088 | + // KeyNodeとの接続を確立 | |
8089 | + keyNodeConnector = this.createKeyNodeConnection(nodeName, nodePort, nodeFullName, false); | |
8090 | + | |
8091 | + // DataNodeに送信 | |
8092 | + if (keyNodeConnector != null) { | |
8093 | + // 接続結果と、現在の保存先状況で処理を分岐 | |
8094 | + try { | |
8095 | + | |
8096 | + // 送信 | |
8097 | + // LPOPはReadTimeoutになってもすぐに再送すると2回取り出してしまうので、 | |
8098 | + // ReadTimeout時間を長く設定する。 | |
8099 | + // 特にRecover時の挙動に合わせて長く設定している。 | |
8100 | + keyNodeConnector.setSoTimeout(ImdstDefine.nodeConnectionTimeout4RecoverMode); | |
8101 | + keyNodeConnector.println(sendStr); | |
8102 | + keyNodeConnector.flush(); | |
8103 | + | |
8104 | + // 返却値取得 | |
8105 | + retParam = keyNodeConnector.readLine(sendStr); | |
8106 | + keyNodeConnector.setSoTimeout(ImdstDefine.nodeConnectionTimeout); | |
8107 | + | |
8108 | + // Key値でValueを保存 | |
8109 | + // 特定文字列で返却値が始まるかをチェックし始まる場合は登録成功 | |
8110 | + if (retParam != null && retParam.indexOf(ImdstDefine.keyNodeLPopSuccessStr) == 0) { | |
8111 | + | |
8112 | + // 結果有りで成功 | |
8113 | + mainNodeSave = true; | |
8114 | + } else if (retParam != null && retParam.indexOf(ImdstDefine.keyNodeLPopNullStr) == 0) { | |
8115 | + // 結果なし | |
8116 | + mainNodeSave = true; | |
8117 | + } else { | |
8118 | + // 論理的に登録失敗 | |
8119 | + logger.error("RPOP Error Node =[" + nodeName + ":" + nodePort + "] retParam=[" + retParam + "]" + " Connectoer=[" + keyNodeConnector.connectorDump() + "]"); | |
8120 | + } | |
8121 | + | |
8122 | + // 使用済みの接続を戻す | |
8123 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
8124 | + | |
8125 | + } catch (SocketException se) { | |
8126 | + | |
8127 | + //se.printStackTrace(); | |
8128 | + if (keyNodeConnector != null) { | |
8129 | + keyNodeConnector.close(); | |
8130 | + keyNodeConnector = null; | |
8131 | + } | |
8132 | + super.setDeadNode(nodeName + ":" + nodePort, 5, se); | |
8133 | + logger.debug(se); | |
8134 | + } catch (IOException ie) { | |
8135 | + | |
8136 | + //ie.printStackTrace(); | |
8137 | + if (keyNodeConnector != null) { | |
8138 | + keyNodeConnector.close(); | |
8139 | + keyNodeConnector = null; | |
8140 | + } | |
8141 | + super.setDeadNode(nodeName + ":" + nodePort, 6, ie); | |
8142 | + logger.debug(ie); | |
8143 | + } catch (Exception ee) { | |
8144 | + | |
8145 | + //ee.printStackTrace(); | |
8146 | + if (keyNodeConnector != null) { | |
8147 | + keyNodeConnector.close(); | |
8148 | + keyNodeConnector = null; | |
8149 | + } | |
8150 | + super.setDeadNode(nodeName + ":" + nodePort, 7, ee); | |
8151 | + logger.debug(ee); | |
8152 | + } | |
8153 | + | |
8154 | + } | |
8155 | + | |
8156 | + // ノードへの保存状況を確認 | |
8157 | + if (mainNodeSave == false) { | |
8158 | + retParam = null; | |
8159 | + } | |
8160 | + | |
8161 | + } catch (Exception e) { | |
8162 | + | |
8163 | + if (keyNodeConnector != null) { | |
8164 | + keyNodeConnector.close(); | |
8165 | + keyNodeConnector = null; | |
8166 | + } | |
8167 | + retParam = null; | |
8168 | + } finally { | |
8169 | + | |
8170 | + // ノードの使用終了をマーク | |
8171 | + super.execNodeUseEnd(keyNodeFullName); | |
8172 | + | |
8173 | + // 返却地値をパースする | |
8174 | + if (retParam != null) { | |
8175 | + retParams = retParam.split(ImdstDefine.keyHelperClientParamSep); | |
8176 | + } | |
8177 | + } | |
8178 | + | |
8179 | + return retParams; | |
8180 | + } | |
8181 | + | |
8182 | + | |
8183 | + /** | |
8184 | + * KeyNodeのList構造体のサイズを取得する.<br> | |
8185 | + * | |
8186 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
8187 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
8188 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
8189 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
8190 | + * @param listNameStr List名文字列 | |
8191 | + * @return String[] 結果 | |
8192 | + * @throws BatchException | |
8193 | + */ | |
8194 | + private String[] listLen(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String thirdKeyNodeName, String thirdKeyNodePort, String thirdKeyNodeFullName, String listNameStr, String transactionCode) throws BatchException { | |
8195 | + boolean exceptionFlg = false; | |
8196 | + String[] ret = null; | |
8197 | + String[] thirdRet = null; | |
8198 | + BatchException retBe = null; | |
8199 | + | |
8200 | + try { | |
8201 | + | |
8202 | + ret = this.listLen(keyNodeName, keyNodePort, keyNodeFullName, subKeyNodeName, subKeyNodePort, subKeyNodeFullName, listNameStr, transactionCode); | |
8203 | + } catch (BatchException be) { | |
8204 | + | |
8205 | + retBe = be; | |
8206 | + exceptionFlg = true; | |
8207 | + } catch (Exception e) { | |
8208 | + | |
8209 | + retBe = new BatchException(e); | |
8210 | + exceptionFlg = true; | |
8211 | + } finally { | |
8212 | + | |
8213 | + try { | |
8214 | + if (exceptionFlg) { | |
8215 | + thirdRet = this.listLen(thirdKeyNodeName, thirdKeyNodePort, thirdKeyNodeFullName, null, null, null, listNameStr, transactionCode); | |
8216 | + ret = thirdRet; | |
8217 | + } else { | |
8218 | + // サードノードの使用終了のみマーク | |
8219 | + if (thirdKeyNodeFullName != null) | |
8220 | + super.execNodeUseEnd(thirdKeyNodeFullName); | |
8221 | + } | |
8222 | + } catch (Exception e) { | |
8223 | + if (exceptionFlg) throw retBe; | |
8224 | + } | |
8225 | + } | |
8226 | + | |
8227 | + return ret; | |
8228 | + } | |
8229 | + | |
8230 | + | |
8231 | + /** | |
8232 | + * KeyNodeのList構造体のサイズを取得する.<br> | |
8233 | + * | |
8234 | + * @param keyNodeName マスターデータノードの名前(IPなど) | |
8235 | + * @param keyNodePort マスターデータノードのアクセスポート番号 | |
8236 | + * @param subKeyNodeName スレーブデータノードの名前(IPなど) | |
8237 | + * @param subKeyNodePort スレーブデータノードのアクセスポート番号 | |
8238 | + * @param listNameStr List名文字列 | |
8239 | + * @return String[] 結果 | |
8240 | + * @throws BatchException | |
8241 | + */ | |
8242 | + private String[] listLen(String keyNodeName, String keyNodePort, String keyNodeFullName, String subKeyNodeName, String subKeyNodePort, String subKeyNodeFullName, String listNameStr, String transactionCode) throws BatchException { | |
8243 | + KeyNodeConnector keyNodeConnector = null; | |
8244 | + | |
8245 | + String[] retParams = null; | |
8246 | + String[] cnvConsistencyRet = null; | |
8247 | + | |
8248 | + boolean slaveUse = false; | |
8249 | + boolean mainRetry = false; | |
8250 | + | |
8251 | + String nowUseNodeInfo = null; | |
8252 | + | |
8253 | + | |
8254 | + SocketException se = null; | |
8255 | + IOException ie = null; | |
8256 | + try { | |
8257 | + | |
8258 | + // KeyNodeとの接続を確立 | |
8259 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, false); | |
8260 | + | |
8261 | + while (true) { | |
8262 | + | |
8263 | + // 戻り値がnullの場合は何だかの理由で接続に失敗しているのでスレーブの設定がある場合は接続する | |
8264 | + // スレーブの設定がない場合は、エラーとしてExceptionをthrowする | |
8265 | + if (keyNodeConnector == null) { | |
8266 | + if (subKeyNodeName != null) keyNodeConnector = this.createKeyNodeConnection(subKeyNodeName, subKeyNodePort, subKeyNodeFullName, false); | |
8267 | + | |
8268 | + if (keyNodeConnector == null) throw new BatchException("Key Node IO Error: detail info for log file"); | |
8269 | + slaveUse = true; | |
8270 | + } | |
8271 | + | |
8272 | + | |
8273 | + try { | |
8274 | + // Key値でValueを取得 | |
8275 | + StringBuilder buf = new StringBuilder(ImdstDefine.stringBufferMiddleSize); | |
8276 | + String sendStr = null; | |
8277 | + // パラメータ作成 | |
8278 | + buf.append("57"); | |
8279 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
8280 | + buf.append(this.stringCnv(listNameStr)); | |
8281 | + buf.append(ImdstDefine.keyHelperClientParamSep); | |
8282 | + buf.append(transactionCode); | |
8283 | + sendStr = buf.toString(); | |
8284 | + | |
8285 | + // 送信 | |
8286 | + keyNodeConnector.println(buf.toString()); | |
8287 | + keyNodeConnector.flush(); | |
8288 | + | |
8289 | + // 返却値取得 | |
8290 | + String retParam = keyNodeConnector.readLine(sendStr); | |
8291 | + | |
8292 | + // 返却値を分解 | |
8293 | + // value値にセパレータが入っていても無視する | |
8294 | + retParams = retParam.split(ImdstDefine.keyHelperClientParamSep, 3); | |
8295 | + | |
8296 | + // 使用済みの接続を戻す | |
8297 | + super.addKeyNodeCacheConnectionPool(keyNodeConnector); | |
8298 | + | |
8299 | + if (retParams != null && retParams.length > 1 && retParams[1].equals("true")) { | |
8300 | + | |
8301 | + // 一貫性データが付随した状態から通常データに変換する | |
8302 | + // 弱一貫性の場合は時間は使用しない | |
8303 | + cnvConsistencyRet = dataConvert4Consistency(retParams[2]); | |
8304 | + retParams[2] = cnvConsistencyRet[0]; | |
8305 | + break; | |
8306 | + } else if (retParams != null && retParams.length > 1 && retParams[1].equals("false")) { | |
8307 | + retParams[2] = ""; | |
8308 | + break; | |
8309 | + } else if (retParams != null && retParams.length > 1 && retParams[1].equals("error")) { | |
8310 | + break; | |
8311 | + } | |
8312 | + } catch(SocketException tSe) { | |
8313 | + // ここでのエラーは通信中に発生しているので、スレーブノードを使用していない場合のみ再度スレーブへの接続を試みる | |
8314 | + se = tSe; | |
8315 | + if (keyNodeConnector != null) { | |
8316 | + keyNodeConnector.close(); | |
8317 | + keyNodeConnector = null; | |
8318 | + } | |
8319 | + } catch(IOException tIe) { | |
8320 | + // ここでのエラーは通信中に発生しているので、スレーブノードを使用していない場合のみ再度スレーブへの接続を試みる | |
8321 | + ie = tIe; | |
8322 | + if (keyNodeConnector != null) { | |
8323 | + keyNodeConnector.close(); | |
8324 | + keyNodeConnector = null; | |
8325 | + } | |
8326 | + } | |
8327 | + | |
8328 | + // 既にスレーブの接続を使用している場合は、もう一度だけメインノードに接続を試みる | |
8329 | + // それで駄目な場合はエラーとする | |
8330 | + if (slaveUse) { | |
8331 | + if (mainRetry) { | |
8332 | + if (se != null) throw se; | |
8333 | + if (ie != null) throw ie; | |
8334 | + throw new BatchException("Key Node IO Error: detail info for log file"); | |
8335 | + } else { | |
8336 | + | |
8337 | + // メインKeyNodeとの接続を確立 | |
8338 | + keyNodeConnector = this.createKeyNodeConnection(keyNodeName, keyNodePort, keyNodeFullName, true); | |
8339 | + if (keyNodeConnector == null) throw new BatchException("Key Node IO Error: detail info for log file"); | |
8340 | + mainRetry = true; | |
8341 | + } | |
8342 | + } else { | |
8343 | + if (subKeyNodeName == null) { | |
8344 | + if (se != null) throw se; | |
8345 | + if (ie != null) throw ie; | |
8346 | + } else{ | |
8347 | + keyNodeConnector = null; | |
8348 | + } | |
8349 | + } | |
8350 | + } | |
8351 | + } catch (Exception e) { | |
8352 | + if (keyNodeConnector != null) { | |
8353 | + keyNodeConnector.close(); | |
8354 | + keyNodeConnector = null; | |
8355 | + } | |
8356 | + throw new BatchException(e); | |
8357 | + } finally { | |
8358 | + // ノードの使用終了をマーク | |
8359 | + super.execNodeUseEnd(keyNodeFullName); | |
8360 | + | |
8361 | + if (subKeyNodeName != null) | |
8362 | + super.execNodeUseEnd(subKeyNodeFullName); | |
8363 | + } | |
8364 | + return retParams; | |
8365 | + } | |
8366 | + | |
8367 | + | |
8368 | + /** | |
5927 | 8369 | * KeyNodeに対してデータを保存する.<br> |
5928 | 8370 | * 同時に排他制御を行う(cas相当).<br> |
5929 | 8371 | * |
@@ -160,6 +160,9 @@ | ||
160 | 160 | // リスト構造体の現在の最大Pointerの表す値を取得する場合のList名に付加する値 |
161 | 161 | private static String listStructPointerPrefix = new String(BASE64EncoderStream.encode(ImdstDefine.imdstListStructPointerPrefixStr.getBytes())); |
162 | 162 | |
163 | + // リスト構造体の現在のサイズの表す値を取得する場合のList名に付加する値 | |
164 | + private static String listStructSizePrefix = new String(BASE64EncoderStream.encode(ImdstDefine.imdstListStructSizePrefixStr.getBytes())); | |
165 | + | |
163 | 166 | // リスト構造体のList内の値を格納するKeyのPrefix |
164 | 167 | private static String listStructDataKeyPrefix = new String(BASE64EncoderStream.encode(ImdstDefine.imdstListDataPrefixStr.getBytes())); |
165 | 168 |
@@ -1090,12 +1093,13 @@ | ||
1090 | 1093 | * 既に作成済みの場合は失敗となる<br> |
1091 | 1094 | * |
1092 | 1095 | * @param listName List名 |
1096 | + * @param compulsiveFlg 強制作成フラグ | |
1093 | 1097 | * @param transactionCode |
1094 | - * @return 成否 | |
1098 | + * @return 処理ステータス 0=成功 1=失敗 2=既に存在する | |
1095 | 1099 | * @throw BatchException |
1096 | 1100 | */ |
1097 | - public boolean createListStruct(String listName, String transactionCode) throws BatchException { | |
1098 | - boolean ret = false; | |
1101 | + public int createListStruct(String listName, boolean compulsiveFlg, String transactionCode) throws BatchException { | |
1102 | + int ret = 1; | |
1099 | 1103 | if (!blocking) { |
1100 | 1104 | try { |
1101 | 1105 | // このsynchroの方法は正しくないきがするが。。。 |
@@ -1102,12 +1106,15 @@ | ||
1102 | 1106 | synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
1103 | 1107 | |
1104 | 1108 | String pointerKey = listStructPointerPrefix + listName; |
1109 | + String sizeKey = listStructSizePrefix + listName; | |
1105 | 1110 | String key = listStructStartPrefix + listName; |
1106 | 1111 | String[] keyList = new String[2]; |
1107 | 1112 | keyList[0] = key; |
1108 | 1113 | keyList[1] = listStructEndPrefix + listName;; |
1109 | 1114 | |
1110 | - if(this.containsKeyPair(pointerKey)) { | |
1115 | + if(compulsiveFlg == false && this.containsKeyPair(pointerKey)) { | |
1116 | + // 既に作成済み | |
1117 | + ret = 2; | |
1111 | 1118 | return ret; |
1112 | 1119 | } |
1113 | 1120 |
@@ -1121,6 +1128,9 @@ | ||
1121 | 1128 | |
1122 | 1129 | if (this.moveAdjustmentDataMap != null && this.moveAdjustmentDataMap.containsKey(pointerKey)) |
1123 | 1130 | this.moveAdjustmentDataMap.remove(pointerKey); |
1131 | + | |
1132 | + if (this.moveAdjustmentDataMap != null && this.moveAdjustmentDataMap.containsKey(sizeKey)) | |
1133 | + this.moveAdjustmentDataMap.remove(sizeKey); | |
1124 | 1134 | } |
1125 | 1135 | } |
1126 | 1136 |
@@ -1154,7 +1164,7 @@ | ||
1154 | 1164 | } |
1155 | 1165 | } |
1156 | 1166 | |
1157 | - // 最後に最終位置のポインター情報を格納 | |
1167 | + // 最終位置のポインター情報を格納 | |
1158 | 1168 | data = "0" + ImdstDefine.setTimeParamSep + "0"; |
1159 | 1169 | |
1160 | 1170 | keyMapObjPut(pointerKey, data); |
@@ -1182,7 +1192,36 @@ | ||
1182 | 1192 | } |
1183 | 1193 | } |
1184 | 1194 | |
1185 | - ret = true; | |
1195 | + | |
1196 | + // リストサイズ情報を格納 | |
1197 | + data = "0" + ImdstDefine.setTimeParamSep + "0"; | |
1198 | + | |
1199 | + keyMapObjPut(sizeKey, data); | |
1200 | + | |
1201 | + // データ操作履歴ファイルに追記 | |
1202 | + if (this.workFileMemory == false) { | |
1203 | + synchronized(this.lockWorkFileSync) { | |
1204 | + if (this.workFileFlushTiming) { | |
1205 | + | |
1206 | + this.bw.write(new StringBuilder(ImdstDefine.stringBufferSmall_2Size).append("+").append(KeyMapManager.workFileSeq).append(sizeKey).append(KeyMapManager.workFileSeq).append(data).append(KeyMapManager.workFileSeq).append(JavaSystemApi.currentTimeMillis).append(KeyMapManager.workFileSeq).append(KeyMapManager.workFileEndPoint).append("\n").toString()); | |
1207 | + SystemUtil.diskAccessSync(this.bw); | |
1208 | + this.checkTransactionLogWriterLimit(this.tLogWriteCount.incrementAndGet()); | |
1209 | + } else { | |
1210 | + | |
1211 | + this.dataTransactionFileFlushDaemon.addDataTransaction(new StringBuilder(ImdstDefine.stringBufferSmall_2Size).append("+").append(KeyMapManager.workFileSeq).append(sizeKey).append(KeyMapManager.workFileSeq).append(data).append(KeyMapManager.workFileSeq).append(JavaSystemApi.currentTimeMillis).append(KeyMapManager.workFileSeq).append(KeyMapManager.workFileEndPoint).append("\n").toString()); | |
1212 | + } | |
1213 | + } | |
1214 | + } | |
1215 | + | |
1216 | + if (this.diffDataPoolingFlg) { | |
1217 | + synchronized (diffSync) { | |
1218 | + if (this.diffDataPoolingFlg) { | |
1219 | + this.diffDataPoolingListForFileBase.add("+" + KeyMapManager.workFileSeq + sizeKey + KeyMapManager.workFileSeq + data); | |
1220 | + } | |
1221 | + } | |
1222 | + } | |
1223 | + | |
1224 | + ret = 0; | |
1186 | 1225 | } |
1187 | 1226 | // データの書き込みを指示 |
1188 | 1227 | this.writeMapFileFlg = true; |
@@ -1218,6 +1257,8 @@ | ||
1218 | 1257 | // このsynchroの方法は正しくないきがするが。。。 |
1219 | 1258 | synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
1220 | 1259 | String pointerKey = listStructPointerPrefix + listName; |
1260 | + String sizeKey = listStructSizePrefix + listName; | |
1261 | + | |
1221 | 1262 | String key = listStructStartPrefix + listName; |
1222 | 1263 | String[] keyList = new String[3]; |
1223 | 1264 | boolean allDataDeleted = false; |
@@ -1341,6 +1382,19 @@ | ||
1341 | 1382 | saveDataList.add(saveDataTmp); |
1342 | 1383 | } |
1343 | 1384 | |
1385 | + // Listサイズをインクリメント | |
1386 | + String nowSizeRet = keyMapObjGet(sizeKey); | |
1387 | + if (nowSizeRet == null) throw new BatchException("List size not found error"); | |
1388 | + String[] nowSizeRetSplit = nowSizeRet.split(ImdstDefine.setTimeParamSep); | |
1389 | + long listSizeLong = new Long(nowSizeRetSplit[0]).longValue(); | |
1390 | + listSizeLong++; | |
1391 | + String nextSize = listSizeLong + ImdstDefine.setTimeParamSep + "0"; | |
1392 | + keyMapObjPut(sizeKey, nextSize); | |
1393 | + String[] saveSizeDataTmp = new String[]{sizeKey, nextSize}; | |
1394 | + saveDataList.add(saveSizeDataTmp); | |
1395 | + | |
1396 | + | |
1397 | + // 以降操作記録ログへの書き込み処理 | |
1344 | 1398 | for (int idx = 0; idx < saveDataList.size(); idx++) { |
1345 | 1399 | |
1346 | 1400 | String[] saveData = (String[])saveDataList.get(idx); |
@@ -1412,6 +1466,7 @@ | ||
1412 | 1466 | // このsynchroの方法は正しくないきがするが。。。 |
1413 | 1467 | synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
1414 | 1468 | String pointerKey = listStructPointerPrefix + listName; |
1469 | + String sizeKey = listStructSizePrefix + listName; | |
1415 | 1470 | String key = listStructStartPrefix + listName; |
1416 | 1471 | String[] keyList = new String[3]; |
1417 | 1472 | boolean allDataDeleted = false; |
@@ -1533,6 +1588,20 @@ | ||
1533 | 1588 | saveDataList.add(saveDataTmp); |
1534 | 1589 | } |
1535 | 1590 | |
1591 | + // Listサイズをインクリメント | |
1592 | + String nowSizeRet = keyMapObjGet(sizeKey); | |
1593 | + if (nowSizeRet == null) throw new BatchException("List size not found error"); | |
1594 | + String[] nowSizeRetSplit = nowSizeRet.split(ImdstDefine.setTimeParamSep); | |
1595 | + long listSizeLong = new Long(nowSizeRetSplit[0]).longValue(); | |
1596 | + listSizeLong++; | |
1597 | + String nextSize = listSizeLong + ImdstDefine.setTimeParamSep + "0"; | |
1598 | + | |
1599 | + keyMapObjPut(sizeKey, nextSize); | |
1600 | + String[] saveSizeDataTmp = new String[]{sizeKey, nextSize}; | |
1601 | + saveDataList.add(saveSizeDataTmp); | |
1602 | + | |
1603 | + | |
1604 | + // 以降操作記録ログへの書き込み処理 | |
1536 | 1605 | for (int idx = 0; idx < saveDataList.size(); idx++) { |
1537 | 1606 | |
1538 | 1607 | String[] saveData = (String[])saveDataList.get(idx); |
@@ -1676,6 +1745,7 @@ | ||
1676 | 1745 | // このsynchroの方法は正しくないきがするが。。。 |
1677 | 1746 | synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
1678 | 1747 | String pointerKey = listStructPointerPrefix + listName; |
1748 | + String sizeKey = listStructSizePrefix + listName; | |
1679 | 1749 | String key = listStructStartPrefix + listName; |
1680 | 1750 | String[] keyList = new String[3]; |
1681 | 1751 |
@@ -1742,6 +1812,18 @@ | ||
1742 | 1812 | saveDataList.add(saveDataTmp); |
1743 | 1813 | } |
1744 | 1814 | |
1815 | + // Listサイズをデクリメント | |
1816 | + String nowSizeRet = keyMapObjGet(sizeKey); | |
1817 | + if (nowSizeRet == null) throw new BatchException("List size not found error"); | |
1818 | + String[] nowSizeRetSplit = nowSizeRet.split(ImdstDefine.setTimeParamSep); | |
1819 | + long listSizeLong = new Long(nowSizeRetSplit[0]).longValue(); | |
1820 | + listSizeLong--; | |
1821 | + String nextSize = listSizeLong + ImdstDefine.setTimeParamSep + "0"; | |
1822 | + keyMapObjPut(sizeKey, nextSize); | |
1823 | + saveDataTmp = new String[]{sizeKey, nextSize}; | |
1824 | + saveDataList.add(saveDataTmp); | |
1825 | + | |
1826 | + | |
1745 | 1827 | // ここまでの登録、削除を記録 |
1746 | 1828 | for (int idx = 0; idx < saveDataList.size(); idx++) { |
1747 | 1829 |
@@ -1814,6 +1896,7 @@ | ||
1814 | 1896 | // このsynchroの方法は正しくないきがするが。。。 |
1815 | 1897 | synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { |
1816 | 1898 | String pointerKey = listStructPointerPrefix + listName; |
1899 | + String sizeKey = listStructSizePrefix + listName; | |
1817 | 1900 | String[] keyList = new String[3]; |
1818 | 1901 | |
1819 | 1902 | String key = listStructStartPrefix + listName; |
@@ -1883,6 +1966,17 @@ | ||
1883 | 1966 | saveDataList.add(saveDataTmp); |
1884 | 1967 | } |
1885 | 1968 | |
1969 | + // Listサイズをデクリメント | |
1970 | + String nowSizeRet = keyMapObjGet(sizeKey); | |
1971 | + if (nowSizeRet == null) throw new BatchException("List size not found error"); | |
1972 | + String[] nowSizeRetSplit = nowSizeRet.split(ImdstDefine.setTimeParamSep); | |
1973 | + long listSizeLong = new Long(nowSizeRetSplit[0]).longValue(); | |
1974 | + listSizeLong--; | |
1975 | + String nextSize = listSizeLong + ImdstDefine.setTimeParamSep + "0"; | |
1976 | + keyMapObjPut(sizeKey, nextSize); | |
1977 | + saveDataTmp = new String[]{sizeKey, nextSize}; | |
1978 | + saveDataList.add(saveDataTmp); | |
1979 | + | |
1886 | 1980 | // ここまでの登録、削除を記録 |
1887 | 1981 | for (int idx = 0; idx < saveDataList.size(); idx++) { |
1888 | 1982 |
@@ -1936,6 +2030,52 @@ | ||
1936 | 2030 | } |
1937 | 2031 | return ret; |
1938 | 2032 | } |
2033 | + | |
2034 | + | |
2035 | + /** | |
2036 | + * 現在のList構造体のサイズを返す.<br> | |
2037 | + * | |
2038 | + * @param listName リスト名 | |
2039 | + * @param transactionCode | |
2040 | + * @return サイズ | |
2041 | + * @throws BatchException Size構造体が存在しない場合 | |
2042 | + */ | |
2043 | + public String listLen(String listName, String transactionCode) throws BatchException { | |
2044 | + String ret = null; | |
2045 | + | |
2046 | + if (!blocking) { | |
2047 | + try { | |
2048 | + // このsynchroの方法は正しくないきがするが。。。 | |
2049 | + synchronized(this.parallelSyncObjs[((listName.hashCode() << 1) >>> 1) % KeyMapManager.parallelSize]) { | |
2050 | + String pointerKey = listStructPointerPrefix + listName; | |
2051 | + String sizeKey = listStructSizePrefix + listName; | |
2052 | + | |
2053 | + // List構造体が存在しない場合はエラー | |
2054 | + if(!this.containsKeyPair(pointerKey)) { | |
2055 | + ret = null; | |
2056 | + return ret; | |
2057 | + } | |
2058 | + | |
2059 | + | |
2060 | + // Listサイズをデクリメント | |
2061 | + String nowSizeRet = keyMapObjGet(sizeKey); | |
2062 | + if (nowSizeRet == null) throw new BatchException("List size not found error"); | |
2063 | + String[] nowSizeRetSplit = nowSizeRet.split(ImdstDefine.setTimeParamSep); | |
2064 | + ret = nowSizeRetSplit[0]; | |
2065 | + } | |
2066 | + } catch (BatchException be) { | |
2067 | + throw be; | |
2068 | + } catch (Exception e) { | |
2069 | + e.printStackTrace(); | |
2070 | + logger.error("listLen - Error"); | |
2071 | + blocking = true; | |
2072 | + StatusUtil.setStatusAndMessage(1, "listLen - Error [" + e.getMessage() + "]"); | |
2073 | + throw new BatchException(e); | |
2074 | + } | |
2075 | + } | |
2076 | + return ret; | |
2077 | + } | |
2078 | + | |
1939 | 2079 | // Listの指定位置のデータを消す |
1940 | 2080 | |
1941 | 2081 |
@@ -3285,8 +3425,13 @@ | ||
3285 | 3425 | if (obj == null) continue; |
3286 | 3426 | String key = null; |
3287 | 3427 | key = (String)obj.getKey(); |
3288 | - pw.println(key); | |
3289 | - pw.flush(); | |
3428 | + try { | |
3429 | + String decodeKey = new String(BASE64DecoderStream.decode(key.getBytes())); | |
3430 | + if (decodeKey.indexOf("{imdst_") != 0) { | |
3431 | + pw.println(decodeKey); | |
3432 | + pw.flush(); | |
3433 | + } | |
3434 | + } catch(Exception ee){} | |
3290 | 3435 | } |
3291 | 3436 | |
3292 | 3437 | pw.println("-1"); |
@@ -74,6 +74,9 @@ | ||
74 | 74 | // List構造体の現時点での最終ポインターデータを表すPrefix |
75 | 75 | public static final String imdstListStructPointerPrefixStr = "{imdst_list_pointer#878685"; |
76 | 76 | |
77 | + // List構造体の現時点でのリストサイズを表すPrefix | |
78 | + public static final String imdstListStructSizePrefixStr = "{imdst_list_size#848382"; | |
79 | + | |
77 | 80 | // List構造体の内部データを表すPrefix |
78 | 81 | public static final String imdstListDataPrefixStr = "{imdst_list_data#567"; |
79 | 82 |
@@ -96,6 +99,9 @@ | ||
96 | 99 | // データノードに対するKeyデータ登録時にバージョン値が変わっている場合のエラーメッセージ |
97 | 100 | public static final String keyNodeKeyUpdatedErrMsg = "NG:Data has already been updated"; |
98 | 101 | |
102 | + // 既にリスト構造体が存在する場合のエラーメッセージ | |
103 | + public static final String keyNodeListCreateErrMsg = "NG:List already exists"; | |
104 | + | |
99 | 105 | // データノードに対するKeyデータ削除時に成功した場合の返却文字列の先頭部分 |
100 | 106 | public static final String keyNodeKeyRemoveSuccessStr = "5,true"; |
101 | 107 |
@@ -120,7 +126,21 @@ | ||
120 | 126 | // データノードに対するKeyに紐付くTagデータ削除時に失敗した場合の返却文字列の先頭部分 |
121 | 127 | public static final String keyNodeTgaInKeyRemoveNotFoundStr = "40,false"; |
122 | 128 | |
129 | + // データノードに対するList構造体作成時に成功した場合の返却文字列の先頭部分 | |
130 | + public static final String keyNodeListStructCreateSuccessStr = "51,true"; | |
123 | 131 | |
132 | + // データノードに対するList構造体へにLPUSH時に成功した場合の返却文字列の先頭部分 | |
133 | + public static final String keyNodeLPushSuccessStr = "52,true"; | |
134 | + | |
135 | + // データノードに対するList構造体へにRPUSH時に成功した場合の返却文字列の先頭部分 | |
136 | + public static final String keyNodeRPushSuccessStr = "53,true"; | |
137 | + | |
138 | + // データノードに対するList構造体へにLPOP時に成功した場合の返却文字列の先頭部分 | |
139 | + public static final String keyNodeLPopSuccessStr = "55,true"; | |
140 | + | |
141 | + // データノードに対するList構造体へにLPOP時に成功した場合の返却文字列の先頭部分 | |
142 | + public static final String keyNodeLPopNullStr = "55,false"; | |
143 | + | |
124 | 144 | // MasterNodeのgetMultiValueを呼び出した際のClientへの戻り値 |
125 | 145 | public static final String getMultiEndOfDataStr = "END"; |
126 | 146 |