【问题标题】:What this java.lang.Throwable error in mongodb socket means?mongodb 套接字中的这个 java.lang.Throwable 错误是什么意思?
【发布时间】:2016-04-18 09:01:09
【问题描述】:

我试图了解那个错误是什么。当我将 mongoDB 放在另一个实例中时,它开始发生。

这个错误有一个很大的信息,但它什么也没说,也没有已知的触发它的动作。

2016 年 1 月 12 日星期二 19:34:31 UTC BY :[java.lang.Thread.getStackTrace(Thread.java:1552), com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:216), com.sun.enterprise.loader.ASURLClassLoader.preDestroy(ASURLClassLoader .java:184)、org.glassfish.javaee.full.deployment.EarClassLoader.preDestroy(EarClassLoader.java:114)、org.jvnet.hk2.internal.ServiceLocatorImpl.preDestroy(ServiceLocatorImpl.java:956)、org.jvnet。 hk2.internal.ServiceLocatorImpl.preDestroy(ServiceLocatorImpl.java:940), org.glassfish.internal.data.ApplicationInfo.clean(ApplicationInfo.java:451), com.sun.enterprise.v3.server.ApplicationLifecycle.unload(ApplicationLifecycle. java:1071), com.sun.enterprise.v3.server.ApplicationLifecycle.undeploy(ApplicationLifecycle.java:1099), org.glassfish.deployment.admin.UndeployCommand.execute(UndeployCommand.java:412), com.sun.enterprise .v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539), com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535), java.security.AccessContr oller.doPrivileged(本机方法)、javax.security.auth.Subject.doAs(Subject.java:360)、com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534)、com.sun .enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565), com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557), java.security.AccessController.doPrivileged(Native方法)、javax.security.auth.Subject.doAs(Subject.java:360)、com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556)、com.sun.enterprise.v3.admin .CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464), com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109), com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute( CommandRunnerImpl.java:1846)、com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722)、org.glassfish.admin.rest.resources.admin.CommandResource.executeCommand(CommandResource.java: 4 04), org.glassfish.admin.rest.resources.admin.CommandResource.execCommandSimpInMultOut(CommandResource.java:234), sun.reflect.GeneratedMethodAccessor419.invoke(Unknown Source), sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)、java.lang.reflect.Method.invoke(Method.java:497)、org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)、org.glassfish.jersey。 server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151), org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171), org.glassfish.jersey.server.model .internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152), org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDisp atcher.java:104), org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387), org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331), org .glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103), org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271), org.glassfish.jersey.internal.Errors$1 .call(Errors.java:271), org.glassfish.jersey.internal.Errors$1.call(Errors.java:267), org.glassfish.jersey.internal.Errors.process(Errors.java:315), org .glassfish.jersey.internal.Errors.process(Errors.java:297), org.glassfish.jersey.internal.Errors.process(Errors.java:267), org.glassfish.jersey.process.internal.RequestScope.runInScope (RequestScope.java:297)、org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)、org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)、org.glassfish。 jersey.grizzly2.httpserver.GrizzlyHttpContainer.se rvice(GrizzlyHttpContainer.java:365), org.glassfish.admin.rest.adapter.JerseyContainerCommandService$3.service(JerseyContainerCommandService.java:173), org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:179 ), com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459), com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167), org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)、org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)、org.glassfish.grizzly.http。 server.HttpServerFilter.handleRead(HttpServerFilter.java:235), org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119), org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284 ), org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201), org.glassfish.grizzly.filterchain.DefaultFilter Chain.execute(DefaultFilterChain.java:133), org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112), org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77), org.glassfish .grizzly.portunif.PUFilter.handleRead(PUFilter.java:231), org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119), org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain. java:284), org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201), org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133), org.glassfish.grizzly.filterchain .DefaultFilterChain.process(DefaultFilterChain.java:112), org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77), org.glassfish.grizzly.portunif.PUFilter.handleRead(PUFilter.java:231), org. glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119),org.glassfish。 grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284), org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201), org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java: 133), org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112), org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77), org.glassfish.grizzly.nio.transport.TCPNIOTransport .fireIOEvent(TCPNIOTransport.java:561), org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112), org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117), org. glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56), org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137), org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker .doWor k(AbstractThreadPool.java:565), org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545), java.lang.Thread.run(Thread.java:745)] 父级 -> org. glassfish.internal.api.DelegatingClassLoader@7cbe8ac6 从以下堆栈跟踪调用完成后,请求查找类 org.bson.codecs.EncoderContext$1 java.lang.Throwable 在 com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:825) 在 com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:742) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 org.bson.codecs.EncoderContext.(EncoderContext.java:27) 在 org.bson.codecs.EncoderContext$Builder.build(EncoderContext.java:67) 在 com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:168) 在 com.mongodb.connection.CommandMessage.encodeMessageBody(CommandMessage.java:69) 在 com.mongodb.connection.RequestMessage.encode(RequestMessage.java:132) 在 com.mongodb.connection.CommandHelper.sendMessage(CommandHelper.java:88) 在 com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32) 在 com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:186) 在 com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:134) 在 java.lang.Thread.run(Thread.java:745) ]]


