Skip to content

Instantly share code, notes, and snippets.

@lepinay
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lepinay/d90c20e27e615d7f2642 to your computer and use it in GitHub Desktop.
Save lepinay/d90c20e27e615d7f2642 to your computer and use it in GitHub Desktop.
script to help reproduce and test https://github.com/akkadotnet/akka.net/issues/999
#r @"..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll"
#r @"..\packages\FsPickler.0.9.11\lib\net45\FsPickler.dll"
#r @"..\packages\FSPowerPack.Core.Community.3.0.0.0\Lib\Net40\FSharp.PowerPack.dll"
#r @"..\packages\FSPowerPack.Linq.Community.3.0.0.0\Lib\Net40\FSharp.PowerPack.Linq.dll"
#r @"..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll"
#r @"..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.Serialization.dll"
#r @"..\packages\Helios.1.4.1\lib\net45\Helios.dll"
#r @"..\packages\Akka.1.0.4\lib\net45\Akka.dll"
#r @"..\packages\Akka.Remote.1.0.4\lib\net45\Akka.Remote.dll"
#r @"..\packages\Akka.FSharp.1.0.4\lib\net45\Akka.FSharp.dll"
open Akka
open Akka.FSharp
type Message =
| DoWork of string
let targetConfig =
"""
akka {
#loglevel = "DEBUG"
actor {
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
}
remote {
helios.tcp {
port = 8090
hostname = localhost
}
}
}
"""
|> Configuration.ConfigurationFactory.ParseString
let target = System.create "MyTarget" <| targetConfig
let config =
"""
akka {
#loglevel = "DEBUG"
actor {
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
deployment {
/monitor/remoteWorker {
remote = "akka.tcp://MyTarget@localhost:8090"
}
}
}
remote {
helios.tcp {
port = 8091
hostname = localhost
}
}
}
"""
|> Configuration.ConfigurationFactory.ParseString
let system = System.create "MySystem" <| config
let worker () =
fun (mailbox:Actor<Message>) ->
printfn "Started %s" (mailbox.Self.Path.ToString())
let rec loop () = actor {
let! msg = mailbox.Receive()
match msg with
| DoWork s ->
printfn "%s Started work %s" mailbox.Self.Path.Name s
return! loop ()
}
loop ()
let monitor =
spawn system "monitor"
<| fun mailbox ->
let remoteWorker = spawne mailbox "remoteWorker" <@ worker () @> []
let localWorker = spawne mailbox "localWorker" <@ worker () @> []
let rec loop () = actor {
let! msg = mailbox.Receive()
match msg with
| DoWork s ->
printfn "dispatching work to workers: %s" s
remoteWorker <! DoWork s
localWorker <! DoWork s
return! loop ()
}
loop ()
monitor <! DoWork "Long Work"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment