Glassfish Tyrus ServerEndpoint实例化失败 - 如何诊断错误?

时间:2014-08-10 10:44:28

标签: java glassfish java-7 glassfish-4 tyrus

我有一个ServerEndpoint类,一旦我尝试从客户端连接到它,就会抛出此错误。我认为缺少某种依赖,即一个缺少另一个jar的捆绑库,尽管它可能是其他一些问题。

我在服务器日志中看到以下堆栈跟踪,没有其他信息。

  An exception or error occurred in the container during the request processing
java.lang.NoClassDefFoundError: Could not initialize class org.example.ServerSocketEndpoint
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at java.lang.Class.newInstance(Class.java:374)
        at org.glassfish.tyrus.core.ReflectionHelper.getInstance(ReflectionHelper.java:807)
        at org.glassfish.tyrus.core.DefaultComponentProvider.create(DefaultComponentProvider.java:60)
        at org.glassfish.tyrus.core.ComponentProviderService.getInstance(ComponentProviderService.java:232)
        at org.glassfish.tyrus.core.ComponentProviderService.getEndpointInstance(ComponentProviderService.java:293)
        at org.glassfish.tyrus.server.TyrusServerEndpointConfigurator.getEndpointInstance(TyrusServerEndpointConfigurator.java:160)
        at org.glassfish.tyrus.core.AnnotatedEndpoint$1.getEndpointInstance(AnnotatedEndpoint.java:144)
        at org.glassfish.tyrus.core.ComponentProviderService.getInstance(ComponentProviderService.java:149)
        at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:452)
        at org.glassfish.tyrus.core.AnnotatedEndpoint.onError(AnnotatedEndpoint.java:507)
        at org.glassfish.tyrus.core.TyrusEndpointWrapper.onConnect(TyrusEndpointWrapper.java:657)
        at org.glassfish.tyrus.core.TyrusWebSocket.onConnect(TyrusWebSocket.java:141)
        at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusConnection.<init>(TyrusWebSocketEngine.java:611)
        at org.glassfish.tyrus.core.TyrusWebSocketEngine$SuccessfulUpgradeInfo.createConnection(TyrusWebSocketEngine.java:556)
        at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.init(TyrusHttpUpgradeHandler.java:111)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:777)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
        at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
        at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
        at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
        at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
        at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
        at java.lang.Thread.run(Thread.java:745)
]]

如何获取更多相关信息?我正在使用--debug运行服务器。

我还在域配置中添加了以下内容以监控类加载:

<jvm-options>-verbose:class</jvm-options>
<jvm-options>-XX:LogFile=${com.sun.aas.instanceRoot}/logs/jvm.log</jvm-options>
<jvm-options>-XX:+LogVMOutput</jvm-options>

是否有可能进一步增加冗长度?

我在Linux x64上运行GlassFish Server开源版4.0(版本89),使用最新的Oracle Java 7 JDK&amp; Tyrus 1.7

欢迎任何想法。

端点被剥离到核心;我试图留下任何可能导致问题的事情:

@ServerEndpoint(
  value = "/main",
  encoders =  { BinaryEncoder.class },  // TextEncoder.class
  decoders =  { BinaryDecoder.class }   // TextDecoder.class
)
@Stateful
public class ServerSocketEndpoint implements IServerSocketEndpoint
{
  static {
    logger      = Debug.getLogger(ServerSocketEndpoint.class);
    ds          = DB.initDs();
    gson        = GsonPlus.create();
    sessions    = Collections.synchronizedSet(new HashSet<Session>());
    peers       = Collections.synchronizedSet(new HashSet<ISocketPeer>());
  }

  protected static final DataSource ds;
  protected static final Logger logger;
  protected static final Gson gson;
  protected static final Set<Session> sessions;
  protected static final Set<ISocketPeer> peers;

  protected TyrusSession  _session;   // TyrusSession implements JSR-356 Session
  protected long          _socketSessionId;
  protected BasicPeer     _peer;

  public static void send(final Session session, Msg msg)
  {
    RemoteEndpoint.Async remote = session.getAsyncRemote();
    if (session.isOpen())
    {
      try {
        remote.sendObject(msg);

        logger.log(Level.INFO, String.format("send() msg: %s", msg.toJson(gson)));
      }
      catch (IllegalArgumentException ex) {
        Logger.getLogger(ServerSocketEndpoint.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
  }

  public ServerSocketEndpoint()
  {
  }

  @Override
  public void close(CloseReason closeReason)
  {
    if (_session == null)
      return;

    try {
      _peer.free();
      _session.close(closeReason);
      _session = null;
    }
    catch (IOException ex) {
      methodException(ex);
    }
  }

  @OnOpen
  public void onOpen(Session session, EndpointConfig config)
  {
    _session = (TyrusSession)session;

    if (ds == null) {
      // No connection available somehow - nothing to do except log the error
    }

    InetAddress clientExtIp;
    try {
      clientExtIp = InetAddress.getByName(_session.getRemoteAddr());
    }
    catch (UnknownHostException ex) {
    }

    try (Connection dbc = ds.getConnection())
    {
      CallableStatement proc = dbc.prepareCall("{call newSocketSession(?, ?, ?, ?, ?, ?)}");
      proc.setBytes("extIp",        clientExtIp.getAddress());
      proc.setString("extHostName", clientExtIp.getHostName());
      proc.registerOutParameter("id", Types.BIGINT);
      if (proc.execute()) {
        // Process results
      }
      // Stash a reference to this DB socket session
      _socketSessionId = proc.getLong("id");
    }
    catch (SQLException ex) {
      methodException(ex);
    }
  }

  @OnError
  public void onError(Session session, Throwable ex)
  {
    methodException(ex);
  }

  @OnMessage
  public void onMessage(final Session session, Msg msg) throws IOException, EncodeException
  {
    // deal with messages
  }

  @OnClose
  public void onClose(Session session)
  {
    sessions.remove(session);
    _session = null;
    _peer = null;
  }
}

好的,所以我得到它与Pavel的帮助。

  1. Tyrus不应包含在WAR中,因为这会导致类路径上出现重复文件。
  2. 没有链接apache.commons.codec.binary.Base64类(GsonPlus需要)。
  3. 所以我的问题更具体地说明如下:是否存在诊断CNFE错误的非暴力方法,即没有解构&amp;一块一块地重新构建端点?

0 个答案:

没有答案