我们假设有一个客户端与服务器建立了很多短生命的连接.
如果客户端关闭连接,则客户端上将有许多TIME_WAIT状态的端口.由于客户端耗尽本地端口,因此无法快速进行新的连接尝试.
如果服务器关闭了连接,我会TIME_WAIT在服务器端看到很多s.但是,这有什么害处吗?客户端(或其他客户端)可以继续进行连接尝试,因为它永远不会耗尽本地端口,并且TIME_WAIT服务器端的状态数将增加.最终会发生什么?有什么不好的事吗?(减速,崩溃,掉线等)
请注意,我的问题不是"目的是TIME_WAIT什么?" 但是"如果TIME_WAIT服务器上有这么多状态,会发生什么?" 我已经知道在TCP/IP中关闭连接时会发生什么以及为什么TIME_WAIT需要状态.我不是想解决它,但只是想知道它的潜在问题.
简单来说,让我们说netstat -nat | grep :8080 | grep TIME_WAIT | wc -l打印100000.会发生什么?O/S网络堆栈是否会变慢?"打开文件太多"错误?或者,没什么好担心的?
我有一个SBT 0.7.5项目,它的一些测试用例失败了.在修复所有测试用例之前,我想跳过测试来生成JAR.是否有任何命令行参数告诉SBT跳过所有测试,比如Maven的-Dmaven.test.skip=true标志?
更新:这是我实施的哈希定时轮.如果您有提高性能和并发性的想法,请告诉我.(20月- 2009年)
// Sample usage:
public static void main(String[] args) throws Exception {
Timer timer = new HashedWheelTimer();
for (int i = 0; i < 100000; i ++) {
timer.newTimeout(new TimerTask() {
public void run(Timeout timeout) throws Exception {
// Extend another second.
timeout.extend();
}
}, 1000, TimeUnit.MILLISECONDS);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我通过使用Hierarchical和Hashed Timing Wheels解决了这个问题.(19月- 2009年)
我正在尝试在Java中实现一个特殊用途计时器,它针对超时处理进行了优化.例如,用户可以使用死线注册任务,并且计时器可以在死线结束时通知用户的回调方法.在大多数情况下,注册任务将在很短的时间内完成,因此大多数任务将被取消(例如task.cancel())或重新安排到将来(例如task.rescheduleToLater(1,TimeUnit.SECOND)) .
我想使用此计时器来检测空闲套接字连接(例如,在10秒内没有收到消息时关闭连接)和写入超时(例如,当写操作未在30秒内完成时引发异常.)在大多数情况下,超时不会发生,客户端将发送一条消息,除非有一个奇怪的网络问题,否则将发送响应.
我不能使用java.util.Timer或java.util.concurrent.ScheduledThreadPoolExecutor,因为它们假设大多数任务都应该超时.如果取消任务,则取消的任务将存储在其内部堆中,直到调用ScheduledThreadPoolExecutor.purge(),这是一项非常昂贵的操作.(也许是O(NlogN)?)
在我在CS类中学到的传统堆或优先级队列中,更新元素的优先级是一项昂贵的操作(在许多情况下为O(logN),因为它只能通过删除元素并重新插入元素来实现.新的优先级值.像Fibonacci堆的一些堆有减少Key()和min()操作的O(1)时间,但我至少需要快速的raiseKey()和min()(或者reduceKey()和max()) .
您是否知道针对此特定用例高度优化的任何数据结构?我正在考虑的一个策略是将所有任务存储在哈希表中并每隔一秒左右迭代所有任务,但这并不是那么美妙.
从Scala 2.10.2开始,我找不到其API文档的下载链接.这是故意遗漏吗?我在哪里可以下载?
或者,scalac使用http://www.scala-lang.org/api/current/index.html生成相同命令的确切命令是什么?(例如,我不知道我必须包括哪些来源罐.)
非阻塞TCP/IP SocketChannel和SelectorNIO帮助我处理许多线程数量少的TCP/IP连接.但UDP怎么样DatagramChannels?(我必须承认我对UDP不是很熟悉.)
即使DatagramChannel不在阻塞模式下运行,UDP发送操作似乎也不会阻塞.是否存在DatagramSocket.send(DatagramPacket)由于拥塞或类似情况导致阻塞的情况?我真的很好奇是否存在这样的情况以及生产环境中可能出现的情况.
如果DatagramSocket.send(DatagramPacket)实际上没有阻止,我不打算使用一个连接DatagramSocket并绑定到只有一个端口,有没有使用非阻塞模式的优势DatagramChannel和Selector?
我有一个返回String的方法.我想用默认值替换它,例如,"<empty>"如果它返回一个空字符串或null.让我们假设它的名字是getSomeString,这是一个昂贵的操作,所以我只能调用它一次,我不能改变它的返回类型Option[String].现在,我正在做以下事情:
val myStr = {
val s = getSomeString
if (s == null || s.isEmpty) "<empty>" else s
}
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来实现同样的事情?
我写了一个接受varargs作为参数的类,并指定它的默认值,以便用户可以经常实例化它而不指定参数:
class MyClass(values: Int* = 42) { }
Run Code Online (Sandbox Code Playgroud)
但是,编译器和REPL给出了以下错误:
<console>:7: error: type mismatch;
found : Int(42)
required: Int*
class MyClass(values: Int* = 42) { }
^
<console>:7: error: a parameter section with a `*'-parameter is not allowed to have default arguments
class MyClass(values: Int* = 42) { }
Run Code Online (Sandbox Code Playgroud)
作为一种解决方法,我尝试了以下方法,但它也不起作用:(显然它很模糊.)
class MyClass(value: Int = 42, otherValues: Int*) { }
Run Code Online (Sandbox Code Playgroud)
我想知道为什么不允许使用varargs参数的默认值.这里有什么理由或技术理由?(我的猜测是指定一个空的varargs需要一些特殊的语法或成语,但我不确定这是否足够的原因.)
我正在尝试找到Exception在Scala中扩展Java的最简单但最合适的方法.例如,下面是不正确的,因为new Exception(null, cause)和new Exception(cause)有根据不同的行为Throwable.java:
class InvalidVersionException(message: String = null, cause: Throwable = null)
extends IllegalArgumentException(message, cause) {
def this(message: String) = this(message, null)
// This is not same with super(cause)
def this(cause: Throwable) = this(null, cause)
}
Run Code Online (Sandbox Code Playgroud)
因为我知道Throwable(cause)设置消息cause.toString(),我想出了以下内容:
class InvalidVersionException(message: String = null, cause: Throwable = null)
extends IllegalArgumentException(if ((message eq null) && (cause ne null)) cause.toString else message, cause) {
def this(message: String) = this(message, null)
def …Run Code Online (Sandbox Code Playgroud) 我有一个由maven-assembly-plugin生成的ZIP存档.它主要包含已经压缩的JAR.再次压缩它们只会增加构建时间而不会有任何好处.在构建ZIP存档时,如何配置maven-assembly-plugin(或程序集描述符)来关闭压缩(即仅存储)?
尝试使可执行文件正常工作我需要一些帮助.这是一个棘手的问题,我把它缩小到这样一个事实:maven exec运行方式和maven shade插件或maven组件插件如何打包文件的方式不同.
我正在使用Netty和JAX-RS在Java中构建REST服务,并使用Jackson从POJO转换为JSON.
执行任一mvn exec:java或时,服务器正确启动java -jar.但是在对java -jar文件发出请求时,我收到以下错误:
Could not find MessageBodyWriter for response object of type: [Ljava.lang.Object; of media type: application/json
Run Code Online (Sandbox Code Playgroud)
似乎没有正确包装的东西,但我不确定是什么.可能缺少传递依赖性?
这是我的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.myserver</groupId>
<artifactId>myserver</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myserver</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>oss-sonatype</id>
<name>oss-sonatype</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<!-- For executing in maven itself (mvn exec:java) -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.test.myserver.App</mainClass>
</configuration> …Run Code Online (Sandbox Code Playgroud)