2015-06-08 2 views
0

Мы создаем приложение Java EE 6 .ear, работающее на GlassFish (3.1.2.2b5), и используем Flyway (3.2.1) для управления нашей схемой базы данных. Это происходит при развертывании .ear. В статье есть статья в сети: "Easy Database Migrations using Flyway, Java EE 6 and GlassFish", которая прекрасно описывает, как это сделать. Мы минимально принятый код Migrator, в сущности, только изменение/удаление некоторых лесозаготовок:Перенос пролетов на развертывание: Неверный вызов для закрытия() обнаружен

@Singleton 
@Startup 
public class FlywayMigrator { 

    private final static Logger LOG = Logger.getLogger(FlywayMigrator.class.getName()); 

    @Resource(lookup = "jdbc/myDS") 
    private DataSource dataSource; 

    @PostConstruct 
    private void onStartup() { 
     if (dataSource == null) { 
      LOG.severe("Cannot migrate, no datasource configured!"); 
      throw new EJBException("Cannot migrate, no datasource configured!"); 
     } 
     Flyway flyway = new Flyway(); 
     flyway.setBaselineOnMigrate(true); 
     flyway.setDataSource(dataSource); 
     flyway.migrate(); 
    } 

} 

Теперь дело в том, что это работает очень хорошо - не сказать, идеально - миграция мудр. Это, однако, вызывает три одинаковое предупреждение должны быть напечатано в журнале, каждый раз:

[#|2015-06-08T13:40:23.400+0200|WARNING|glassfish3.1.2|javax.enterprise.system.core.classloading.com.sun.enterprise.loader|_ThreadID=42;_ThreadName=Thread-2;|Illegal call to close() detected 
java.lang.Throwable 
    at com.sun.enterprise.loader.ASURLClassLoader$ProtectedJarFile.close(ASURLClassLoader.java:923) 
    at org.flywaydb.core.internal.util.scanner.classpath.JarFileClassPathLocationScanner.findResourceNames(JarFileClassPathLocationScanner.java:41) 
    at org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner.findResourceNames(ClassPathScanner.java:161) 
    at org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner.scanForResources(ClassPathScanner.java:73) 
    at org.flywaydb.core.internal.util.scanner.Scanner.scanForResources(Scanner.java:53) 
    at org.flywaydb.core.internal.callback.SqlScriptFlywayCallback.<init>(SqlScriptFlywayCallback.java:76) 
    at org.flywaydb.core.Flyway.execute(Flyway.java:1315) 
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919) 
    at (...).FlywayMigrator.onStartup(FlywayMigrator.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.ejb.containers.interceptors.BeanCallbackInterceptor.intercept(InterceptorManager.java:1009) 
    at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:65) 
    at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:113) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCallback(SystemInterceptorProxy.java:138) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:120) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:964) 
    at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:65) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:393) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:376) 
    at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:538) 
    at com.sun.ejb.containers.AbstractSingletonContainer.access$100(AbstractSingletonContainer.java:79) 
    at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:719) 
    at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:451) 
    at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216) 
    at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177) 
    at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:155) 
    at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177) 
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) 
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) 
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259) 
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461) 
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212) 
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) 
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:745) 
|#] 

Line 32 из FlywayMigrator является - неудивительно - flyway.migrate(); линии.

Мой вопрос: как мы можем избавиться от этих предупреждений? Я нашел a very similar looking issue which happened on an older version of Glassfish (2.1.1), but no reason or solution is stated there. Это не критически важно, но желательно, чтобы эти предупреждения исчезли, и, кроме того, было бы очень приятно понять их первопричину.

ответ

1

Возможно, очень мало вы можете сделать, чтобы избавиться от назойливого сообщения, за исключением того, что Flyway не сканирует сценарии обновления. код, который вызывается (по Flyway) выглядит следующим образом

public void close() { 
    // nothing 
    _logger.log(Level.WARNING, "Illegal call to close() detected", new Throwable()); 
} 

Как вы можете видеть пролетный путь не преступник здесь (и нет ничего, что вы могли бы сделать по этому поводу)

+1

На второй мысли, вы могли бы настроить ваш уровень регистратора до ошибки (или фатальной) и, таким образом, не будет отображаться эти сообщения. – defectus

+0

Я сам об этом думал, но я думаю, что это будет еще более неудобно ... – zb226