小编Pat*_*ick的帖子

开放流try/finally块的Java代码样式

这是一个代码风格的问题.我注意到很多示例代码,包括Oracle的一些示例,确保以下列方式关闭流:

InputStream in = null;
try {
    in = acquireStream();
    ...
} finally {
    if (in != null) in.close();
}
Run Code Online (Sandbox Code Playgroud)

请注意初始化为null并检查finally块中的null .

我倾向于编写这样的代码:

InputStream in = acquireStream();
try {
    ...
} finally {
    in.close();
}
Run Code Online (Sandbox Code Playgroud)

两种方法都有优点或缺点吗?我喜欢我的风格,因为我不需要空检查.我也想尽可能避免null.但由于Oracle风格在在线示例中非常常见,我想知道我的是否有一些隐藏的错误.

我问同样的问题为InputStream,OutputStream,java.sql.Connection,java.sql.PreparedStatement,等我倾向于获取的外界资源try块,然后关闭它在finally没有空校验.除了文体差异,还有什么我想念的吗?

谢谢.

java coding-style

10
推荐指数
3
解决办法
9800
查看次数

如何隔离我的Jenkins管道Groovy共享库类加载器?

我有一个Groovy库作为全局共享库提供:

package com.example

@Grab(group="org.apache.httpcomponents", module="httpclient", version="[4.5.3,)")
import org.apache.http.HttpHost
import org.apache.http.impl.client.HttpClients

class MyClass implements Serializable {
  static def run() {
    return HttpClients.custom()
    .setProxy(new HttpHost("proxy.example.com", 3128))
    .build()
  }

  static def debug() {
    return ("""
      this: ${this.classLoader.class.toString()} ${this.classLoader.hashCode().toString()}
      HttpHost: ${HttpHost.class.classLoader.class.toString()} ${HttpHost.class.classLoader.hashCode()}
      HttpClients: ${HttpClients.class.classLoader.class.toString()} ${HttpClients.class.classLoader.hashCode()}
    """)
  }
}
Run Code Online (Sandbox Code Playgroud)

以及使用此库的Jenkins脚本管道作业:

@Library('example') _
node {
  echo "${com.example.MyClass.debug()}"
  com.example.MyClass.run()
}
Run Code Online (Sandbox Code Playgroud)

当作业运行时,我得到以下输出debug(),然后是以下错误run():

  this: class org.jenkinsci.plugins.workflow.cps.CpsGroovyShell$CleanGroovyClassLoader 765101363
  HttpHost: class hudson.ClassicPluginStrategy$AntClassLoader2 804623541
  HttpClients: class hudson.ClassicPluginStrategy$AntClassLoader2 1870591909

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.apache.http.impl.client.HttpClientBuilder.setProxy() is applicable for …
Run Code Online (Sandbox Code Playgroud)

groovy classloader jenkins jenkins-pipeline

10
推荐指数
1
解决办法
1130
查看次数

在 Kubernetes 中,如何在空闲时将部署缩放为零

我正在 Kubernetes 集群上运行一个相当资源密集型的服务来支持 CI 活动。只需要一个replica,但是占用资源多(16cpu),而且一般只在工作时间(工作日,大概8am-6pm)才需要。我的集群在云中运行并设置了实例自动缩放,因此如果此服务缩放为零,则可以终止该实例。

该服务是无法修改的第三方代码(好吧,不容易)。这是一个相当典型的 HTTP 服务,但它的工作是相当占用 CPU 的。

有哪些选项可以在空闲时自动将此部署缩减为零?

我宁愿不在工作时间内设置一个时间表来扩大/缩小它,因为偶尔会在正常时间之外执行 CI 活动。我希望缩放是动态的(例如,空闲时间超过 30 分钟时缩放到零,或者在传入连接到达时缩放到 1)。

kubernetes horizontal-pod-autoscaling

10
推荐指数
3
解决办法
7633
查看次数

emacs 窗口可以“部分”专用吗?

我正在使用dedicated.el它非常类似于dedicate-windows-manually.el手动将某些窗口标记为“专用”到它们的缓冲区,并且对于通过打开新缓冲区的各种命令(grep、编译等)进行拆分也难以辨认。

但我真的只想要第二部分。

换句话说,我希望find-file, kill-buffer,switch-buffer等等像当前窗口不是专用的一样工作。但我希望其他命令 ( grep, compile) 遵守专用状态而不是拆分该窗口。

