چند ماهی است که احمد یک وبسرویس پرداخت با نام بپرداز پیادهسازی کرده است. این وبسرویس اخیراً شاهد ترافیک سنگین درخواستها بوده است. احمد برای رفع این مشکل، تصمیم گرفت تا از چند سرور مختلف برای پردازش درخواستها استفاده کند. این سرورها با یکدیگر 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 را آپلود کنید.
ارسال پاسخ برای این سؤال