diff --git a/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/WSocketEventBusClient.java b/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/WSocketEventBusClient.java index e2516e7cf6..fe7705bf2e 100644 --- a/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/WSocketEventBusClient.java +++ b/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/notification/WSocketEventBusClient.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.che.api.core.notification; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.commons.lang.Pair; import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -108,6 +109,9 @@ public final class WSocketEventBusClient { } if (!cfg.isEmpty()) { executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("WSocketEventBusClient-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler + .getInstance()) .setDaemon(true).build()); for (Map.Entry> entry : cfg.entrySet()) { executor.execute(new ConnectTask(entry.getKey(), entry.getValue())); diff --git a/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileCleaner.java b/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileCleaner.java index 25714b19ff..7d52c2b981 100644 --- a/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileCleaner.java +++ b/core/che-core-api-core/src/main/java/org/eclipse/che/api/core/util/FileCleaner.java @@ -15,6 +15,7 @@ import com.google.inject.AbstractModule; import org.eclipse.che.commons.lang.IoUtil; import org.eclipse.che.commons.lang.Pair; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,6 +44,9 @@ public class FileCleaner { private static ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder() .setNameFormat("FileCleaner") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler + .getInstance()) .setDaemon(true).build()); static { diff --git a/core/che-core-api-core/src/main/java/org/eclipse/che/everrest/ServerContainerInitializeListener.java b/core/che-core-api-core/src/main/java/org/eclipse/che/everrest/ServerContainerInitializeListener.java index 12e224c3ff..3c9d169318 100644 --- a/core/che-core-api-core/src/main/java/org/eclipse/che/everrest/ServerContainerInitializeListener.java +++ b/core/che-core-api-core/src/main/java/org/eclipse/che/everrest/ServerContainerInitializeListener.java @@ -13,6 +13,7 @@ package org.eclipse.che.everrest; import com.google.common.base.MoreObjects; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.commons.env.EnvironmentContext; import org.eclipse.che.commons.subject.Subject; import org.everrest.core.DependencySupplier; @@ -174,7 +175,11 @@ public class ServerContainerInitializeListener implements ServletContextListener final EverrestConfiguration everrestConfiguration = getEverrestConfiguration(servletContext); final String threadNameFormat = "everrest.WSConnection." + servletContext.getServletContextName() + "-%d"; return Executors.newFixedThreadPool(everrestConfiguration.getAsynchronousPoolSize(), - new ThreadFactoryBuilder().setNameFormat(threadNameFormat).setDaemon(true).build()); + new ThreadFactoryBuilder().setNameFormat(threadNameFormat) + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) + .setDaemon(true) + .build()); } protected SecurityContext createSecurityContext(final HandshakeRequest req) { diff --git a/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/LoggingUncaughtExceptionHandler.java b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/LoggingUncaughtExceptionHandler.java new file mode 100644 index 0000000000..5cd3a3be30 --- /dev/null +++ b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/LoggingUncaughtExceptionHandler.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2012-2016 Codenvy, S.A. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.commons.lang.concurrent; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Writes uncaught exceptions in threads being run by {@link java.util.concurrent.ExecutorService} into application log. + * + * @author Max Shaposhnik + */ +public class LoggingUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { + + private static final Logger LOG = LoggerFactory.getLogger(LoggingUncaughtExceptionHandler.class); + + private static final LoggingUncaughtExceptionHandler INSTANCE = new LoggingUncaughtExceptionHandler(); + + @Override + public void uncaughtException(Thread t, Throwable e) { + LOG.error(String.format("Runtime exception caught in thread %s. Message: %s", t.getName(), e.getLocalizedMessage()), e); + } + + public static LoggingUncaughtExceptionHandler getInstance() { + return INSTANCE; + } + + private LoggingUncaughtExceptionHandler() { + } + +} diff --git a/core/commons/che-core-commons-schedule/pom.xml b/core/commons/che-core-commons-schedule/pom.xml index dda748fbd3..28f55dfa37 100644 --- a/core/commons/che-core-commons-schedule/pom.xml +++ b/core/commons/che-core-commons-schedule/pom.xml @@ -45,6 +45,10 @@ org.eclipse.che.core che-core-commons-inject + + org.eclipse.che.core + che-core-commons-lang + org.slf4j slf4j-api diff --git a/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java b/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java index 7c268c3fec..3019559f70 100644 --- a/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java +++ b/core/commons/che-core-commons-schedule/src/main/java/org/eclipse/che/commons/schedule/executor/ThreadPullLauncher.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.che.commons.schedule.executor; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.commons.schedule.Launcher; import org.eclipse.che.inject.ConfigurationException; @@ -44,7 +45,10 @@ public class ThreadPullLauncher implements Launcher { @Inject public ThreadPullLauncher(@Named("schedule.core_pool_size") Integer corePoolSize) { this.service = new CronThreadPoolExecutor(corePoolSize, - new ThreadFactoryBuilder().setNameFormat("Annotated-scheduler-%d").setDaemon(false) + new ThreadFactoryBuilder().setNameFormat("Annotated-scheduler-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) + .setDaemon(false) .build()); } diff --git a/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/CgroupOOMDetector.java b/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/CgroupOOMDetector.java index aed58d967f..3c10325ea8 100644 --- a/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/CgroupOOMDetector.java +++ b/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/CgroupOOMDetector.java @@ -13,6 +13,7 @@ package org.eclipse.che.plugin.docker.client; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.sun.jna.ptr.LongByReference; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.core.util.SystemInfo; import org.eclipse.che.commons.lang.Size; import org.slf4j.Logger; @@ -55,6 +56,8 @@ public class CgroupOOMDetector implements DockerOOMDetector { this.dockerConnector = dockerConnector; this.oomDetectors = new ConcurrentHashMap<>(); this.executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("CgroupOOMDetector-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); } diff --git a/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/DockerConnector.java b/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/DockerConnector.java index 6ac395f279..140c582c44 100644 --- a/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/DockerConnector.java +++ b/plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/DockerConnector.java @@ -19,6 +19,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import org.eclipse.che.api.core.util.FileCleaner; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.commons.lang.TarUtils; import org.eclipse.che.commons.lang.ws.rs.ExtMediaType; @@ -147,6 +148,8 @@ public class DockerConnector { this.authResolver = authResolver; this.apiVersionPathPrefix = dockerApiVersionPathPrefixProvider.get(); executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder() + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setNameFormat("DockerApiConnector-%d") .setDaemon(true) .build()); diff --git a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/DockerInstanceStopDetector.java b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/DockerInstanceStopDetector.java index 999f933e4a..413784c023 100644 --- a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/DockerInstanceStopDetector.java +++ b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/DockerInstanceStopDetector.java @@ -15,6 +15,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.eclipse.che.api.core.notification.EventService; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.machine.server.event.InstanceStateEvent; import org.eclipse.che.commons.lang.Pair; import org.eclipse.che.plugin.docker.client.DockerConnector; @@ -74,6 +75,8 @@ public class DockerInstanceStopDetector { .build(); this.executorService = Executors.newSingleThreadExecutor( new ThreadFactoryBuilder().setNameFormat("DockerInstanceStopDetector-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); } diff --git a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/MachineProviderImpl.java b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/MachineProviderImpl.java index b9461e9a3b..03cf3e53d5 100644 --- a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/MachineProviderImpl.java +++ b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/MachineProviderImpl.java @@ -21,6 +21,7 @@ import org.eclipse.che.api.core.model.machine.MachineStatus; import org.eclipse.che.api.core.model.machine.ServerConf; import org.eclipse.che.api.core.util.FileCleaner; import org.eclipse.che.api.core.util.LineConsumer; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.core.util.SystemInfo; import org.eclipse.che.api.environment.server.MachineInstanceProvider; import org.eclipse.che.api.environment.server.model.CheServiceImpl; @@ -235,6 +236,8 @@ public class MachineProviderImpl implements MachineInstanceProvider { // TODO single point of failure in case of highly loaded system executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("MachineLogsStreamer-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); } diff --git a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/cleaner/RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber.java b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/cleaner/RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber.java index 137385bed2..aa8f03c5a1 100644 --- a/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/cleaner/RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber.java +++ b/plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/cleaner/RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber.java @@ -18,6 +18,7 @@ import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.workspace.Workspace; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.notification.EventSubscriber; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.workspace.server.WorkspaceFilesCleaner; import org.eclipse.che.api.workspace.server.event.WorkspaceRemovedEvent; import org.eclipse.che.commons.lang.concurrent.ThreadLocalPropagateContext; @@ -49,6 +50,8 @@ public class RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber implements this.workspaceFilesCleaner = workspaceFilesCleaner; this.eventService = eventService; executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("RemoveWorkspaceFilesAfterRemoveWorkspaceEventSubscriber-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); } diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/BufferOutputFixedRateSender.java b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/BufferOutputFixedRateSender.java index 357650411e..a7e4b44d70 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/BufferOutputFixedRateSender.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/BufferOutputFixedRateSender.java @@ -13,6 +13,7 @@ package org.eclipse.che.plugin.maven.server.core; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.eclipse.che.api.core.util.ListLineConsumer; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.everrest.websockets.WSConnectionContext; import org.everrest.websockets.message.ChannelBroadcastMessage; import org.slf4j.Logger; @@ -40,6 +41,7 @@ public class BufferOutputFixedRateSender extends ListLineConsumer { public BufferOutputFixedRateSender(String channel, long delay) { this.channel = channel; ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(BufferOutputFixedRateSender.class.getSimpleName() + "-%d") + .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build(); diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenExecutorService.java b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenExecutorService.java index d83bfd72b5..0f157218dc 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenExecutorService.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/core/MavenExecutorService.java @@ -13,6 +13,7 @@ package org.eclipse.che.plugin.maven.server.core; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.Singleton; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +34,9 @@ public class MavenExecutorService { private final ExecutorService service; public MavenExecutorService() { - ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Maven Executor - %d").build(); + ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Maven Executor - %d") + .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance()) + .build(); service = Executors.newFixedThreadPool(1, threadFactory); } diff --git a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-server/src/main/java/org/eclipse/che/plugin/nodejsdbg/server/NodeJsDebugProcess.java b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-server/src/main/java/org/eclipse/che/plugin/nodejsdbg/server/NodeJsDebugProcess.java index 7e6e56a267..22c6812b19 100644 --- a/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-server/src/main/java/org/eclipse/che/plugin/nodejsdbg/server/NodeJsDebugProcess.java +++ b/plugins/plugin-nodejs-debugger/che-plugin-nodejs-debugger-server/src/main/java/org/eclipse/che/plugin/nodejsdbg/server/NodeJsDebugProcess.java @@ -12,6 +12,7 @@ package org.eclipse.che.plugin.nodejsdbg.server; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.commons.lang.IoUtil; import org.eclipse.che.plugin.nodejsdbg.server.exception.NodeJsDebuggerException; import org.eclipse.che.plugin.nodejsdbg.server.exception.NodeJsDebuggerTerminatedException; @@ -70,6 +71,8 @@ public class NodeJsDebugProcess implements NodeJsProcessObservable { processWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); executor = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("nodejs-debugger-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); executor.scheduleWithFixedDelay(new OutputReader(), 0, 100, TimeUnit.MILLISECONDS); diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectManager.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectManager.java index 3e6925e305..66495bedbd 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectManager.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectManager.java @@ -22,6 +22,7 @@ import org.eclipse.che.api.core.model.project.SourceStorage; import org.eclipse.che.api.core.model.project.type.ProjectType; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.util.LineConsumerFactory; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.project.server.handlers.CreateProjectHandler; import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; import org.eclipse.che.api.project.server.importer.ProjectImportOutputWSLineConsumer; @@ -106,6 +107,8 @@ public final class ProjectManager { executor = Executors.newFixedThreadPool(1 + Runtime.getRuntime().availableProcessors(), new ThreadFactoryBuilder().setNameFormat("ProjectService-IndexingThread-") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true).build()); } diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/importer/ProjectImportOutputWSLineConsumer.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/importer/ProjectImportOutputWSLineConsumer.java index 4277e4eb41..e804e07168 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/importer/ProjectImportOutputWSLineConsumer.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/importer/ProjectImportOutputWSLineConsumer.java @@ -13,6 +13,7 @@ package org.eclipse.che.api.project.server.importer; import org.eclipse.che.api.core.util.LineConsumer; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.everrest.core.impl.provider.json.JsonUtils; import org.everrest.websockets.WSConnectionContext; import org.everrest.websockets.message.ChannelBroadcastMessage; @@ -44,7 +45,10 @@ public class ProjectImportOutputWSLineConsumer implements LineConsumer { this.workspaceId = workspaceId; lineToSendQueue = new ArrayBlockingQueue<>(1024); executor = Executors.newSingleThreadScheduledExecutor( - new ThreadFactoryBuilder().setNameFormat(ProjectImportOutputWSLineConsumer.class.getSimpleName()+"-%d").setDaemon(true).build()); + new ThreadFactoryBuilder().setNameFormat(ProjectImportOutputWSLineConsumer.class.getSimpleName() + "-%d") + .setDaemon(true) + .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance()) + .build()); executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/FileTreeWatcher.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/FileTreeWatcher.java index 9f7e995833..77e166abc7 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/FileTreeWatcher.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/FileTreeWatcher.java @@ -12,6 +12,7 @@ package org.eclipse.che.api.vfs.impl.file; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.project.shared.dto.event.FileWatcherEventType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +86,11 @@ public class FileTreeWatcher { this.excludePatterns = newArrayList(excludePatterns); this.fileWatcherNotificationHandler = fileWatcherNotificationHandler; - ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("FileTreeWatcher-%d").build(); + ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true) + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) + .setNameFormat("FileTreeWatcher-%d") + .build(); executor = Executors.newSingleThreadExecutor(threadFactory); running = new AtomicBoolean(); watchedDirectories = newHashMap(); diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/event/VfsEventService.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/event/VfsEventService.java index f0d66615b9..1756e7adba 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/event/VfsEventService.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/impl/file/event/VfsEventService.java @@ -13,6 +13,7 @@ package org.eclipse.che.api.vfs.impl.file.event; import com.google.common.annotations.Beta; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.slf4j.Logger; import javax.annotation.PostConstruct; @@ -41,6 +42,8 @@ abstract class VfsEventService { VfsEventService() { final String threadName = getClass().getSimpleName().concat("Thread-%d"); final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(threadName) + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(TRUE) .build(); diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/search/impl/AbstractLuceneSearcherProvider.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/search/impl/AbstractLuceneSearcherProvider.java index be1be9a5e1..937a89f6cb 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/search/impl/AbstractLuceneSearcherProvider.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/vfs/search/impl/AbstractLuceneSearcherProvider.java @@ -13,6 +13,7 @@ package org.eclipse.che.api.vfs.search.impl; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.eclipse.che.api.core.ServerException; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.vfs.VirtualFileFilter; import org.eclipse.che.api.vfs.VirtualFileFilters; import org.eclipse.che.api.vfs.VirtualFileSystem; @@ -42,6 +43,8 @@ public abstract class AbstractLuceneSearcherProvider implements SearcherProvider this.excludeFileIndexFilters = mergeFileIndexFilters(excludeFileIndexFilters); executor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setDaemon(true) + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setNameFormat("LuceneSearcherInitThread") .build()); } diff --git a/wsmaster/che-core-api-agent/src/main/java/org/eclipse/che/api/agent/server/launcher/AbstractAgentLauncher.java b/wsmaster/che-core-api-agent/src/main/java/org/eclipse/che/api/agent/server/launcher/AbstractAgentLauncher.java index 37140cd99b..e3429025a9 100644 --- a/wsmaster/che-core-api-agent/src/main/java/org/eclipse/che/api/agent/server/launcher/AbstractAgentLauncher.java +++ b/wsmaster/che-core-api-agent/src/main/java/org/eclipse/che/api/agent/server/launcher/AbstractAgentLauncher.java @@ -18,6 +18,7 @@ import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.machine.Command; import org.eclipse.che.api.core.util.AbstractLineConsumer; import org.eclipse.che.api.core.util.LineConsumer; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.machine.server.exception.MachineException; import org.eclipse.che.api.machine.server.model.impl.CommandImpl; import org.eclipse.che.api.machine.server.spi.Instance; @@ -47,6 +48,8 @@ public abstract class AbstractAgentLauncher implements AgentLauncher { private static final Logger LOG = LoggerFactory.getLogger(AbstractAgentLauncher.class); private static final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("AgentLauncher-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/environment/server/MachineProcessManager.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/environment/server/MachineProcessManager.java index 3acf4659db..b447b667cd 100644 --- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/environment/server/MachineProcessManager.java +++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/environment/server/MachineProcessManager.java @@ -22,6 +22,7 @@ import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.util.CompositeLineConsumer; import org.eclipse.che.api.core.util.FileLineConsumer; import org.eclipse.che.api.core.util.LineConsumer; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.core.util.WebsocketLineConsumer; import org.eclipse.che.api.machine.server.exception.MachineException; import org.eclipse.che.api.machine.server.spi.Instance; @@ -75,6 +76,8 @@ public class MachineProcessManager { this.environmentEngine = environmentEngine; executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("MachineProcessManager-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(false) .build()); } diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceManager.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceManager.java index 3c7cccdd00..7651f76361 100644 --- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceManager.java +++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceManager.java @@ -26,6 +26,7 @@ import org.eclipse.che.api.core.model.workspace.Workspace; import org.eclipse.che.api.core.model.workspace.WorkspaceConfig; import org.eclipse.che.api.core.model.workspace.WorkspaceStatus; import org.eclipse.che.api.core.notification.EventService; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.environment.server.exception.EnvironmentException; import org.eclipse.che.api.machine.server.exception.SnapshotException; import org.eclipse.che.api.machine.server.exception.SourceNotFoundException; @@ -122,6 +123,8 @@ public class WorkspaceManager { this.snapshotDao = snapshotDao; executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("WorkspaceManager-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(true) .build()); } diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceRuntimes.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceRuntimes.java index 259ca9ac5c..70596332cd 100644 --- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceRuntimes.java +++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceRuntimes.java @@ -34,6 +34,7 @@ import org.eclipse.che.api.core.model.workspace.WorkspaceRuntime; import org.eclipse.che.api.core.model.workspace.WorkspaceStatus; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.util.AbstractMessageConsumer; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; import org.eclipse.che.api.core.util.MessageConsumer; import org.eclipse.che.api.core.util.WebsocketMessageConsumer; import org.eclipse.che.api.environment.server.CheEnvironmentEngine; @@ -126,6 +127,8 @@ public class WorkspaceRuntimes { this.stripedLocks = new StripedLocks(16); executor = Executors.newFixedThreadPool(2 * Runtime.getRuntime().availableProcessors(), new ThreadFactoryBuilder().setNameFormat("WorkspaceRuntimes-%d") + .setUncaughtExceptionHandler( + LoggingUncaughtExceptionHandler.getInstance()) .setDaemon(false) .build()); }