initial commit

This commit is contained in:
2022-02-18 09:48:31 +01:00
commit 86fdcffec2
44 changed files with 748 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package net.horizoncode.tickettest;
import lombok.Getter;
import net.horizoncode.tickettest.manager.Ticket;
import net.horizoncode.tickettest.manager.TicketCallback;
import net.horizoncode.tickettest.manager.TicketManager;
import java.util.stream.IntStream;
public class TicketTest {
@Getter private final TicketManager ticketManager;
public static void main(String[] args) {
new TicketTest();
}
public TicketTest() {
this.ticketManager = TicketManager.builder().ticketLifespan(5000).maxTicketsExisting(2).build();
IntStream.range(0, 10)
.forEach(
(value) ->
getTicketManager()
.addTicket(
() -> {
System.out.println("i expired oof");
})
.use());
while (true) {}
}
}

View File

@@ -0,0 +1,56 @@
package net.horizoncode.tickettest.manager;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@Builder(
toBuilder = true,
builderClassName = "InternalTicketBuilder",
builderMethodName = "internalBuilder")
public class Ticket extends CompletableFuture<Boolean> {
@Getter private UUID ticketID;
@Getter private Long timeTicketCreated;
private TicketManager ticketManager;
@Getter @Setter private Runnable onExpire;
void init() {
ticketID = UUID.randomUUID();
}
public void use() {
ticketManager.getTicketSet().add(this);
ticketManager
.getService()
.submit(
() -> {
TimeUnit.MILLISECONDS.sleep(ticketManager.getTicketLifespan());
System.out.println("ticket with UUID: " + getTicketID() + " expired.");
ticketManager.getTicketSet().remove(this);
getOnExpire().run();
return null;
});
}
public static Ticket.Builder builder() {
return new Ticket.Builder();
}
public static class Builder extends InternalTicketBuilder {
Builder() {
super();
}
@Override
public Ticket build() {
Ticket ticket = super.build();
ticket.init();
return ticket;
}
}
}

View File

@@ -0,0 +1,8 @@
package net.horizoncode.tickettest.manager;
public class TicketCallback{
public Ticket call(Ticket ticket) {
System.out.println("Ticket " + ticket.getTicketID() + " expired.");
return ticket;
}
}

View File

@@ -0,0 +1,76 @@
package net.horizoncode.tickettest.manager;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import lombok.Builder;
import lombok.Getter;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Builder(
toBuilder = true,
builderClassName = "InternalTicketManagerBuilder",
builderMethodName = "internalBuilder")
@Getter
public class TicketManager {
private ListeningExecutorService service;
private Set<Ticket> ticketSet;
private int maxTicketsExisting;
private long ticketLifespan;
public Ticket addTicket(Runnable onExpire) {
ListenableFuture<Ticket> asyncTask =
service.submit(
() -> {
if (waitForFreeTicket())
System.out.println("max amount of tickets reached, waiting...");
while (waitForFreeTicket()) {
TimeUnit.MILLISECONDS.sleep(1);
}
Ticket t =
Ticket.builder().timeTicketCreated(ticketLifespan).onExpire(onExpire).ticketManager(this).build();
System.out.println("Got ticket with UUID: " + t.getTicketID());
return t;
});
try {
return asyncTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return null;
}
}
private boolean waitForFreeTicket() {
return ticketSet.size() >= maxTicketsExisting;
}
void init() {
service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ticketSet = new HashSet<>();
}
public static Builder builder() {
return new Builder();
}
public static class Builder extends InternalTicketManagerBuilder {
Builder() {
super();
}
@Override
public TicketManager build() {
TicketManager ticketManager = super.build();
ticketManager.init();
return ticketManager;
}
}
}