【问题标题】:Ebean shutdown is broken on Play Test播放测试时 Ebean 关闭中断
【发布时间】:2016-03-31 17:35:12
【问题描述】:

我们使用基础测试在 Play Server 中创建了测试结构,我们在其中清理内存数据库,然后进行演进。代码的简单快照如下:

public static void ddlConfiguration() {
    String serverName = "default";
    server = Ebean.getServer(serverName);
    ServerConfig config = new ServerConfig();
    ddl = new DdlGenerator();

    // Get the database engine
    String jdbc = settings.get("db.default.url");
    String[] splittedUrl = jdbc.split(":");
    String engine = splittedUrl[1];
    if(engine.equals("h2")){
        ddl.setup((SpiEbeanServer) server, new H2Platform(), config);
    }else{
        ddl.setup((SpiEbeanServer) server, new MySqlPlatform(), config);
    }

}
@Before
public void startApp() throws IOException {
    app = Helpers.fakeApplication(settings);
    Helpers.start(app);

    ddlConfiguration();
} 
@After
public void stopApp() {
    // We clean the database at the end of the test in order not to overwrite
    // the onStart App initialization
    cleanDb();
    Helpers.stop(app);
}

问题是一旦所有的测试都被执行并且 Play 服务器关闭,就会抛出如下异常:

[error] c.a.e.s.c.DefaultServer - Error unregistering Ebean Ebean:server=default2
javax.management.InstanceNotFoundException: Ebean:server=default2,key=AutoFetch
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095) ~[na:1.8.0_72]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427) ~[na:1.8.0_72]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415) ~[na:1.8.0_72]
    at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546) ~[na:1.8.0_72]
    at com.avaje.ebeaninternal.server.core.DefaultServer.shutdownInternal(DefaultServer.java:406) [avaje-ebeanorm.jar:na]
    at com.avaje.ebeaninternal.server.core.DefaultServer.shutdownManaged(DefaultServer.java:379) [avaje-ebeanorm.jar:na]
[error] c.a.e.s.c.DefaultServer - Error unregistering Ebean Ebean:server=default3
javax.management.InstanceNotFoundException: Ebean:server=default3,key=AutoFetch
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095) ~[na:1.8.0_72]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427) ~[na:1.8.0_72]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415) ~[na:1.8.0_72]
    at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546) ~[na:1.8.0_72]
    at com.avaje.ebeaninternal.server.core.DefaultServer.shutdownInternal(DefaultServer.java:406) [avaje-ebeanorm.jar:na]
    at com.avaje.ebeaninternal.server.core.DefaultServer.shutdownManaged(DefaultServer.java:379) [avaje-ebeanorm.jar:na]

每个错误的第一行报告从“[error] c.a.e.s.c.DefaultServer - Error unregistering Ebean Ebean:server=default2”到“[error] c.a.e.s.c.DefaultServer - Error unregistering Ebean Ebean:server=default38”。所以我相信这是由于 EbeanServers 没有关闭。

那么,我怎样才能正确关闭它们呢?

【问题讨论】:

    标签: java playframework-2.2 ebean


    【解决方案1】:

    这通常发生在命名冲突时。

    你在哪里:

    String serverName = "default";
    server = Ebean.getServer(serverName);
    

    将其更改为具有唯一服务器名称的名称:

    String serverName = "default" + UUID.randomUUID().toString();
    server = Ebean.getServer(serverName);
    

    当然你可以使用一些计数器或类似的东西,只要确保 Ebean 服务器的名称是唯一的。

    【讨论】:

    • 它仍然出现相同的错误,但重复次数减少了。非常感谢。
    • 那是什么版本的 Ebean? (我认为这是旧版本)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2023-03-04
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多