-
Notifications
You must be signed in to change notification settings - Fork 427
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2247 from constantine2nd/develop
Request Timeout, ScalikeJDBC
- Loading branch information
Showing
11 changed files
with
368 additions
and
153 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
package code.api.util | ||
|
||
import java.util.concurrent.TimeoutException | ||
import java.util.{Timer, TimerTask} | ||
|
||
import code.api.Constant | ||
|
||
import scala.concurrent.{ExecutionContext, Future, Promise} | ||
import scala.language.postfixOps | ||
|
||
object FutureUtil { | ||
|
||
// All Future's that use futureWithTimeout will use the same Timer object | ||
// it is thread safe and scales to thousands of active timers | ||
// The true parameter ensures that timeout timers are daemon threads and do not stop | ||
// the program from shutting down | ||
|
||
val timer: Timer = new Timer(true) | ||
|
||
case class EndpointTimeout(inMillis: Long) | ||
|
||
implicit val defaultTimeout: EndpointTimeout = EndpointTimeout(Constant.longEndpointTimeoutInMillis) | ||
|
||
/** | ||
* Returns the result of the provided future within the given time or a timeout exception, whichever is first | ||
* This uses Java Timer which runs a single thread to handle all futureWithTimeouts and does not block like a | ||
* Thread.sleep would | ||
* @param future Caller passes a future to execute | ||
* @param timeout Time before we return a Timeout exception instead of future's outcome | ||
* @return Future[T] | ||
*/ | ||
def futureWithTimeout[T](future : Future[T])(implicit timeout : EndpointTimeout, ec: ExecutionContext): Future[T] = { | ||
|
||
// Promise will be fulfilled with either the callers Future or the timer task if it times out | ||
var p = Promise[T] | ||
|
||
// and a Timer task to handle timing out | ||
|
||
val timerTask = new TimerTask() { | ||
def run() : Unit = { | ||
p.tryFailure(new TimeoutException(ErrorMessages.requestTimeout)) | ||
} | ||
} | ||
|
||
// Set the timeout to check in the future | ||
timer.schedule(timerTask, timeout.inMillis) | ||
|
||
future.map { | ||
a => | ||
if(p.trySuccess(a)) { | ||
timerTask.cancel() | ||
} | ||
} | ||
.recover { | ||
case e: Exception => | ||
if(p.tryFailure(e)) { | ||
timerTask.cancel() | ||
} | ||
} | ||
|
||
p.future | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.