Created
April 19, 2012 17:25
-
-
Save viktorklang/2422443 to your computer and use it in GitHub Desktop.
Swing Actors using Akka
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
// ©2012 Viktor Klang | |
package akka.klang | |
import akka.dispatch.{ DispatcherPrerequisites, ExecutorServiceFactory, ExecutorServiceConfigurator } | |
import com.typesafe.config.Config | |
import java.util.concurrent.{ ExecutorService, AbstractExecutorService, ThreadFactory, TimeUnit } | |
import java.util.Collections | |
import javax.swing.SwingUtilities | |
// First we wrap invokeLater as an ExecutorService | |
object SwingExecutorService extends AbstractExecutorService { | |
def execute(command: Runnable) = SwingUtilities.invokeLater(command) | |
def shutdown(): Unit = () | |
def shutdownNow() = Collections.emptyList[Runnable] | |
def isShutdown = false | |
def isTerminated = false | |
def awaitTermination(l: Long, timeUnit: TimeUnit) = true | |
} | |
// Then we create an ExecutorServiceConfigurator so that Akka can use our SwingExecutorService for the dispatchers | |
class SwingEventThreadExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) { | |
private val f = new ExecutorServiceFactory { def createExecutorService: ExecutorService = SwingExecutorService } | |
def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = f | |
} | |
// Then we simply need to create a dispatcher configuration in our application.conf | |
swing-dispatcher { | |
type = "Dispatcher" | |
executor = "akka.klang.SwingEventThreadExecutorServiceConfigurator" | |
throughput = 1 | |
} | |
// After that we just create the GUI Actors with a Props with the correct dispatcher set: | |
val frameActor = context.actorOf(Props[FrameActor].withDispatcher("swing-dispatcher"), "frame-actor") | |
// Done! Now all messages processed by "frameActor" will be executed by the Swing Event Dispatch Thread, enjoy! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I can't see how the FrameActor should be, can anyone give me a minimal example?