Skip to content
This repository was archived by the owner on Jan 9, 2024. It is now read-only.

Commit 3092dd7

Browse files
committed
fix bug: blocking on close
1 parent 4a7ee07 commit 3092dd7

File tree

5 files changed

+71
-14
lines changed

5 files changed

+71
-14
lines changed

src/main/java/cc/cc1234/main/PrettyZooApplication.java

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package cc.cc1234.main;
22

3+
import cc.cc1234.main.cache.ZkClientCache;
4+
import cc.cc1234.main.cache.ZkListenerCache;
35
import cc.cc1234.main.controller.NodeTreeViewController;
46
import javafx.application.Application;
57
import javafx.fxml.FXMLLoader;
@@ -32,6 +34,14 @@ public static void showNodeTreeView(Stage primary) throws IOException {
3234
NodeTreeViewController controller = loader.getController();
3335
controller.setPrimaryStage(primary);
3436
primary.show();
37+
38+
}
39+
40+
@Override
41+
public void stop() throws Exception {
42+
super.stop();
43+
ZkListenerCache.getInstance().closeAll();
44+
ZkClientCache.getInstance().closeAll();
3545
}
3646

3747
public static void main(String[] args) {

src/main/java/cc/cc1234/main/cache/ZkClientCache.java

+6
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,10 @@ public CuratorFramework put(String server, CuratorFramework client) {
2727
return CACHE.put(server, client);
2828
}
2929

30+
public void closeAll() {
31+
CACHE.forEach((key, client) -> {
32+
client.close();
33+
});
34+
}
35+
3036
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cc.cc1234.main.cache;
2+
3+
import cc.cc1234.main.manager.CuratorlistenerManager;
4+
5+
import java.util.Map;
6+
import java.util.concurrent.ConcurrentHashMap;
7+
8+
public class ZkListenerCache {
9+
10+
private static final Map<String, CuratorlistenerManager> CACHE = new ConcurrentHashMap<>();
11+
12+
private static final ZkListenerCache ZK_LISTENER_CACHE = new ZkListenerCache();
13+
14+
public static ZkListenerCache getInstance() {
15+
return ZK_LISTENER_CACHE;
16+
}
17+
18+
public void put(String server, CuratorlistenerManager manager) {
19+
CACHE.put(server, manager);
20+
}
21+
22+
public CuratorlistenerManager get(String server) {
23+
return CACHE.get(server);
24+
}
25+
26+
public static boolean contains(String server) {
27+
return CACHE.containsKey(server);
28+
}
29+
30+
public void closeAll() {
31+
CACHE.forEach((key, manager) -> manager.close());
32+
}
33+
}

src/main/java/cc/cc1234/main/controller/NodeTreeViewController.java

+18-14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import cc.cc1234.main.cache.TreeItemCache;
44
import cc.cc1234.main.cache.ZkClientCache;
5+
import cc.cc1234.main.cache.ZkListenerCache;
56
import cc.cc1234.main.curator.NodeEventHandler;
67
import cc.cc1234.main.history.History;
78
import cc.cc1234.main.manager.CuratorlistenerManager;
@@ -19,14 +20,15 @@
1920
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
2021
import org.apache.curator.retry.RetryOneTime;
2122
import org.apache.zookeeper.data.Stat;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
2225

23-
import java.util.Map;
24-
import java.util.concurrent.ConcurrentHashMap;
25-
import java.util.concurrent.Executors;
2626
import java.util.concurrent.atomic.AtomicReference;
2727

2828
public class NodeTreeViewController {
2929

30+
private static final Logger LOG = LoggerFactory.getLogger(NodeTreeViewController.class);
31+
3032
@FXML
3133
private TreeView<ZkNode> zkNodeTreeView;
3234

@@ -81,10 +83,7 @@ public class NodeTreeViewController {
8183

8284
private ZkClientCache serverClientCache = ZkClientCache.getInstance();
8385

84-
/**
85-
* [server:manager]
86-
*/
87-
private Map<String, CuratorlistenerManager> curatorlistenerManagerCache = new ConcurrentHashMap<>();
86+
public static ZkListenerCache zkListenerCache = ZkListenerCache.getInstance();
8887

8988
/**
9089
* current selected zk server
@@ -98,6 +97,9 @@ public class NodeTreeViewController {
9897

9998
public void setPrimaryStage(Stage primary) {
10099
this.primaryStage = primary;
100+
primary.onCloseRequestProperty().addListener((observable, oldValue, newValue) -> {
101+
serverClientCache.closeAll();
102+
});
101103
}
102104

103105
@FXML
@@ -185,10 +187,11 @@ private CuratorFramework doConnect(ZkServer server) {
185187
// TODO @vran use connection listener
186188
client.blockUntilConnected();
187189
} catch (InterruptedException e) {
188-
throw new IllegalStateException(e);
190+
VToast.toastFailure(primaryStage, "Connect zookeeper failed");
191+
LOG.error("", e);
189192
}
190193

191-
Executors.newSingleThreadExecutor().execute(() -> {
194+
Platform.runLater(() -> {
192195
final String value = history.get(server.getServer(), "0");
193196
history.save(server.getServer(), String.valueOf(Integer.parseInt(value) + 1));
194197
history.store();
@@ -201,9 +204,10 @@ void syncTreeNode(String server, CuratorFramework client) {
201204
}
202205

203206
private void startSyncTreeNodeListener(String server, CuratorFramework client) {
204-
CuratorlistenerManager manager = curatorlistenerManagerCache.getOrDefault(server,
205-
new CuratorlistenerManager(client));
206-
manager.start(new TreeCacheListener() {
207+
if (!zkListenerCache.contains(server)) {
208+
zkListenerCache.put(server, new CuratorlistenerManager(client));
209+
}
210+
zkListenerCache.get(server).start(new TreeCacheListener() {
207211

208212
private NodeEventHandler eventHandler = new NodeEventHandler(server);
209213

@@ -245,8 +249,8 @@ private void updateDataAction() {
245249
.inBackground((client, event) -> Platform.runLater(() -> VToast.toastSuccess(primaryStage)))
246250
.forPath(this.pathLabel.getText(), this.dataTextArea.getText().getBytes());
247251
} catch (Exception e) {
248-
VToast.toastFailure(primaryStage);
249-
throw new IllegalStateException(e);
252+
VToast.toastFailure(primaryStage, "update data failed");
253+
LOG.error("update data error", e);
250254
}
251255
}
252256

src/main/java/cc/cc1234/main/manager/CuratorlistenerManager.java

+4
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ public void start(TreeCacheListener listener) {
2424
}
2525
}
2626

27+
public void close() {
28+
treeCache.close();
29+
}
30+
2731
}

0 commit comments

Comments
 (0)