menuTicketing

Bibliothèque Java / Kotlin Ticketing

GitHub

Cette bibliothèque regroupe deux API, Java et Kotlin, au sein d'une seule JVM. TicketBroker est l'API basée sur les coroutines Kotlin, tandis que BlockingTicketBroker est une façade bloquante adaptée à Java, utilisable sans coroutines (basée sur java.time.Duration). En interne, les deux enveloppent le même broker.

Dépôt

Java, Kotlinhome_and_garden
xml
kts

Exemple

Kotlin (Coroutines)

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

Exemple de concurrence (dépôts/retraits en exclusion mutuelle via un verrou par compte) :

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() // Automatic background release
    }
    val (action, sign) = if (delta < 0) "withdraw" to '-' else "deposit" to '+'
    log.info("account $account $action $sign\$$AMOUNT -> \$${balances[account]}")
}

Java (bloquant)

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");
}

Exemple de concurrence (verrou par compte, exécution simultanée sur plusieurs threads via un 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]);
}

Vous trouverez l'exemple complet dans ExampleSimpleTest.kt / ExampleBankTest.kt (Kotlin), ExampleSimpleJavaTest.java / ExampleBankJavaTest.java (Java).