Вот пример:
let scheduleMessagesActor (mailbox : Actor<_>) =
let rec loop () =
actor {
let! (msg : obj) = mailbox.Receive()
let db = AkkaDbUtils.getAkkaDbContext ()
return!
match msg with
| :? ScheduleMessageCommand as cmd ->
query {
for row in db.Dbo.ScheduledMessages do
where (row.MessageReference = cmd.Id && row.Triggered = false && row.Cancelled = false)
select row
} |> Seq.iter (fun row -> row.Cancelled <- true)
db.Dbo.ScheduledMessages.``Create(Cancelled, Message, MessageReference, MessageVersion, TriggerTime, Triggered)``(
false,
cmd.Message |> serializeObject,
cmd.Id,
cmd.Version,
cmd.TriggerDateTime,
false) |> ignore
db.SubmitUpdatesAsync ()
|> Async.pipeTo (retype mailbox.Self) (fun result -> { Command = cmd; Result = result })
loop()
| :? ScheduleMessageResult as result ->
let cmd = result.Command
match result.Result with
| Result.Ok _ -> sendAck mailbox cmd.Ack <| sprintf "Scheduled message for %s on %A" cmd.Id cmd.TriggerDateTime
| Result.Error exn ->
db.ClearUpdates() |> ignore
logErrorWithExnAckf mailbox exn cmd.Ack "Could not schedule message for %s" cmd.Id
sendNack mailbox cmd.Ack <| sprintf "Could not schedule message for %s" cmd.Id
loop()
| _ -> UnhandledMessage
}
loop ()
Как-то немного страшненько выглядит
Nikolay
Vagif
Vasily
Roman
Vladislav
Ayrat
Bonart
Klei
Крылатый
Aleksandr