2

F# mailBoxProcessor を使用して、複数のネットワーク エンドから受信したメッセージを非同期的に処理しています。

inbox.receive() の後に関数呼び出し getTreasuryYield を追加するまで、コードは期待どおりに機能します。

数秒間実行した後、毎回 inbox.receive() でスタックします。

GetTreasuryYield は、データベースと IO 操作を伴うため、非常に遅いメソッドですが、私は

それがどのようにスタックするかはまだわかりません。

どんなヘルプでも大歓迎です。

let start rvSetting (agent:Agent<Message>) messageSelector=
    try
        TIBCO.Rendezvous.Environment.Open()
        let _transport = new NetTransport(rvSetting.rvService, rvSetting.rvNetwork, rvSetting.rvDaemon)
        let _listener = new Listener(TIBCO.Rendezvous.Queue.Default, _transport, rvSetting.rvSubject, null)
        _listener.MessageReceived.Add(fun args->
            printfn "before sent"
            if messageSelector(args.Message) then 
                printfn "Message sent to agent: %A" args.Message
                agent.Post(args.Message))
        let rec dispatch() =
            async{
                try
                   TIBCO.Rendezvous.Queue.Default.Dispatch()
                    return! dispatch()
                with
                    | e -> _log.Error(e.ToString())   
           }
        Async.Start(dispatch())
    with
        |e -> printfn "%A" e.Message
              _log.Error(e.Message)
 let agent = new Agent<Message>(fun inbox ->
    let rec loop() =
        async{
            let! (m : Message) = inbox.Receive()
            // This line causes the problem
            printfn "%A" (getTreasuryYieldFromMessage m)
            Async.Start(treasuryAction m)
            return! loop()    
        }  
    loop())
agent.Error.Add raise
[<EntryPoint>]
let main argv =
    //start rvCorporate agent (fun x -> true)
    agent.Start()
start rvTreasury agent treasurySelector
    Console.ReadLine() |> ignore
    0
4

0 に答える 0