避免一遍又一遍地调用相同的函数

时间:2018-02-08 12:06:19

标签: java

我有一个与docker建立连接的函数。你真的不需要了解太多,但我想要的是确保IP和端口始终与我的应用程序相同(Settings.getSettings())

 public static DockerClient dockerClient() {

    try {

        Settings settings = Settings.getSettings();
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("tcp://" + settings.getDockerIP() + ":" + settings.getDockerPort())
                .withDockerConfig("/home/user/.docker/config.json")
                .build();

        DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory()
                .withMaxTotalConnections(200)
                .withMaxPerRouteConnections(200);

        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
                .withDockerCmdExecFactory(dockerCmdExecFactory)
                .build();

        return dockerClient;

    } catch (Exception e) {
        System.out.println("Error: " + e);
    }
    return null;
}

每次我想做某事我都会调用这个功能。例如:

public static void startContainer(String containerName) {
    DockerClient dockerClient = dockerClient();
 ....
  public static List<Image> getImages() {
    List<Image> images = new ArrayList<>(dockerClient().listImagesCmd().withShowAll(true).exec());
 ....

有没有更有效的方法来处理这个问题?我只是想确保当我执行某个命令时,会建立与正确的ip和端口的连接。

2 个答案:

答案 0 :(得分:0)

每次可能不需要构建configdockerCmdExecFactory。作为解决方案,您可以创建两个字段而不是局部变量。但要小心:你必须考虑多线程,可以有多少个实例,并确保在调用dockerClient()之前始终初始化字段。可能这不是你的问题,但你必须检查它。

如果您使用Spring或类似的东西,您可能想要创建封装所有这些内容的bean。

您应用程序中的某些框架也可能已经实现了连接逻辑。由于内部框架中有很多优化的东西你无法实现,因此更为可取。以连接/套接字池和异常处理为例。尝试google'泊坞客户端你的框架名称'

答案 1 :(得分:0)

根据我的评论,您可以创建一个包含docker客户端状态的服务,并检查它是否发生更改以便重新加载:

class DockerClientService {
    private DockerClient dockerClient;
    private String ip;
    private int port;

    DockerClient getClient() {
        Settings settings = Settings.getSettings();
        if (settings.getDockerPort() != port || !settings.getDockerIP().equals(ip)) {
            port = settings.getDockerPort();
            ip = settings.getDockerIP();
            DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("tcp://" + ip + ":" + port)
                .withDockerConfig("/home/user/.docker/config.json")
                .build();

            DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory()
                .withMaxTotalConnections(200)
                .withMaxPerRouteConnections(200);

            dockerClient = DockerClientBuilder.getInstance(config)
                .withDockerCmdExecFactory(dockerCmdExecFactory)
                .build();
        }
        return dockerClient;
    }
}
相关问题