|
Play Framework/Scala example source code file (PlayRunHooks.scala)
The PlayRunHooks.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play
import scala.util.control.NonFatal
import scala.collection.mutable.LinkedHashMap
import java.net.InetSocketAddress
/**
* The represents an object which "hooks into" play run, and is used to
* apply startup/cleanup actions around a play application.
*/
trait PlayRunHook {
/** Called before the play application is started, but after all "before run" tasks have been completed. */
def beforeStarted(): Unit = ()
/**
* Called after the play application has been started.
* @param addr The address/socket that play is listening to.
*/
def afterStarted(addr: InetSocketAddress): Unit = ()
/**
* Called after the play process has been stopped.
*/
def afterStopped(): Unit = ()
/**
* Called if there was any exception thrown during play run.
* Useful to implement to clean up any open resources for this hook.
*/
def onError(): Unit = ()
}
case class RunHookCompositeThrowable(val throwables: Set[Throwable]) extends Exception(
"Multiple exceptions thrown during PlayRunHook run: " +
throwables.map(t => t + "\n" + t.getStackTrace.take(10).++("...").mkString("\n")).mkString("\n\n")
)
object PlayRunHook {
def makeRunHookFromOnStarted(f: (java.net.InetSocketAddress) => Unit): PlayRunHook = {
// We create an object for a named class...
object OnStartedPlayRunHook extends PlayRunHook {
override def afterStarted(addr: InetSocketAddress): Unit = f(addr)
}
OnStartedPlayRunHook
}
def makeRunHookFromOnStopped(f: () => Unit): PlayRunHook = {
object OnStoppedPlayRunHook extends PlayRunHook {
override def afterStopped(): Unit = f()
}
OnStoppedPlayRunHook
}
// A bit of a magic hack to clean up the PlayRun file
implicit class RunHooksRunner(val hooks: Seq[PlayRunHook]) extends AnyVal {
/** Runs all the hooks in the sequence of hooks. reports last failure if any have failure. */
def run(f: PlayRunHook => Unit, suppressFailure: Boolean = false): Unit = try {
val failures: LinkedHashMap[PlayRunHook, Throwable] = LinkedHashMap.empty
hooks foreach { hook =>
try {
f(hook)
} catch {
case NonFatal(e) =>
failures += hook -> e
}
}
// Throw failure if it occurred....
if (!suppressFailure && failures.nonEmpty) {
if (failures.size == 1) {
throw failures.values.head
} else {
throw RunHookCompositeThrowable(failures.values.toSet)
}
}
} catch {
case NonFatal(e) if suppressFailure =>
// Ignoring failure in running hooks... (CCE thrown here)
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework PlayRunHooks.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.