2016-05-20 10 views
0

私はTomcat 8.xをSpring MVCベースのWebサイトに使用しています。ウェブサイトには、次のようにElasticsearchを呼び出します。ここではTomcatのElasticsearchスレッドを停止できませんでした

private static Client client; 

は、私は一度だけクライアントオブジェクトを作成する方法である:ここでは

public static Client getClient() { 
    if (client == null) {   
     Settings settings = Settings.settingsBuilder() 
       .put("cluster.name", "my_cluster") 
       .build(); 

     try { 
      TransportAddress[] transportAddress = new TransportAddress[1]; 
      for (int k=0; k<adds.length; k++) { 
       transportAddress[0] = new InetSocketTransportAddress(InetAddress.getByName('127.0.0.1'), 9300); 
      } 
      client = TransportClient.builder().settings(settings) 
        .addPlugin(DeleteByQueryPlugin.class) 
        .build() 
        .addTransportAddresses(transportAddress); 

     } catch (UnknownHostException e) { 
      logger.error("Failed to get ES client");; 
     }   
    }  

    return client; 
} 

は私がElasticsearchにアクセスするためのクライアントを使用する方法である:

public SearchResponse searchForMyPage(Long owerId, HttpServletRequest request, Account visitor, CampaignResultType type) { 

    String query = 'this is my query string'; 

    if (client == null) { 
     client = getClient(); 
    } 

    SearchResponse sr = client.prepareSearch('MyIndex') 
      .setTypes('MyDoc')) 
      .setQuery(query) 
      .setHighlighterNumOfFragments(1) 
      .setSize(10).execute().actionGet();   
    return sr; 
} 

しかし、私は多くのElasticsearch関連の例外をTomcatログに記録しています。以下のような何か:

19-May-2016 00:52:13.483 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[Volpan][transport_client_worker][T#9]{New I/O worker #9}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 

What is the correct way of using Elasticsearch in a Java web app? 

Thanks and regards 

**UPDATE 1** 

The following is the logs of Tomcat, show many Elasticsearch related errors, from the moment of Tomcat start to its shutdown. 

20-May-2016 21:43:11.219 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][[timer]]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
java.lang.Thread.sleep(Native Method) 
org.elasticsearch.threadpool.ThreadPool$EstimatedTimeThread.run(ThreadPool.java:703) 
20-May-2016 21:43:11.219 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][scheduler][T#1]] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) 
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
20-May-2016 21:43:11.220 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][transport_client_worker][T#1]{New I/O worker #1}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278) 
sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159) 
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) 
sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) 
org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:434) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:212) 
org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 
org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
20-May-2016 21:43:11.221 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][transport_client_worker][T#2]{New I/O worker #2}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278) 
sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159) 
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) 
sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) 
org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:434) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:212) 
org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 
org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
20-May-2016 21:43:11.221 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][transport_client_worker][T#3]{New I/O worker #3}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278) 
sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159) 
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) 
sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) 
org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:434) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:212) 
org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 
org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
20-May-2016 21:43:11.222 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][transport_client_worker][T#4]{New I/O worker #4}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296) 
sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278) 
sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159) 
sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) 
sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) 
org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:434) 
org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:212) 
org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) 
org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) 
org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 
20-May-2016 21:43:11.223 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [elasticsearch[War Machine][transport_client_worker][T#5]{New I/O worker #5}] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 
sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 

答えて

0

あなたはあなたのアプリケーションのシャットダウン時client.close()を呼び出す必要があります。どのようにするかは、Java Webアプリケーションの仕様に依存します。例えば

Servlet 3.0 specために適用(this stackoverflow answerからコピーしたコード)、:

@WebListener 
public class BackgroundJobManager implements ServletContextListener { 

    private ScheduledExecutorService scheduler; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     scheduler = Executors.newSingleThreadScheduledExecutor(); 
     scheduler.scheduleAtFixedRate(new YourParsingJob(), 0, 5, TimeUnit.HOUR); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     scheduler.shutdownNow(); 
    } 

} 

やSpringと、クラスであなたは、クライアントを作成@PreDestroyアノテーション付きメソッドを定義し、そこclient.close()を呼び出す:

@PreDestroy 
public void destroy() { 
    client.close(); 
} 
+0

Andrei、私を助けてくれてありがとう! 「アプリケーションがシャットダウンしたとき」とは、スレッド/ Webリクエストが終了したときにシャットダウンすることです。クライアントの取得は高価な操作なので、再利用のため静的にしました。 'client.close'は、新しいクライアントを再作成する必要があるたびに意味しますか?ご存知のように、これはWebアプリケーションです。 – curious1

+0

いいえ、Tomcatをシャットダウンすると、そのメッセージはTomcatの起動/停止を参照するためです。 –

+0

Andrei、私はTomcatのシャットダウンや起動の瞬間ではなく、これらのメッセージのトンを見ました。それは、Elasticsearchへの呼び出しごとにそのようなメッセージがスローされたようです。ありがとう! – curious1

関連する問題