我对此做了一个小小的尝试,但它不能正常工作,而且似乎是一种被误导的方法,可能会遗漏很多案例。

(问题之一是“专用”次要模式在set-window-dedicated-p应用于窗口时与缓冲区相关联;这可以克服,但我仍然觉得必须有更好的方法来完成我想要的......)

(defun with-undedicated (f)
  (interactive)
  (let ((was-dedicated (bound-and-true-p dedicated-mode)))
    (progn
      (if was-dedicated (dedicated-mode))
      (command-execute f)
      (if was-dedicated (dedicated-mode)))))

(defun undedicated-find-file ()
  (interactive)
  (with-undedicated 'ido-find-file))

(defun undedicated-kill-buffer ()
  (interactive)
  (with-undedicated 'ido-kill-buffer))

(defun undedicated-switch-buffer ()
  (interactive)
  (with-undedicated 'ido-switch-buffer))

(global-set-key (kbd "C-x C-f") 'undedicated-find-file)
(global-set-key (kbd "C-x k") 'undedicated-kill-buffer)
(global-set-key (kbd "C-x b") 'undedicated-switch-buffer)
Run Code Online (Sandbox Code Playgroud)

编辑

执行以下操作来测试 Drew …

emacs

5
推荐指数
1
解决办法
421
查看次数

如何在docker中使用bash作为PID1重现僵尸进程?

我有一个在PID1上运行bash的Docker容器,后者又运行一个长期运行(复杂)的服务,有时会在PID1上生成bashie进程,这些进程是bash的父级.这些僵尸似乎从来没有收获过.

我正在尝试在最小容器中重现此问题,以便我可以测试缓解,例如使用正确的init作为PID1而不是bash.

但是,我无法重现僵尸进程.PID1的bash似乎收获了孩子,即使是从另一个过程继承的孩子.

这是我尝试过的:

docker run -d ubuntu:14.04 bash -c \
  'bash -c "start-stop-daemon --background --start --pidfile /tmp/sleep.pid --exec /bin/sleep -- 30; sleep 300"'
Run Code Online (Sandbox Code Playgroud)

我的期望是,start-stop-daemon双重分叉创建一个进程,在PID1的bash,然后exec进入sleep 30,当睡眠退出时,我预计这个过程仍然是一个僵尸.该sleep 300模拟长时间运行的服务.

但是,bash重新开始这个过程,我可以通过运行stracebash进程(从运行docker的主机)来观察:

$ sudo strace -p 2051
strace: Process 2051 attached
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9
wait4(-1,
Run Code Online (Sandbox Code Playgroud)

我正在运行docker 1.11.1-rc1,尽管我对docker 1.9有相同的经验.

$ docker --version
Docker version 1.11.1-rc1, build c90c70c
$ uname -r
4.4.8-boot2docker
Run Code Online (Sandbox Code Playgroud)

鉴于strace显示bash收割(孤儿)的孩子,是否在Docker容器中使用合适的PID1?还有什么可能导致我在更复杂的容器中看到的僵尸?我怎样才能重现?

编辑:

我设法在strace显示问题的一个活动容器上附加一个bash PID1.

Process 20381 attached …
Run Code Online (Sandbox Code Playgroud)

unix bash zombie-process docker

5
推荐指数
1
解决办法
563
查看次数

使用Java web-app(web.xml)部署数据库配置(用户名/密码)的最佳做法是什么?

我有一个使用标准web.xml和servlet的Java Web应用程序.目前,我正在使用<context-param>web.xml中的标签来定义数据库配置(JDBC URL,用户名,密码等).这些由servlet在其init()方法中获取.

但我想不在我的源存储库中包含数据库用户名/密码.

为了测试,我使用的是jetty-maven-plugin.有了它,我指定一个overrideDescriptor带有补充web.xml 的选项,该选项在主web.xml之后应用.我将测试数据库配置放在这个补充文件中,一切都很好.

对于部署,我的主机使用Tomcat.我不知道如何在这里应用数据库配置.是否有类似的方法来指定补充web.xml文件?如果没有,这样做的最佳做法是什么?从作为资源包含的单独属性文件(或类似文件)中读取配置?

java tomcat servlets jetty jdbc

2
推荐指数
1
解决办法
2115
查看次数