错误信息图片:


编辑:

来自 Payara Server github issue 的人帮助我找到了问题。我已经使用 ServletContextListener 在部署之前终止了 mongo 连接。现在,我将等待一段时间,看看问题是否得到解决。代码如下:

@Log
@WebListener
public class AppServletContextListener implements ServletContextListener {
    @Inject
    MongoClientProvider mongo;

    @Override
    public void contextDestroyed(ServletContextEvent arg) {
        log.info("ServletContextListener destroyed");
        DbUtils.closeMongoConnections(mongo);
    }

    @Override
    public void contextInitialized(ServletContextEvent arg) {
        log.info("ServletContextListener started");
    }
}

.

public class DbUtils {
    public static void closeMongoConnections(MongoClientProvider mongo) {
        mongo.getDeletedGroups().getManager().close();
        mongo.getMessages().getManager().close();
        mongo.getGameficationInfos().getManager().close();
        mongo.getDgsa().getManager().close();
        mongo.getRisa().getManager().close();
        mongo.getExpiredEmailLinks().getManager().close();
    }
}

【问题讨论】:

  • 你使用的是什么 JVM/JRE?

标签: java mongodb amazon-web-services glassfish


【解决方案1】:

您已从错误中删除了有用的部分,但它存在于您的屏幕截图中。在AT Tue Jan 12 19:34:31 UTC 2016 部分之前也会有一点,它会告诉你错误来自ASURLClassLoader,告诉你一些关于类加载器的状态。

关键部分是图片的最后一行:

...
was requested to find class org.bson.codecs.EncoderContext$1 after done was invoked from the following stack trace

它所说的done() 方法是一种清理方法,当类加载器准备好进行垃圾回收时会调用该方法。所以,此时EncoderContext 类正在尝试加载一个类,但它到达的ASURLClassLoader 处于被标记为清理但尚未清理之间的这种不确定状态。

我之前看到过类似的问题,我目前正在研究 Payara Server,它源自 GlassFish。如果您能在 Payara Github 存储库中提出问题,我将不胜感激: https://github.com/payara/Payara/issues

,这可能是一个错误GlassFish和似鲭水狼牙鱼服务器所以大概不恰当的详尽的讨论上的问答网站!̶ P>


编辑:实际上,仔细观察ASURLClassLoader 堆栈(大屏幕截图),看起来done() 是因为取消部署而被调用的。因此,可能是在未部署的应用程序中调用了 MongoDB,而 MongoDB 并未同时被释放。

这可能是您想要的,但在这种情况下,不应从应用程序中创建 MongoDB 资源。否则,需要在取消部署应用程序之前将其正确销毁。

【讨论】:

  • 哼,我也提个问题。所以,我可以考虑一个 Glassfish 虫子吗?这个错误的好处/坏处是它不会在我的应用程序中产生任何不良行为,它是一个透明的错误,总是会发生,但不会崩溃
  • 我已经更新了我的答案。看起来这里的实际问题是启动 MongoDB 的应用程序未部署,因此 MongoDB 尝试访问其类加载器,但发现它已标记为删除。因为 MongoDB 仍然持有对类加载器的引用,所以它永远不会被垃圾收集。为防止出现错误,必须在取消部署应用程序之前处理掉 MongoDB。
  • 我将在问题正文中添加一个新类,它与我的 Singleton 相关,它引入了 mongo 连接
  • 实际上,我在部署之前停止 de mongo 服务怎么样。它会杀死数据库中的任何连接并解决问题吗?
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 2018-11-29
  • 2011-03-01
  • 2012-11-06
相关资源
最近更新 更多