initial commit
This commit is contained in:
33
src/net/horizoncode/tickettest/TicketTest.java
Normal file
33
src/net/horizoncode/tickettest/TicketTest.java
Normal 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) {}
|
||||
}
|
||||
}
|
56
src/net/horizoncode/tickettest/manager/Ticket.java
Normal file
56
src/net/horizoncode/tickettest/manager/Ticket.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
76
src/net/horizoncode/tickettest/manager/TicketManager.java
Normal file
76
src/net/horizoncode/tickettest/manager/TicketManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user