چند ماهی است که احمد یک وبسرویس پرداخت با نام بپرداز پیادهسازی کرده است. این وبسرویس اخیراً شاهد ترافیک سنگین درخواستها بوده است. احمد برای رفع این مشکل، تصمیم گرفت تا از چند سرور مختلف برای پردازش درخواستها استفاده کند. این سرورها با یکدیگر sync هستند؛ اما هماکنون برخی از آنها همچنان به دلیل ترافیک بالای درخواستها کند شدهاند. از آنجایی که احمد هنوز راهحل درستی برای این مسئله پیدا نکرده، میخواهد یک تغییر موقتی روی SDK ای که در اختیار توسعهدهندگان قرار داده است اعمال کند.
احمد میخواهد SDK جاوای وبسرویسش را طوری پیادهسازی کند که درخواست تأیید یک تراکنش بهصورت همزمان به همهی سرورهای موجود ارسال شود و به محض اولین پاسخی که از یکی از سرورها دریافت میشود، این پاسخ برگردانده شود. همچنین، او میخواهد قابلیت ست کردن timeout وجود داشته باشد تا اگر پس از $n$ واحد زمانی هیچ پاسخی دریافت نشد، برنامه یک 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
}
{
"sever_id": 2,
"status": true
}
{
"sever_id": 3,
"status": true
}
توجه: برنامهی شما نباید resource leak داشته باشد.
آنچه باید آپلود کنید
پس از پیادهسازی کلاس TransactionVerifier
، فایل TransactionVerifier.java
را آپلود کنید.
ارسال پاسخ برای این سؤال