【问题标题】:EasyNetQ Wait for event from ISubscriptionResultEasyNetQ 等待来自 ISubscriptionResult 的事件
【发布时间】:2019-07-02 11:04:19
【问题描述】:

我正在使用 EasyNetQ 使用 f# 管理我的 RabbitMq 消息总线,它非常简单,这个发布消息:

let HandleBusResponse (data:BaseFrame) (bus:IBus) : ISubscriptionResult = 
    let handler = Action<RequestMessage>(fun request ->
        let cabinetSubscribeId = sprintf "Project.%i" request.ProjectId
            match request.FrameType with 
                  | FrameType.UNDEFINED -> 
                    let response = ResponseService.BusRequestFactory request data
                  | _ -> 
                    let response = ResponseService.BusRequestFactory request data 
    bus.Publish<ResponseMessage>(response, cabinetSubscribeId))

并且此方法(订阅者)在应用程序中的某处被调用,例如:

HandleBusResponse data bus
//WAIT FOR MESSAGE ARRIVAL
informationPools.AddToConnectionPool(data.ProjectId, client) |> ignore 
ClientInfoHandler client data |> Async.RunSynchronously|> ignore 

与在 c# 中的工作方式基本相同。

现在这段代码超出了订阅者处理程序,我的问题是是否可以从这部分检测到

//等待消息到达

如果有新的东西到达,使用某种 while(记住第二个代码 sn-p 在订阅处理程序之外)?

【问题讨论】:

    标签: c# f# rabbitmq easynetq


    【解决方案1】:

    如果您可以发布一个在 F# Interactive 中编译和工作的完整最小示例,那么直接为您的问题实现解决方案会更容易。但是,一种通常应该有效的解决方案是等待事件。在 F# 中,您可以像这样创建事件:

    let requestArrived = Event<RequestMessage>()
    let responsePublished = Event<ResponseMessage>()
    

    然后,您可以异步等待这些事件并处理它们产生的数据:

    let rec messageLoop<'message> f (event: IEvent<'message>) = 
        async {
            let! message = event |> Async.AwaitEvent 
            message |> f
            return! messageLoop f event
        }
    

    因此,在您的 // WAIT FOR MESSAGE ARRIVAL 块中,您可以执行类似的操作(取决于您是要处理请求还是响应,或者您要对它们做什么:

    requestArrived.Publish |> messageLoop (fun request -> printfn "Received Request: %A" request)
    // AND/OR
    responsePublished.Publish |> messageLoop (fun response -> printfn "Sent Response: %A" response)
    

    然后,您可以更新您的处理程序以根据需要触发事件:

        let handler = Action<RequestMessage>(fun request ->        
            requestArrived.Trigger(request)
            let cabinetSubscribeId = sprintf "Project.%i" request.ProjectId
            let response = 
                match request.FrameType with 
                | FrameType.UNDEFINED -> 
                    ResponseService.BusRequestFactory request data
                | _ -> 
                    ResponseService.BusRequestFactory request data 
            bus.Publish<ResponseMessage>(response, cabinetSubscribeId)
            responsePublished.Trigger(response))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多