Advertisement
Guest User

Untitled

a guest
May 2nd, 2019
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 7.76 KB | None | 0 0
  1. open System
  2. open Akka.FSharp
  3. open Akka.Actor
  4.  
  5. let inline (^) f x = f x
  6.  
  7. let system = System.create "my-system" (Configuration.load())
  8.  
  9.  
  10.  
  11.     //let sagaActor =
  12.     //    spawn system "saga-handler-actor"
  13.     //        (fun mailbox ->
  14.     //            let rec loop() = actor {
  15.  
  16.     //                let! message = mailbox.Receive()
  17.  
  18.     //                let events = commandHandler message
  19.  
  20.     //                //saga-event-listener
  21.                    
  22.     //                //wait
  23.  
  24.     //                //check if events are ok
  25.  
  26.     //                //parent <! Tell
  27.  
  28.     //                return! loop()
  29.     //            }
  30.     //            loop())
  31.    
  32.  
  33.     //let eventHandlerActor =
  34.     //    spawn system "command-handler-actor"
  35.     //        (fun mailbox ->
  36.     //            let rec loop() = actor {
  37.  
  38.     //                let! message = mailbox.Receive()
  39.  
  40.     //                eventHandler message
  41.  
  42.     //                return! loop()
  43.     //            }
  44.     //            loop())
  45.  
  46. let requestHandlerActor =
  47.     spawn system "request-handler-actor"
  48.         (fun mailbox ->
  49.             let rec loop x = actor {
  50.  
  51.                 let! message = mailbox.Receive()
  52.  
  53.                 //sagaActor <! message
  54.                 //create child actor for handle command ::commandHandlerActor::
  55.                 // handle an incoming message
  56.                 return! loop x
  57.             }
  58.             loop 1)
  59.        
  60.  
  61. type Cmd =
  62.     | CreateUser of string
  63.     | RemoveUser of Guid
  64.  
  65. type Evt =
  66.     | UserCreated of Guid * string
  67.     | UserRemoved of Guid
  68.  
  69. let idGenerator () = Guid.NewGuid()
  70.  
  71. let createUser name =
  72.     if not <| String.IsNullOrEmpty name then
  73.         [UserCreated (idGenerator(), name)]
  74.     else
  75.         []
  76.  
  77. let commandHandler cmd =
  78.     match cmd with
  79.     | CreateUser name ->
  80.         createUser name
  81.     | RemoveUser id -> []
  82.  
  83.  
  84. let eventHandler evt =
  85.     match evt with
  86.     | CreateUser name -> ()
  87.     | RemoveUser id -> ()
  88.  
  89. type Command = unit
  90.  
  91. type ForwardCommand = Forward of Command
  92. type BackwardCommand = Backward of Command
  93.  
  94. [<RequireQualifiedAccessAttribute>]
  95. type SagaState =
  96.     | Empty
  97.     | Fill of ForwardCommand list
  98.     | Forward of Currect: ForwardCommand * Remains: ForwardCommand list * Completed: ForwardCommand list
  99.     | Backward of Currect: BackwardCommand * Remains: BackwardCommand list * Completed: BackwardCommand list
  100.     | BackwardAbort of Remains: BackwardCommand list * Completed: BackwardCommand list
  101.     | ForwardComplete of Completed: ForwardCommand list
  102.     | BackwardComplete of Completed: BackwardCommand list
  103.     | Stop
  104.  
  105. [<RequireQualifiedAccessAttribute>]
  106. type SagaEvent =
  107.     | SagaForwardCommandAdded of ForwardCommand
  108.     | Started
  109.     | Forwarded
  110.     | ForwardFailed
  111.     | Backwarded
  112.     | BackwardFailed
  113.     | ForwardDone
  114.     | BackwardDone
  115.     | Stoped
  116.  
  117. let initSaga = SagaState.Empty
  118.  
  119. let forwardToBackward (Forward cmd) = Backward cmd
  120.  
  121. let applyEvent state event =
  122.     printfn "Current state is: %A and event %A" state event
  123.  
  124.     match state, event with
  125.     | SagaState.Empty, SagaEvent.SagaForwardCommandAdded cmd ->
  126.         SagaState.Fill ^ [cmd]
  127.  
  128.     | SagaState.Fill cmds, SagaEvent.SagaForwardCommandAdded cmd ->
  129.         SagaState.Fill ^ (cmd::cmds)
  130.  
  131.     | SagaState.Fill (_::_ as cmds), SagaEvent.Started ->
  132.         let current, remains = cmds |> List.rev |> (fun (x::xs) -> x, xs)
  133.         SagaState.Forward (current, remains, [])
  134.  
  135.     | SagaState.Forward (current, next::remains, completed), SagaEvent.Forwarded ->
  136.         SagaState.Forward (next, remains, current::completed)
  137.  
  138.     | SagaState.Forward (current, [], completed), SagaEvent.Forwarded ->
  139.         SagaState.ForwardComplete (current::completed)
  140.  
  141.     | SagaState.Forward (_, next::_, completed), SagaEvent.ForwardFailed ->
  142.         SagaState.Backward (next |> forwardToBackward, completed |> List.map forwardToBackward, [])
  143.  
  144.     | SagaState.Backward (current, next::remains, completed), SagaEvent.Backwarded ->
  145.         SagaState.Backward (next, remains, current::completed)
  146.  
  147.     | SagaState.Backward (current, [], completed), SagaEvent.Backwarded ->
  148.         SagaState.BackwardComplete (current::completed)
  149.  
  150.     | SagaState.Backward (current, remains, completed), SagaEvent.BackwardFailed ->
  151.         SagaState.BackwardAbort (remains, current::completed)
  152.  
  153.     | _, SagaEvent.Stoped ->
  154.         SagaState.Stop
  155.     | state, event -> failwith (sprintf "Wrong state %A %A" state event)
  156.  
  157. let playEvents state events = events |> List.fold applyEvent state
  158.  
  159. [<RequireQualifiedAccess>]
  160. type SagaMessage<'a> =
  161.    | ForwardComplete of 'a
  162.     | BackwardComplete of 'a
  163.    | BackwardAbort of string
  164.    | Stop of string
  165.  
  166.  
  167. let runSaga state parent =
  168.    spawn parent "saga-handler-actor"
  169.            (fun mailbox ->
  170.                let rec loop state = actor {
  171.                    match state with
  172.                    | SagaState.Empty ->
  173.                        let! msg = mailbox.Receive()
  174.  
  175.                        if msg = "add" then
  176.                            let events = [SagaEvent.SagaForwardCommandAdded ^ Forward ()]
  177.                            return! loop (events |> playEvents state)
  178.                        else
  179.                            return! loop state
  180.                    | SagaState.Fill _ ->
  181.                        let! msg = mailbox.Receive()
  182.                        if msg = "add" then
  183.                            let events = [SagaEvent.SagaForwardCommandAdded ^ Forward ()]
  184.                            return! loop (events |> playEvents state)
  185.                        elif msg = "forward" then
  186.                            let events = [SagaEvent.Started]
  187.                            return! loop (events |> playEvents state)
  188.                        else
  189.                            return! loop state
  190.                    | SagaState.Forward (current, _, _) ->
  191.                        return! loop ([SagaEvent.Forwarded] |> playEvents state)
  192.        
  193.                    | SagaState.Backward (currect, remains, completed) ->
  194.                        return! loop ([SagaEvent.Backwarded] |> playEvents state)
  195.  
  196.                    | SagaState.BackwardAbort (remains, completed) ->
  197.                        mailbox.Sender() <! SagaMessage.BackwardAbort "ok"
  198.  
  199.                    | SagaState.ForwardComplete completed ->
  200.                        mailbox.Sender() <! SagaMessage.ForwardComplete "ok"
  201.  
  202.                    | SagaState.BackwardComplete completed ->
  203.                        mailbox.Sender() <! SagaMessage.BackwardComplete "ok"
  204.  
  205.                    | SagaState.Stop ->
  206.                        mailbox.Sender() <! SagaMessage.Stop
  207.                }
  208.            
  209.                loop state)
  210.  
  211.  
  212. [<EntryPoint>]
  213. let main argv =
  214.  
  215.    let test1 =
  216.        spawn system "handler-actor"
  217.            (fun mailbox ->
  218.                let sagaActor = runSaga initSaga mailbox
  219.                
  220.                sagaActor <! "add"
  221.                sagaActor <! "add"
  222.                sagaActor <! "forward"
  223.  
  224.                let rec loop () = actor {
  225.                    
  226.                    let! sagaMsg = mailbox.Receive()
  227.                    printf "%A" sagaMsg
  228.  
  229.                    let re =
  230.                        match sagaMsg with
  231.                        | SagaMessage.ForwardComplete "ok" -> 1
  232.                        | SagaMessage.BackwardComplete res -> 2
  233.                        | SagaMessage.BackwardAbort reason -> 3
  234.                        | SagaMessage.Stop reason-> 4
  235.                        | _ -> 5
  236.  
  237.                    //printf "Res is %i" res
  238.  
  239.                    return re
  240.                }
  241.  
  242.                loop ())
  243.  
  244.    //System.Threading.Thread.Sleep(100)  
  245.    //test1 <! SagaMessage.ForwardComplete 1
  246.  
  247.    Console.ReadKey() |> ignore
  248.    0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement