menuTicketing

Ticketing Java / Kotlin لائبریری

GitHub

یہ لائبریری ایک ہی JVM میں Java اور Kotlin دونوں کے APIs ساتھ رکھتی ہے۔ TicketBroker Kotlin کوروٹین پر مبنی API ہے، جبکہ BlockingTicketBroker کوروٹین کے بغیر استعمال ہونے والا Java دوستانہ بلاکنگ فاساد (java.time.Duration پر مبنی) ہے۔ اندرونی طور پر دونوں ایک ہی بروکر کو لپیٹتے ہیں۔

ریپوزیٹری

Java, Kotlinhome_and_garden
xml
kts

مثال

Kotlin (کوروٹین)

kotlin
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()

ہم آہنگی کی مثال (اکاؤنٹ کے حساب سے لاک کے ذریعے جمع/نکاسی کا باہمی اخراج):

kotlin
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]}")
}

Java (بلاکنگ)

java
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 کے ذریعے متعدد تھریڈز میں بیک وقت اجرا):

java
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) میں ملاحظہ کریں۔