let ch = runtime.DefaultStoreClient.Channel
let spA, rpA = ch.Create<int>()
let spB, rpB = ch.Create<int>()
let workflow (rpA : IReceivePort<int>) (spB : ISendPort<int>) =
cloud {
while true do
printfn "Waiting"
let! result = Cloud.Catch <| rpA.Receive(timeout = 1000)
match result with
| Choice1Of2 x -> do! spB.Send(x * x)
| Choice2Of2 _ -> ()
}
let job = runtime.CreateProcess(workflow rpA spB)
// Send from client
ch.Send(spA, 3)
// Receive in client
ch.Receive(rpB)
// Kill and dispose
job.Kill()
ch.Delete(rpA)
ch.Delete(rpB)
let SetupEverything () =
let uplanFolder = ""
let clusterPort = 11111
let networkTimeout = TimeSpan.FromSeconds(5.0)
cloud {
do! Cloud.Logf "making archive from folder %s" uplanFolder
let! archive = makePowerstackCloudArchive uplanFolder
do! Cloud.Logf "installing archive on machines"
do! installPowerstack archive
let! machines = getMachineNames ()
let clusterMachine = machines |> Seq.head
do! Cloud.Logf "start cluster on %s:%i" clusterMachine clusterPort
do! startClusterProcess clusterMachine
let clusterReachable = NetworkChecker.CheckHost networkTimeout { HostName = clusterMachine ; Port = clusterPort }
if not clusterReachable.ListensToSocket then
do! Cloud.Logf "cluster %s:%i not reachable" clusterMachine clusterPort
let! serversOutput = startServerProcesses clusterPort clusterMachine
return clusterMachine, serversOutput
}