Rumah >pembangunan bahagian belakang >Golang >GoESL lwn Temporal: Panggilan tidak berasal dari titik tertentu dalam FreeSWITCH
Saya sedang menyepadukan GoESL (https://www.php.cn/link/d9b64cee05c46d31b10b9869a3198a6d) dengan Temporal ke auto-dail melalui FreeSWITCH. Persediaan ini membenarkan 1,000 saluran serentak dan 50 panggilan sesaat (CPS). Setiap percubaan mendail memulakan aliran kerja sementara yang memulakan panggilan melalui aktiviti.
Selepas 96 panggilan berjaya (nombor pembolehubah), FreeSWITCH tidak mengendalikan panggilan lagi. Tiada log dalam CLI dan tiada peristiwa dalam lapisan soket acara untuk menunjukkan percubaan selanjutnya. Walau bagaimanapun, jika saya menghentikan Pekerja Sementara, panggilan "tersangkut" sebelum ini muncul dalam FreeSWITCH CLI yang menunjukkan bahawa ia telah dibariskan oleh pelanggan GoESL. Saya boleh mengesahkan bahawa pekerja itu tidak tersekat kerana ia terus melancarkan aliran kerja utama.
Berikut ialah coretan kod yang berkaitan:
Gelung Pemprosesan Plumbum:
for _, lead := range leadResult.Leads { // [omitted setup and checks] // Checking for channel availability and sleeping to respect CPS limits workflow.Await(ctx, func() bool { return dialerQueryResponse.AvailableChannels > 0 }) timeToSleep := time.Second / time.Duration(dialerQueryResponse.CallsPerSecondLimit) workflow.Sleep(ctx, timeToSleep) // Dialing the lead fmt.Printf("dialing lead %s\n", lead) dialLead(lead, selectedDialer.Id, callTimeout) fmt.Print("lead dialed\n\n") }
Logik panduan dial-up:
dialLead := func(lead string, selectedDialerId, dialerCallTimeout int) { // Setup child workflow context with unique ID cwo.WorkflowID = fmt.Sprintf("Campaign_Call_%s", lead) childCtx := workflow.WithChildOptions(ctx, cwo) // Struct to pass input to the child workflow input := domain.CallWorkflowInput{ Lead: lead, DialerId: selectedDialerId, CampaignName: cds.CampaignName, DialplanExtension: cc.Survey.DialplanExtension, CallTimeout: dialerCallTimeout, } // Executing the child workflow and handling its future future := workflow.ExecuteChildWorkflow(childCtx, CallWorkflow, input) var dialerId int selector.AddFuture(future, func(f workflow.Future) { err := f.Get(ctx, &dialerId) // Error handling and updating concurrency state // ... }) }
Fungsi aliran kerja panggilan:
func CallWorkflow(ctx workflow.Context, input domain.CallWorkflowInput) (int, error) { // [omitted setup] // Executing the originate call activity var dialLeadResult domain.DialLeadResponse if err := workflow.ExecuteActivity(ctx, activity.Dialer.OriginateCallActivity, dialInput).Get(ctx, &dialLeadResult); err != nil { // Error handling } // [omitted post-call handling] }
Laksanakan aktiviti permulaan panggilan mengikut urutan:
func (a *DialerActivities) OriginateCallActivity(ctx context.Context, input domain.DialLeadRequest) (domain.DialLeadResponse, error) { // [omitted client selection] // Command to originate the call cmd := fmt.Sprintf("originate {%s}%s/%s/%s 704 XML default test %s 10", variables, protocol, gateway, input.DestinationNumber, input.OriginatingNumber) err := selectedClient.BgApi(cmd) if err != nil { // Error handling } // [omitted response preparation] }}, nil }
Adakah sesiapa menghadapi isu yang sama menggunakan GoESL atau Temporal, di mana panggilan kelihatan beratur dan tidak dilaksanakan melepasi titik tertentu? Sebarang cadangan tentang cara untuk menyahpepijat keadaan ini atau mengapa membunuh utas pekerja sementara mungkin mencetuskan pengendalian panggilan beratur?
Apa yang saya cuba:
workflow.Sleep
tempoh dari beberapa milisaat hingga 5 - 10 saat untuk memastikan ia bukan kependaman rangkaian yang menyebabkan masalah. Atas ialah kandungan terperinci GoESL lwn Temporal: Panggilan tidak berasal dari titik tertentu dalam FreeSWITCH. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!