小编Dan*_*mas的帖子

由于Mac OS X上的"java.net.SocketException Invalid argument",Tomcat启动失败

我们有一个在Tomcat 6上运行的应用程序(准确地说是6.0.35.0),由于Catalina.await方法中的socketAccept调用抛出SocketException,我们在Mac OS上的大多数工程师都遇到启动Tomcat的问题:

SEVERE: StandardServer.await: accept:
java.net.SocketException: Invalid argument
      at java.net.PlainSocketImpl.socketAccept(Native Method)
      at java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java)
      at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
      at java.net.ServerSocket.implAccept(ServerSocket.java:522)
      at java.net.ServerSocket.accept(ServerSocket.java:490)
      at org.apache.catalina.core.StandardServer.await(StandardServer.java:431)
      at org.apache.catalina.startup.Catalina.await(Catalina.java:676)
      at org.apache.catalina.startup.Catalina.start(Catalina.java:628)
      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:601)
      at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
      at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
      at mycompany.tomcat.startup.ThreadDumpWrapper.main(ThreadDumpWrapper.java:260)
      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:601)
      at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:238)
      at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)

这会导致Tomcat在启动后立即关闭(并且没有少量的愤怒).我们认为这在Mac OS w/Java 1.7上一直存在,在过去的几个月里,我们很多人已经转向Macbook Pros.到目前为止,唯一的症状是来自Tomcat的偶然零字节响应,因为这个异常也被抛出在socketRead上.错误没有打到日志,我们单独耸了耸肩作为一个孤立的问题,只有在启动问题开始时才找到原因并设置了SocketException断点:

Daemon Thread [http-8080-1] (Suspended (breakpoint at line 47 in SocketException))  
  SocketException.<init>(String) line: 47 
  SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface tomcat

29
推荐指数
1
解决办法
1万
查看次数

如何在不使用异常的情况下从方法返回失败详细信息,并可选择包含值?

首先是一些背景:

我已经实现了一个Result类来携带结果信息.它们是专门针对故障实施的,成功结果通常不会提供额外信息.我在我的一个项目中的核心API外部的公共方法中使用它们,或者在一两层深的方法中使用它们,我需要将详细信息备份到公共API.这个API在容器和命令行客户端中使用,并且之前已经非常快速地检查了异常.另一种方法是将这种失败上下文信息添加到异常中,并添加几个不同的异常类,它们不属于它们.我想这反映了我的一般做法:

http://blogs.atlassian.com/2011/05/exceptions_are_bad

结果有一个支持枚举和界面:

  1. ResultStatus:SUCCESS,FAILURE,CONDITIONAL_SUCCESS等.保存int返回码和通用消息(例如"操作成功")
  2. ResultCode:用于标记枚举结果代码的空接口,FILE_NOT_FOUND,FILE_INVALID,FILE_INCOMPATIBLE.这些主要用于单元和功能测试,但也用于在线帮助(Maven在故障方面的帮助在功能上类似于我正在做的事情)

Result为状态提供静态工厂方法,构建其他关键字段的构建器方法是不可变的.这是构建结果的样子:

Result.success().withCode( ResultCode ).withMessage( "" );
Run Code Online (Sandbox Code Playgroud)

并评估返回的结果:

result.isSuccessful();
result.hasCode( ResultCode );
result.getMessage();
Run Code Online (Sandbox Code Playgroud)

我的问题:

这种方法非常成功,特别是使功能测试变得轻而易举,但是我有一个主要的差距:在大多数情况下我只关心结果,在一些关键区域我需要返回一个带有结果的值.

我对第一次尝试感到不满意:ResultPair<T>它包含结果和值,其中T是值的类型.除非我复制所有Result方法,否则使用该类是冗长且笨拙的:获取结果,将其添加到ResultPair,并在评估之前捕获结果和值.乍一看,由于构建器模式,继承将无法工作,我无法想到一种方法可以获得结果允许的清晰,干净的代码,而无需完全复制Result类.

理想情况下,该方法将允许Result可选地返回一个值,但我无法想到以类型安全的方式执行它的方法,以确保方法签名清楚地指示值的类型,但避免在任何地方都有无意义的通用参数我没有返回值.

我真的不介意有两个类,复制结果构建器和评估代码不是世界末日,它只是感觉不对,我觉得缺乏经验让我变得更好,我错过了(明显或不那么明显)解决方案.我正在使用Guava并且我想以友好的方式禁止空值,因此可能另外将所有值包装在Optional中,但我仍然需要泛型参数(并将其组合到类中以避免result.value( ).get()......好的,我现在正在大声思考.我应该问一个问题......).

有没有办法满足这些明显相互排斥的要求?

java generics inheritance exception-handling exception

7
推荐指数
1
解决办法
1334
查看次数

为什么不在这个JNI代码中显示select系统调用?

在Mac OS上调查这个JDK错误时,我遇到了系统调用跟踪输出,我不明白:

由于Mac OS X上的"java.net.SocketException Invalid argument",Tomcat启动失败

简短版本:在Mac OS上,JDK使用select()而不是poll().因此,如果分配了超过1024个文件描述符,我们推断出select()调用NET_Timeout失败导致带有"无效参数"消息的SocketException.但是,当我跟踪系统调用时,我没有看到系统调用的证据select(),或者任何失败的调用并设置了EINVAL,因此我将其视为潜在原因.

我也没有看到我现在创建的缩减测试用例的调用我理解了这个问题:

import java.io.*;
import java.net.*;

public class SelectTest {
  public static void main(String[] args) throws Exception {
    for(int i = 0; i < 1024; i++) {
      new FileInputStream("/dev/null");
    }
    ServerSocket socket = new ServerSocket(8080);
    socket.accept();
  }
}
Run Code Online (Sandbox Code Playgroud)

在Mac OS w/JDK 1.7u5及更高版本中导致此例外:

Exception in thread "main" java.net.SocketException: Invalid argument
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
    at java.net.ServerSocket.implAccept(ServerSocket.java:522)
    at java.net.ServerSocket.accept(ServerSocket.java:490)
    at SelectTest.main(SelectTest.java:12)
Run Code Online (Sandbox Code Playgroud)

select()当我使用测试运行时,为什么我看不到任何(或任何其他失败的)调用的证据 …

java macos java-native-interface

7
推荐指数
1
解决办法
511
查看次数