menuTicketing
close





Ticketing Java / Kotlin লাইব্রেরি

GitHub

এই লাইব্রেরিতে একটিমাত্র JVM-এ Java এবং Kotlin উভয় API একসঙ্গে রাখা হয়েছে। 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)-তে দেখুন।