لینک‌های مفید برای شرکت در مسابقه:

در طول مسابقه، می‌توانید سوال‌های خود را از قسمت «سؤال بپرسید» مطرح کنید.

تأیید هم‌روند


چند ماهی است که احمد یک وب‌سرویس پرداخت با نام بپرداز پیاده‌سازی کرده است. این وب‌سرویس اخیراً شاهد ترافیک سنگین درخواست‌ها بوده است. احمد برای رفع این مشکل، تصمیم گرفت تا از چند سرور مختلف برای پردازش درخواست‌ها استفاده کند. این سرورها با یکدیگر sync هستند؛ اما هم‌اکنون برخی از آن‌ها هم‌چنان به دلیل ترافیک بالای درخواست‌ها کند شده‌اند. از آن‌جایی که احمد هنوز راه‌حل درستی برای این مسئله پیدا نکرده، می‌خواهد یک تغییر موقتی روی SDK ای که در اختیار توسعه‌دهندگان قرار داده است اعمال کند.

احمد می‌خواهد SDK جاوای وب‌سرویسش را طوری پیاده‌سازی کند که درخواست تأیید یک تراکنش به‌صورت هم‌زمان به همه‌ی سرورهای موجود ارسال شود و به محض اولین پاسخی که از یکی از سرورها دریافت می‌شود، این پاسخ برگردانده شود. هم‌چنین، او می‌خواهد قابلیت ست کردن timeout وجود داشته باشد تا اگر پس از nn واحد زمانی هیچ پاسخی دریافت نشد، برنامه یک Exception پرتاب کند.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید.

کلاس TransactionVerifier🔗

این کلاس در کانستراکتور خود لیستی از URLهای مربوط به درخواست تأیید تراکنش را دریافت می‌کند.

  • بدنه‌ی کانستراکتور را به‌گونه‌ای تغییر دهید که اگر لیست URLها خالی بود، یک IllegalArgumentException پرتاب شود.
  • متد setTimeout را طوری پیاده‌سازی کنید که با دریافت یک واحد زمانی از نوع Duration، حداکثر زمان انتظار برای دریافت پاسخ را مشخص کند. هم‌چنین، مقدار پیش‌فرض timeout را برابر با ۳ ثانیه قرار دهید.
  • متد verify را طوری پیاده‌سازی کنید که با دریافت شناسه‌ی یک تراکنش (که از نوع String است)، درخواست تأیید تراکنش را به‌صورت هم‌روند به همه‌ی آدرس‌ها ارسال کند و به محض دریافت اولین پاسخ، آن را در قالب یک رشته برگرداند. این متد باید حداکثر به اندازه‌ی timeout ست شده منتظر پاسخ بماند. اگر timeout رخ دهد، این متد باید یک TimeoutException پرتاب کند. درخواست‌ها باید از نوع POST باشند و مقدار پارامتر transaction_id باید برابر با شناسه‌ی تراکنش قرار داده شود. بدنه‌ی درخواست باید از نوع JSON باشد.
  • متد getFastestServer را طوری پیاده‌سازی کنید که URL سروری که تاکنون بیش‌ترین پاسخ‌ها از آن دریافت شده است را برگرداند. اگر تعداد دفعات دریافت زودترین پاسخ از چند سرور یکسان بود، URL یکی از آن‌ها را به دلخواه برگردانید.

مثال🔗

با اجرای متد main، یکی از سه خروجی زیر مورد انتظار است:

{
    "sever_id": 1,
    "status": true
}
JSON
{
    "sever_id": 2,
    "status": true
}
JSON
{
    "sever_id": 3,
    "status": true
}
JSON

توجه: برنامه‌ی شما نباید resource leak داشته باشد.

آن‌چه باید آپلود کنید🔗

پس از پیاده‌سازی کلاس TransactionVerifier، فایل TransactionVerifier.java را آپلود کنید.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.