یہ لائبریری ایک ہی JVM میں Java اور Kotlin دونوں کے APIs ساتھ رکھتی ہے۔ TicketBroker Kotlin کوروٹین پر مبنی API ہے، جبکہ BlockingTicketBroker کوروٹین کے بغیر استعمال ہونے والا Java دوستانہ بلاکنگ فاساد (java.time.Duration پر مبنی) ہے۔ اندرونی طور پر دونوں ایک ہی بروکر کو لپیٹتے ہیں۔
val broker = TicketBroker.connect("127.0.0.1:5225")
broker.waitReady(5.seconds)
val ticket = broker.acquire("key", 5.seconds, 30.seconds)
ticket.release()
broker.close()ہم آہنگی کی مثال (اکاؤنٹ کے حساب سے لاک کے ذریعے جمع/نکاسی کا باہمی اخراج):
suspend fun transaction(broker: TicketBroker, account: Int, delta: Long) {
val key = "account-$account"
val ticket = try {
broker.acquire(key, wait, lease)
} catch (e: Exception) {
log.error("account {} acquire failed: {}", account, e.message)
return
}
try {
val before = balances[account]
yield()
balances[account] = before + delta
} finally {
ticket.close() // بیک گراؤنڈ میں خود بخود واپسی
}
val (action, sign) = if (delta < 0) "withdraw" to '-' else "deposit" to '+'
log.info("account $account $action $sign\$$AMOUNT -> \$${balances[account]}")
}try (BlockingTicketBroker broker = BlockingTicketBroker.connect(List.of("127.0.0.1:5225"))) {
broker.waitReady(Duration.ofSeconds(5));
BlockingTicket ticket = broker.acquire("key", Duration.ofSeconds(5), Duration.ofSeconds(30));
ticket.release();
System.out.println("pass");
}ہم آہنگی کی مثال (اکاؤنٹ کے حساب سے لاک، ExecutorService کے ذریعے متعدد تھریڈز میں بیک وقت اجرا):
void transaction(BlockingTicketBroker broker, int account, long delta) {
String key = "account-" + account;
try (BlockingTicket ticket = broker.acquire(key, WAIT, LEASE)) {
long before = balances[account];
Thread.yield();
balances[account] = before + delta;
}
String action = delta < 0 ? "withdraw" : "deposit";
char sign = delta < 0 ? '-' : '+';
log.info("account {} {} {}${} -> ${}", account, action, sign, AMOUNT, balances[account]);
}مکمل مثال ExampleSimpleTest.kt / ExampleBankTest.kt (Kotlin), ExampleSimpleJavaTest.java / ExampleBankJavaTest.java (Java) میں ملاحظہ کریں۔