正如在ZooKeeper的文档中所说,有必要使用daemontools等工具来监督它.但是文档没有提供任何示例,我知道启动ZooKeeper的唯一方法是运行bin/zkServer.sh start.我打算用supervisord来完成这项工作,但是如何编写[program:zookeeper]部分已经超出了我的范围.任何例子都会很棒.谢谢.
到目前为止,有两种解决方案:
[program:zookeeper]
command = /usr/lib/jvm/java-1.7.0-openjdk.x86_64/bin/java -Dzookeeper.log.dir="." -Dzookeeper.root.logger="INFO,CONSOLE" -cp "/home/jizhang/Applications/zookeeper/bin/../build/classes:/home/jizhang/Applications/zookeeper/bin/../build/lib/*.jar:/home/jizhang/Applications/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/jizhang/Applications/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/home/jizhang/Applications/zookeeper/bin/../lib/netty-3.2.2.Final.jar:/home/jizhang/Applications/zookeeper/bin/../lib/log4j-1.2.15.jar:/home/jizhang/Applications/zookeeper/bin/../lib/jline-0.9.94.jar:/home/jizhang/Applications/zookeeper/bin/../zookeeper-3.4.3.jar:/home/jizhang/Applications/zookeeper/bin/../src/java/lib/*.jar:/home/jizhang/Applications/zookeeper/bin/../conf:" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain "/home/jizhang/Applications/zookeeper/bin/../conf/zoo.cfg"
stdout_logfile = /home/jizhang/Applications/zookeeper/zookeeper.out
stderr_logfile = /home/jizhang/Applications/zookeeper/zookeeper.err
autorestart = true
我计划在环境变量中存储一些应用程序设置,例如MYSQL_URL = mysql:// ...我使用supervisord来管理应用程序进程.如何在子进程启动之前加载环境变量?特别是当这些设置改变时,我希望重新启动子进程将加载新设置.
另外我想知道在哪里存储这些环境变量.我可以"导出$(cat filename)"的文件?或者一些更好的方法.我很好奇Heroku如何管理它的环境变量.
在类似C/C++的语言中,显式关闭zeromq套接字是必须的,我理解.但是在一些更高级的语言中,例如php和python,它们都有垃圾收集机制,我是否需要显式关闭套接字?
在PHP中,没有ZMQSocket :: close(),在python中,pyzmq的doc说socket.close()可以省略,因为它会在垃圾收集过程中自动关闭.
所以我的问题是,我是否需要手动关闭它?...
我想在Java中实现一个简单的类似DAG的调度程序(无需结果),如下图所示:

我可以简单地使用手动代码来实现这个目的:
ExecutorService executor = Executors.newCachedThreadPool();
Future<?> futureA = executor.submit(new Task("A"));
Future<?> futureC = executor.submit(new Task("C"));
futureA.get();
Future<?> futureB = executor.submit(new Task("B"));
futureB.get();
futureC.get();
Future<?> futureD = executor.submit(new Task("D"));
futureD.get();
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一种更通用的方法,所以我可以像这样使用调度程序:
Container container = new Container();
container.addTask("A", new Task("A"));
container.addTask("B", new Task("B"), "A");
container.addTask("C", new Task("C"));
container.addTask("D", new Task("D"), "B", "C");
container.waitForCompletion();
Run Code Online (Sandbox Code Playgroud)
实际上我已经实现了一个简单的:
但我需要每隔100毫秒迭代一次所有任务,看看哪一个已准备好提交.同样在这个实现中,没有异常检查.
我也检查了Guava lib的ListenableFuture,但我不知道如何正确使用它.
任何关于如何实现DAG或推荐现有开源调度程序的建议都将受到赞赏.
我有一个客户端(PULL)连接到服务器(PUSH)。起初,它们工作得很好。但是稍后连接断开,客户端ZeroMQ不会尝试重新连接到服务器。
一件不可思议的事情是,如果我netstat在客户端和服务器端进行操作,则客户端会显示连接仍已建立,而服务器端没有相应的条目。我想这就是客户端不重新连接的原因。
PS:客户端和服务器在不同的IDC中,并且它们之间存在带宽限制。但是当断开连接发生时,我们的监视器显示它没有达到频带限制。
而且,当我在服务器端执行netstat时(连接正常时),有时Send-Q列很大,然后降为0。
这就是我所拥有的全部信息。如果您需要更多详细信息,请告诉我。
我正在使用ExecutorService,Future和Callable进行并行处理。虽然Callable在调用时可以捕获 的异常Future#get,但如何捕获所有可调用对象抛出的所有异常,然后抛出一个巨大的复合异常,例如:
ExecutorService service = Executors.newFixedThreadPool(5);
List<Future<Void>> futures = new ArrayList<Future<Void>>();
futures.add(service.submit(new TaskA());
futures.add(service.submit(new TaskB());
for (Future<Void> future : futures) {
try {
future.get();
} catch (Exception e) {
// ???
}
}
// throw the big exception here
service.shutdown();
Run Code Online (Sandbox Code Playgroud)