首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我必须通过访问服务器url来验证jvm的可用性。

我必须通过访问服务器url来验证jvm的可用性。
EN

Stack Overflow用户
提问于 2016-09-17 17:17:36
回答 1查看 55关注 0票数 0

我正在进行一次单击就可以自动访问多个服务器urls (现在这些urls是手动的),作为响应,我将为每个响应获得一个登录页面,这意味着jvm已经启动并运行。

问题是jvm可能需要最多5分钟的响应时间,并且有多达10个urls,因此检查响应代码的总时间最多需要50分钟(最糟糕的情况是,所有jvm都关闭)。

所以,我必须做两件事--我们将要点击的服务器urls,在一次点击中应该同步发生(这将使整个响应时间从50分钟大幅度降低到5-6分钟)。我用过PoolingHttpClientConnectionManager方法-

代码语言:javascript
复制
`PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
            CloseableHttpClient httpClient = HttpClients.custom()
            .setConnectionManager(cm)
            .build();


            static int statusCode;

        // Here the servers string array have URLs defined in JSP Page -
<!-- <form name="input" action="welcome"  method="get">
            <input type="checkbox" name="server" value="http://hc.apache.org/" checked>Apache HC Home Page<br>
            <input type="checkbox"  name="server" value="http://hc.apache.org/httpcomponents-core-ga/" checked>HttpCore<br>
            <input type="checkbox"  name="server" value="https://gmail.com" checked>Gmail<br>  -->
       // create a thread for each URI
        public void synchronizeUrls(String[] servers) throws InterruptedException
        {
        GetThread[] threads = new GetThread[servers.length];
        for (int i = 0; i < threads.length; i++) {
            HttpGet httpget = new HttpGet(servers[i]);
            threads[i] = new GetThread(httpClient, httpget);
        }


        // start the threads
        for (int j = 0; j < threads.length; j++) {
            threads[j].start();
        }

        // join the threads
        for (int j = 0; j < threads.length; j++) {
            threads[j].join();
        }
        }




        static class GetThread extends Thread {

            private final CloseableHttpClient httpClient;
            private final HttpContext context;
            private final HttpGet httpget;

            public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
                this.httpClient = httpClient;
                this.context = HttpClientContext.create();
                this.httpget = httpget;
            }

            @Override
            public void run() {
                try {
                    CloseableHttpResponse response = httpClient.execute(
                            httpget, context);

                    final HttpClientConnectionManager connMgr = null;
                    try {
                    //    HttpEntity entity = response.getEntity();
                        statusCode = response.getStatusLine().getStatusCode();
                        System.out.println(statusCode);

                    }
                }   // Handle protocol errors
                    catch (ClientProtocolException ex) {
                    System.out.println(ex.getMessage());

                } catch (IOException ex) {
                    // Handle I/O errors
                    System.out.println(ex.getMessage());
                } 
            }`

另一件事是,如果我们没有在5分钟的时间间隔内从任何url获得响应,我们就会把这种情况当作jvm关闭。我不知道如何执行我的第二套要求,如果有人能帮助我,那将是很有帮助的。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-17 19:36:43

做这件事有多种方法。我这样做的方式如下。

你想做的是:

  1. 并行运行线程并捕获每个线程的结果。
  2. 5分钟后,检查它们是否还在运行。仍在运行的指示对应的jvm已关闭。

对于步骤1,将statusCode添加到GetThread。您已经在run()中设置了run()

代码语言:javascript
复制
private StatusCode statusCode;
public StatusCode getStatusCode() {
    return statusCode;
}

对于步骤2,在启动线程块之后添加以下代码:

代码语言:javascript
复制
new java.util.Timer().schedule( 
    new java.util.TimerTask() {
        @Override
        public void run() {
            for (int j = 0; j < threads.length; j++) {
                if(threads[j].getStatusCode().equals(OK)) {
                    //threads[j]'s jvm is up
                } else {
                    //threads[j]'s jvm is down
                }
            }
        }
    }, 
    5 * 60 * 1000
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39549656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档