关于匿名课和最终字段的解释我仍然不满意.有很多问题试图解释明显的问题,但我没有找到所有问题的答案:-)
假设以下代码:
public void method(final int i, int j) {
final int z = 6;
final int x = j;
int k = 5;
new Runnable() {
public void run() {
System.out.print(i);
System.out.print(x);
System.out.print(z);
System.out.print(k);
}
};
}
Run Code Online (Sandbox Code Playgroud)
k属性,无法编译此代码.z在编译期间用声明的值替换属性.当我搜索解决方案时,究竟是如何工作的i,x我发现这个答案说:
然后,编译器可以将匿名类中的lastPrice和price的使用替换为常量的值(在编译时,当然),并且您将不再有访问不存在的变量的问题
它如何适用于字段i,x如果它们是方法的参数?在编译期间不知道它们?这种方法可以发挥作用z.
另一方面,有关于堆栈问题的解释:
这允许Java编译器在运行时"捕获"变量的值,并将副本存储为内部类中的字段.一旦外部方法终止并且其堆栈框架已被移除,原始变量就会消失,但内部类的私有副本仍然存在于类的自身内存中
我会理解匿名类在创建过程中以某种方式复制了所有必需的内容(字段).缺失final有明显的问题,如果匿名类声明下面的某些代码会改变值,则执行使用可能的stale值.
但是,这可以解决当匿名类'方法在使用的属性范围之外执行时的问题.
但这种方法即使没有final声明也应该有效,因为它只是复制所有字段.
这两种方法对我来说都是独立的.说到哪 - 它可以解决我的问题 - …
我想以编程方式设置zookeeper集群.我的目标是使用具有CoreOS的计算机,并以docker容器的形式动态部署三个节点,并将它们设置为一个动物园集群.
除了手动(/ zookeeperReconfig.html)中的常见设置(显示如何将另一个节点添加到现有的三个节点集群)之外,我发现了一个对话,该对话说明当我在现有集群中没有正在运行的节点时从头开始如何做到这一点.不幸的是,这套步骤对我不起作用.我在谈论http://mail-archives.apache.org/mod_mbox/zookeeper-user/201408.mbox/%3CCAPSuxQipZFH2582bEMid2tCVBFk%3DC31hwCYjbFgSwChBF%2BZQVQ%40mail.gmail.com%3E
以下是我执行的步骤列表:
server.1 =本地主机:2381:2281:参与者; 0.0.0.0:2181
server.1 = localhost:2381:2281:participant; 0.0.0.0:2181 server.2 = localhost:2382:2282:observer; 0.0.0.0:2182
请注意,当我将第二个节点的"观察者"更改为"参与者"时,结果行为没有区别.
reconfig -add server.2 = localhost:2382:2282:participant; 0.0.0.0:2182
......它失败了:
KeeperErrorCode = NewConfigNoQuorum for
然而,经过一些研究,我找到了解决方案 但这很棘手,我不认为这是唯一正确的解决方案.
什么对我有用?我可以再次在第一个节点上执行步骤#3,但现在使用"观察者".此命令导致第一个节点甚至知道第二个节点.当我在zkCli中键入'config'到控制台时,似乎它正在工作.下一步是使用zkCli和exec命令登录到第二个节点:
reconfig -remove 2 < - 下一步无法正常工作
reconfig -add server.2 = localhost:2382:2282:participant; 0.0.0.0:2182
好吧,现在我有两个节点的工作集群.最后,有趣的是,现在我可以使用我在第一段中提到的常规场景添加第三个节点.
有人知道我做错了什么吗?
我需要让容器在kubectl终止后5分钟内运行。它需要做一些工作才能销毁。看来kubernetes完全包含我需要的东西:
terminationGracePeriodSeconds: 300
Run Code Online (Sandbox Code Playgroud)
所以我在yaml中定义了它。我已经更新了运行状态RCs,删除了当前的Pod,因此创建了新的Pod,现在我可以通过看到Pod恰好包含此设置get pod xyz -o=yaml。
不幸的是,当我尝试这样做时rolling-update,原来的吊舱在1分钟(而不是5分钟)后就被杀死了。我确实对目标计算机执行了ssh操作,然后可以看到Docker在该时间之后终止了该容器。
我试图做一些调查功能如何工作。我终于找到了kubectl delete关于宽限期终止的概念的文档:
http://kubernetes.io/docs/user-guide/pods/
默认情况下,所有删除都会在30秒内正常进行。kubectl delete命令支持--grace-period =选项,该选项允许用户覆盖默认值并指定自己的值。值0表示删除应该立即进行,并立即删除API中的容器,以便可以创建具有相同名称的新容器。在节点上设置为立即终止的Pod仍将被给予短暂的宽限期,然后被强制杀死
因此,我拿了一个pod nginx,并尝试用删除它grace-period=30。原来,原来的Pod已被立即删除,并get pods表明新的Pod 正在启动。
所以没有30秒。我究竟做错了什么?似乎所有pod kubernetes都没有考虑这些值。请注意,我正在使用kubernetes v1.2.2
我还发现了这个问题https://github.com/kubernetes/kubernetes/issues/24695,那里的记者遇到了同样的问题,他以同样的方式解决了。因此,对于berbernetes而言,例如300秒并不是太多。