#2168 - Exposing more Netty options in remtoe config
This commit is contained in:
parent
2940740c48
commit
12b9af25cf
9 changed files with 83 additions and 47 deletions
|
|
@ -28,22 +28,22 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
|
|||
|
||||
def unreliableCall(param: String) = {
|
||||
param match {
|
||||
case "fail" => throw new RuntimeException("FAIL")
|
||||
case _ => param
|
||||
case "fail" ⇒ throw new RuntimeException("FAIL")
|
||||
case _ ⇒ param
|
||||
}
|
||||
}
|
||||
|
||||
def openBreaker: Unit = {
|
||||
for (i <- 1 to 5)
|
||||
for (i ← 1 to 5)
|
||||
Await.result(breakers.breaker.withCircuitBreaker(Future(unreliableCall("fail"))) recoverWith {
|
||||
case _ => Promise.successful("OK")
|
||||
case _ ⇒ Promise.successful("OK")
|
||||
}, 1.second.dilated)
|
||||
}
|
||||
|
||||
"A circuit breaker being called by many threads" must {
|
||||
"allow many calls while in closed state with no errors" in {
|
||||
|
||||
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {Thread.sleep(10); unreliableCall("succeed")})
|
||||
val futures = for (i ← 1 to 100) yield breakers.breaker.withCircuitBreaker(Future { Thread.sleep(10); unreliableCall("succeed") })
|
||||
|
||||
val futureList = Future.sequence(futures)
|
||||
|
||||
|
|
@ -59,10 +59,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
|
|||
|
||||
openBreaker
|
||||
|
||||
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
val futures = for (i ← 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
Thread.sleep(10); unreliableCall("success")
|
||||
}) recoverWith {
|
||||
case _: CircuitBreakerOpenException => Promise.successful("CBO")
|
||||
case _: CircuitBreakerOpenException ⇒ Promise.successful("CBO")
|
||||
}
|
||||
|
||||
val futureList = Future.sequence(futures)
|
||||
|
|
@ -79,10 +79,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
|
|||
|
||||
Await.ready(breakers.halfOpenLatch, 2.seconds.dilated)
|
||||
|
||||
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
val futures = for (i ← 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
Thread.sleep(10); unreliableCall("succeed")
|
||||
}) recoverWith {
|
||||
case _: CircuitBreakerOpenException => Promise.successful("CBO")
|
||||
case _: CircuitBreakerOpenException ⇒ Promise.successful("CBO")
|
||||
}
|
||||
|
||||
val futureList = Future.sequence(futures)
|
||||
|
|
@ -102,10 +102,10 @@ class CircuitBreakerMTSpec extends AkkaSpec with BeforeAndAfter {
|
|||
|
||||
Await.ready(breakers.breaker.withCircuitBreaker(Future(unreliableCall("succeed"))), 1.second.dilated)
|
||||
|
||||
val futures = for (i <- 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
val futures = for (i ← 1 to 100) yield breakers.breaker.withCircuitBreaker(Future {
|
||||
Thread.sleep(10); unreliableCall("succeed")
|
||||
}) recoverWith {
|
||||
case _: CircuitBreakerOpenException => Promise.successful("CBO")
|
||||
case _: CircuitBreakerOpenException ⇒ Promise.successful("CBO")
|
||||
}
|
||||
|
||||
val futureList = Future.sequence(futures)
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@ class DangerousActor extends Actor {
|
|||
def dangerousCall: String = "This really isn't that dangerous of a call after all"
|
||||
|
||||
def receive = {
|
||||
case "is my middle name" =>
|
||||
case "is my middle name" ⇒
|
||||
sender ! breaker.withCircuitBreaker(Future(dangerousCall))
|
||||
case "block for me" =>
|
||||
case "block for me" ⇒
|
||||
sender ! breaker.withSyncCircuitBreaker(dangerousCall)
|
||||
}
|
||||
//#circuit-breaker-usage
|
||||
|
|
|
|||
|
|
@ -133,6 +133,15 @@ akka {
|
|||
# (I) Maximum total size of all channels, 0 for off
|
||||
max-total-memory-size = 0b
|
||||
|
||||
# (I&O) Sets the high water mark for the in and outbound sockets, set to 0b for platform default
|
||||
write-buffer-high-water-mark = 0b
|
||||
|
||||
# (I&O) Sets the send buffer size of the Sockets, set to 0b for platform default
|
||||
send-buffer-size = 0b
|
||||
|
||||
# (I&O) Sets the receive buffer size of the Sockets, set to 0b for platform default
|
||||
receive-buffer-size = 0b
|
||||
|
||||
# (O) Time between reconnect attempts for active clients
|
||||
reconnect-delay = 5s
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,12 @@ private[akka] class ActiveRemoteClient private[akka] (
|
|||
b.setOption("tcpNoDelay", true)
|
||||
b.setOption("keepAlive", true)
|
||||
b.setOption("connectTimeoutMillis", settings.ConnectionTimeout.toMillis)
|
||||
if (settings.ReceiveBufferSize.isDefined)
|
||||
b.setOption("receiveBufferSize", settings.ReceiveBufferSize.get)
|
||||
if (settings.SendBufferSize.isDefined)
|
||||
b.setOption("sendBufferSize", settings.SendBufferSize.get)
|
||||
if (settings.WriteBufferHighWaterMark.isDefined)
|
||||
b.setOption("writeBufferHighWaterMark", settings.WriteBufferHighWaterMark.get)
|
||||
settings.OutboundLocalAddress.foreach(s ⇒ b.setOption("localAddress", new InetSocketAddress(s, 0)))
|
||||
bootstrap = b
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,12 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) {
|
|||
b.setOption("tcpNoDelay", true)
|
||||
b.setOption("child.keepAlive", true)
|
||||
b.setOption("reuseAddress", true)
|
||||
if (settings.ReceiveBufferSize.isDefined)
|
||||
b.setOption("receiveBufferSize", settings.ReceiveBufferSize.get)
|
||||
if (settings.SendBufferSize.isDefined)
|
||||
b.setOption("sendBufferSize", settings.SendBufferSize.get)
|
||||
if (settings.WriteBufferHighWaterMark.isDefined)
|
||||
b.setOption("writeBufferHighWaterMark", settings.WriteBufferHighWaterMark.get)
|
||||
b
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,8 +37,20 @@ private[akka] class NettySettings(config: Config, val systemName: String) {
|
|||
val WriteTimeout: Duration = Duration(getMilliseconds("write-timeout"), MILLISECONDS)
|
||||
val AllTimeout: Duration = Duration(getMilliseconds("all-timeout"), MILLISECONDS)
|
||||
val ReconnectDelay: Duration = Duration(getMilliseconds("reconnect-delay"), MILLISECONDS)
|
||||
|
||||
val MessageFrameSize: Int = getBytes("message-frame-size").toInt
|
||||
|
||||
private[this] def optionSize(s: String): Option[Int] = getBytes(s).toInt match {
|
||||
case 0 ⇒ None
|
||||
case x if x < 0 ⇒
|
||||
throw new ConfigurationException("Setting '%s' must be 0 or positive (and fit in an Int)" format s)
|
||||
case other ⇒ Some(other)
|
||||
}
|
||||
|
||||
val WriteBufferHighWaterMark: Option[Int] = optionSize("write-buffer-high-water-mark")
|
||||
val SendBufferSize: Option[Int] = optionSize("send-buffer-size")
|
||||
val ReceiveBufferSize: Option[Int] = optionSize("receive-buffer-size")
|
||||
|
||||
val Hostname: String = getString("hostname") match {
|
||||
case "" ⇒ InetAddress.getLocalHost.getHostAddress
|
||||
case value ⇒ value
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class RemoteConfigSpec extends AkkaSpec(
|
|||
WriteTimeout must be(10 seconds)
|
||||
AllTimeout must be(0 millis)
|
||||
ReconnectionTimeWindow must be(10 minutes)
|
||||
WriteBufferHighWaterMark must be(None)
|
||||
SendBufferSize must be(None)
|
||||
ReceiveBufferSize must be(None)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue