2016-11-17 6 views
2

Я пытаюсь deply некоторых приложений (4 пружинных загрузка веб-приложения) в Tomcat 9, я заметил, 2 из них делают Tomcat войти на дисплей:Tomcat развертывания SpringBoot Фиксации App

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 

И он остается таким образом просто его развертывание не отображает ЗАВЕРШЕНА. Дело в том, что приложение РАБОТАЕТ, даже если оно не выглядит полностью РАЗЛИЧНЫМ. (я вижу, что мои записи log4j и файлы обрабатываются в наблюдаемом папке)

Эти приложения контролировать 2 различных папок с помощью Java watchService со следующим кодом:

пакета 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 не развертывает мое 4-е приложение, потому что он продолжает развертывать третий. Заранее спасибо за помощь


EDIT 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) 

ответ

1

Принимая выстрел в слепом ..

Простой обзор кода наводит на мысль, что, если исключение составляет брошенный внутри try catch, флаг boolean valid остается true, вызывая бесконечный цикл.

Следовательно, установите флаг в false в корпусе блока catch!

+0

Я проверяю это. – viruskimera

2

Точка развертывания tomcat, похоже, вызывает метод 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); 
    } 

} 
+0

Я пробовал это – viruskimera

+0

посмотреть на мой EDIT 1, это локальный запуск, но я боюсь, что он будет таким же на сервере. Я применил ваш код и замораживал то же самое, что и shutdown tomcat и отображает: посмотрите на строку SEVERE ERROR: 28-Dec-2016 17: 57: 27.664, он говорит, что ошибка, ожидающая развертывания, будет завершена. Я даже попробовал сменить версию с версии v1.4.1.RELEASE на v1.3.6.RELEASE, поскольку 1 приложение, использующее v1.4.1.RELEASE, разворачивается правильно, но то же самое происходит. – viruskimera

+0

BTW Я заметил, что потребление памяти в процессе Java увеличивается. – viruskimera

1

Можете ли вы проверить несколько вещей ниже.

Является ли Component MonitorDirectory вызывается только один раз в ваших приложениях. Если нет, вам может потребоваться объявить «eventLoop» статичным и проверить инициализацию в PostConstruct, чтобы избежать множественной инициализации и вызова.

Кроме того, ExecutorService инициализируется ThreadPool 1 и если Multiple объект MonitorDirectory инициализируется в вашем приложении, это может привести к развертыванию замораживать

Есть ли шанс, то размер файла может быть сокращение в серверной среде , Это может привести к бесконечному циклу проверки «isGrowing».

+0

Часть этого кода была предложена пользователем Skadya выше, но я бы сказал, что MOnitor вызывается только один раз, как можно было бы вызвать вызов более одного раза? Обратите внимание, что это работает на 1 шт, но мы скопировали все с этого ПК (jdk , tomcat и т. д.) Я попытался использовать @scheduled аннотацию, кажется, работает, но все еще имеет дело с некоторыми проблемами. – viruskimera

+0

Весной, всякий раз, когда объект инициализируется, будет вызываться метод postConstruct. Если приложение может создавать несколько объектов для одного и того же объекта (типичное веб-приложение с параллелизмом), это может произойти. –