我试图在Tomcat 9中删除一些应用程序(4个春季启动Web应用程序),我注意到其中有2个让Tomcat登录显示:
17-Nov-2016 00:15:07.110 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /Users/viruskimera/apache-tomcat-9.0.0.M11/webapps/ftpoutbound990-0.0.1-SNAPSHOT.war
它保持这种方式只是部署它并没有显示部署完成。 问题是App即使在它完全没有完全部署的情况下也能工作。 (我看到我的log4j条目和文件在受监视的文件夹中处理)
这些应用程序使用Java watchService监视2个不同的文件夹,其代码如下:
package com.ftpoutbound990.monitor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.ClosedWatchServiceException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ftpoutbound990.client.FtpoutboundApp;
@Component
public class MonitorDirectory {
final static Logger logger = Logger.getLogger(MonitorDirectory.class);
@Autowired
private FtpoutboundApp ftpoutboundapp;
@Value("${folder990}")
private String folder990;
public void startMonitoring() throws IOException, InterruptedException {
logger.info("INICIO DE MONITOREO DE ARCHIVOS 990");
try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
Path faxFolder = Paths.get(folder990);
WatchService watchmyservice = FileSystems.getDefault().newWatchService();
faxFolder.register(watchmyservice, StandardWatchEventKinds.ENTRY_CREATE);
boolean valid = true;
do {
try {
WatchKey watchKey = watchmyservice.take();
for (WatchEvent event : watchKey.pollEvents()) {
WatchEvent.Kind kind = event.kind();
if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
String fileName = event.context().toString();
logger.info("ARCHIVO NUEVO:" + fileName);
boolean isGrowing = false;
Long initialWeight = new Long(0);
Long finalWeight = new Long(0);
Path child = faxFolder.resolve(folder990 + fileName);
do {
initialWeight = child.toFile().length();
Thread.sleep(1000);
finalWeight = child.toFile().length();
isGrowing = initialWeight < finalWeight;
logger.info("AUN COPIANDO ARCHIVO:" + fileName);
} while (isGrowing);
logger.info("LISTO ARCHIVO:" + fileName);
getFile(fileName);
}
}
valid = watchKey.reset();
// Thread.sleep(1000 * 10);
} catch (InterruptedException | ClosedWatchServiceException e) {
//watchmyservice.close();
Thread.currentThread().interrupt();
}
} while (valid);
}
}
public void getFile(String fileName) throws IOException {
File file = new File(folder990 + fileName);
ftpoutboundapp.createGateway(file);
}
}
如果我删除Do-While应用程序完成部署!但为什么?它是一个标准的Java watchservice代码,任何人都可以帮助我意识到我错过了什么/这个问题是什么? 问题是Tomcat没有部署我的第四个应用程序,因为它一直在部署第三个应用程序。 在此先感谢您的帮助
编辑1:添加线程
28-Dec-2016 17:57:27.558 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
28-Dec-2016 17:57:27.559 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
28-Dec-2016 17:57:27.613 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
28-Dec-2016 17:57:27.664 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina
28-Dec-2016 17:57:27.664 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployWARs Error waiting for multi-thread deployment of WAR files to complete
java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:404)
at java.util.concurrent.FutureTask.get(FutureTask.java:191)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:744)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:407)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1595)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:280)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:92)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1136)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1372)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1376)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1344)
at java.lang.Thread.run(Thread.java:745)
28-Dec-2016 18:00:21.904 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/9.0.0.M11
28-Dec-2016 18:00:21.907 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Oct 6 2016 18:54:10 UTC
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 9.0.0.0
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Mac OS X
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 10.9.5
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: x86_64
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_73-b02
28-Dec-2016 18:00:21.908 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
28-Dec-2016 18:00:21.909 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /Users/viruskimera/apache-tomcat-9.0.0.M11
28-Dec-2016 18:00:21.909 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /Users/viruskimera/apache-tomcat-9.0.0.M11
28-Dec-2016 18:00:21.909 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/Users/viruskimera/apache-tomcat-9.0.0.M11/conf/logging.properties
28-Dec-2016 18:00:21.909 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
28-Dec-2016 18:00:21.909 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
28-Dec-2016 18:00:21.910 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
28-Dec-2016 18:00:21.910 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/Users/viruskimera/apache-tomcat-9.0.0.M11
28-Dec-2016 18:00:21.910 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/Users/viruskimera/apache-tomcat-9.0.0.M11
28-Dec-2016 18:00:21.910 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/Users/viruskimera/apache-tomcat-9.0.0.M11/temp
28-Dec-2016 18:00:21.910 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /Users/viruskimera/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
28-Dec-2016 18:00:22.063 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
28-Dec-2016 18:00:22.093 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
28-Dec-2016 18:00:22.096 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
28-Dec-2016 18:00:22.098 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
28-Dec-2016 18:00:22.100 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 604 ms
28-Dec-2016 18:00:22.145 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
28-Dec-2016 18:00:22.145 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/9.0.0.M11
28-Dec-2016 18:00:22.224 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /Users/viruskimera/apache-tomcat-9.0.0.M11/webapps/ftpoutbound990-0.0.1-SNAPSHOT.war
28-Dec-2016 18:00:26.346 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.6.RELEASE)
答案 0 :(得分:2)
tomcat deployer线程似乎在调用startMonitoring
方法。按照预期,此方法永远不会返回,因此部署不会完整。
要解决此问题,需要在单独(或后台)线程中运行监视方法。
下面重构的示例可能会有所帮助。
除此之外,WatcherService实例的单个实例可用于观察多个目录。
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MonitorDirectory {
final static Logger logger = Logger.getLogger(MonitorDirectory.class);
@Autowired
private FtpoutboundApp ftpoutboundapp;
@Value("${folder990}")
private String folder990;
private WatchService watchService;
private ExecutorService eventLoop = Executors.newFixedThreadPool(1);
@PostConstruct
public void init() throws IOException, InterruptedException {
watchService = FileSystems.getDefault().newWatchService();
eventLoop.submit((Runnable) () -> {
try {
startMonitoring();
} catch (Exception e) {
logger.error("ERROR...", e);
}
});
}
@PreDestroy
public void destroy() throws IOException {
eventLoop.shutdownNow();
if (watchService != null) {
watchService.close();
}
}
public void startMonitoring() throws IOException, InterruptedException {
logger.info("INICIO DE MONITOREO DE ARCHIVOS 990");
Path faxFolder = Paths.get(folder990);
WatchKey watchKey = faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
boolean valid = true;
do {
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (StandardWatchEventKinds.ENTRY_CREATE.equals(kind)) {
String fileName = event.context().toString();
logger.info("ARCHIVO NUEVO:" + fileName);
boolean isGrowing = false;
Long initialWeight = new Long(0);
Long finalWeight = new Long(0);
Path child = faxFolder.resolve(folder990 + fileName);
do {
initialWeight = child.toFile().length();
Thread.sleep(1000);
finalWeight = child.toFile().length();
isGrowing = initialWeight < finalWeight;
logger.info("AUN COPIANDO ARCHIVO:" + fileName);
} while (isGrowing);
logger.info("LISTO ARCHIVO:" + fileName);
getFile(fileName);
}
valid = watchKey.reset();
}
} while (valid);
}
public void getFile(String fileName) throws IOException {
File file = new File(folder990 + fileName);
ftpoutboundapp.createGateway(file);
}
}
答案 1 :(得分:1)
在盲人中开枪......
对代码的简单回顾表明,如果在try catch中抛出异常,则布尔标志valid
仍为true
,从而导致无限循环。
因此,在catch
块的主体中将标志设置为false!
答案 2 :(得分:1)
您可以查看以下几点。
组件MonitorDirectory是否仅在应用程序中调用一次。如果没有,您可能需要声明&#39; eventLoop&#39; as static并检查PostConstruct中的初始化以避免多次初始化和调用。
此外,executorservice初始化为threadpool为1,如果在您的应用程序中初始化Multiple MonitorDirectory对象,则可能导致部署冻结
有没有机会,文件大小可能在服务器环境中缩小。这可能会导致无限循环“#Growing&#39;检查..