Skip to content

Commit 2ec985d

Browse files
committed
lab5_v2 better solution
1 parent 5771ebb commit 2ec985d

File tree

14 files changed

+101
-111
lines changed

14 files changed

+101
-111
lines changed

programming/sem2/lab5_v2/src/main/java/server/ServerCycle.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
package server;
22

33
import server.core.Engine;
4+
import server.network.drivers.implementations.UDPDriver;
5+
import server.network.serializers.implementations.BinarySerializer;
6+
import server.storage.collection.drivers.implementations.DequeDriver;
7+
8+
import java.util.concurrent.Executors;
49

510
public class ServerCycle implements Runnable {
611
public void run(){
7-
Engine engine = new Engine();
12+
Engine engine = new Engine(
13+
new UDPDriver(4056),
14+
Executors.newFixedThreadPool(1),
15+
Executors.newFixedThreadPool(1),
16+
Executors.newFixedThreadPool(3),
17+
new BinarySerializer(),
18+
new DequeDriver()
19+
);
820
while (true){
921
engine.mainCycle();
1022
}

programming/sem2/lab5_v2/src/main/java/server/core/CommandFactory.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package server.core;
22

3+
import java.net.SocketAddress;
34
import java.util.HashMap;
5+
import java.util.concurrent.CompletableFuture;
46
import java.util.concurrent.ExecutorService;
57
import java.util.function.Function;
68

9+
import server.network.container.NetworkContainer;
710
import server.storage.collection.drivers.IStructDriver;
811
import server.storage.commands.CommandsManager;
912

@@ -18,17 +21,17 @@ public CommandFactory(ExecutorService executor, IStructDriver structDriver) {
1821
this.executor = executor;
1922
}
2023

21-
public <T> void runCommand(
24+
public CompletableFuture<NetworkContainer<HashMap<String,String>>> runCommand(
2225
String opName,
2326
HashMap<String, String> args,
24-
Function<HashMap<String,String>, T> nextStage
27+
SocketAddress socketAddress
2528
) {
26-
commandsManager.run(
29+
return commandsManager.run(
2730
opName,
2831
args,
2932
this.executor
3033
).thenApply(
31-
nextStage
34+
res -> new NetworkContainer<>(socketAddress, res)
3235
);
3336
}
3437
}

programming/sem2/lab5_v2/src/main/java/server/core/Engine.java

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,67 @@
11
package server.core;
22

3-
import java.util.Queue;
4-
import java.util.concurrent.ConcurrentLinkedQueue;
5-
import java.util.concurrent.Executors;
3+
import java.util.concurrent.ExecutorService;
64

75
import server.network.container.NetworkContainer;
8-
import server.network.NetworkCycle;
9-
import server.network.drivers.implementations.UDPDriver;
10-
import server.network.serializers.implementations.BinarySerializer;
11-
import server.storage.collection.drivers.implementations.DequeDriver;
12-
import shared.objects.NetworkRequestDTO;
6+
import server.network.drivers.INetworkDriver;
7+
import server.network.managers.ReceiveManager;
8+
import server.network.managers.SendManager;
9+
import server.network.serializers.INetworkSerializers;
10+
import server.storage.collection.drivers.IStructDriver;
1311
import shared.objects.NetworkResponseDTO;
1412

1513
public class Engine {
16-
private final Queue<NetworkContainer<NetworkRequestDTO>> networkReceived = new ConcurrentLinkedQueue<>();
17-
private final Queue<NetworkContainer<NetworkResponseDTO>> networkToSend = new ConcurrentLinkedQueue<>();
14+
private final ReceiveManager receiveManager;
15+
public final SendManager sendManager;
16+
private final CommandFactory commandFactory;
1817

19-
private final CommandFactory commandFactory = new CommandFactory(
20-
Executors.newFixedThreadPool(10),
21-
new DequeDriver()
22-
);
18+
public Engine(
19+
INetworkDriver networkDriver,
20+
ExecutorService receiveExecutor,
21+
ExecutorService sendExecutor,
22+
ExecutorService commandExecutor,
23+
INetworkSerializers networkSerializer,
24+
IStructDriver structDriver
25+
) {
26+
try {
27+
networkDriver.init();
28+
} catch (Exception e) {}
2329

24-
public Engine(){
25-
Thread networkThread = new Thread(
26-
new NetworkCycle(
27-
new UDPDriver(4056),
28-
new BinarySerializer(),
29-
this.networkReceived,
30-
this.networkToSend
31-
)
30+
this.receiveManager = new ReceiveManager(
31+
networkDriver,
32+
networkSerializer,
33+
receiveExecutor
34+
);
35+
this.sendManager = new SendManager(
36+
networkDriver,
37+
networkSerializer,
38+
sendExecutor
39+
);
40+
this.commandFactory = new CommandFactory(
41+
commandExecutor,
42+
structDriver
3243
);
33-
networkThread.start();
3444
}
3545

36-
public void mainCycle(){
37-
try{
38-
if (!networkReceived.isEmpty()){
39-
System.out.println("Received from get");
40-
NetworkContainer<NetworkRequestDTO> networkRequestDTO = networkReceived.remove();
41-
System.out.println(networkRequestDTO);
42-
43-
commandFactory.runCommand(
44-
networkRequestDTO.data().opName(),
45-
networkRequestDTO.data().args(),
46-
res->{
47-
System.out.println("fapl: " + res.toString());
48-
return networkToSend.add(
46+
public void mainCycle() {
47+
try {
48+
receiveManager.call()
49+
.thenCompose(
50+
networkRequestDTO -> commandFactory.runCommand(
51+
networkRequestDTO.data().opName(),
52+
networkRequestDTO.data().args(),
53+
networkRequestDTO.socketAddress()
54+
)
55+
)
56+
.thenCompose(
57+
result -> sendManager.call(
4958
new NetworkContainer<>(
50-
networkRequestDTO.socketAddress(),
51-
new NetworkResponseDTO(res)
59+
result.socketAddress(),
60+
new NetworkResponseDTO(result.data())
5261
)
53-
);
54-
}
55-
);
56-
57-
}
58-
}
59-
catch (Exception e){
62+
)
63+
);
64+
} catch (Exception e) {
6065
System.out.println("eng " + e.getMessage());
6166
}
6267
}

programming/sem2/lab5_v2/src/main/java/server/network/NetworkCycle.java

Lines changed: 0 additions & 38 deletions
This file was deleted.

programming/sem2/lab5_v2/src/main/java/server/network/managers/ReceiveManager.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import shared.objects.NetworkRequestDTO;
77

88
import java.io.IOException;
9+
import java.util.HashMap;
910
import java.util.Queue;
11+
import java.util.concurrent.CompletableFuture;
1012
import java.util.concurrent.ExecutorService;
1113
import java.util.concurrent.Executors;
1214

@@ -15,24 +17,34 @@ public class ReceiveManager {
1517
INetworkSerializers serializer;
1618
ExecutorService executor;
1719

18-
public ReceiveManager(INetworkDriver driver, INetworkSerializers serializer) {
20+
public ReceiveManager(INetworkDriver driver, INetworkSerializers serializer, ExecutorService executor) {
1921
this.driver = driver;
2022
this.serializer = serializer;
21-
this.executor = Executors.newFixedThreadPool(1);
23+
this.executor = executor;
2224
}
2325

24-
public void call(Queue<NetworkContainer<NetworkRequestDTO>> inpQueue) throws IOException, ClassNotFoundException{
25-
try {
26-
NetworkContainer<byte[]> nc = this.driver.receive();
27-
inpQueue.add(
28-
new NetworkContainer<>(
29-
nc.socketAddress(),
30-
this.serializer.deserialize(
31-
nc.data()
32-
)
33-
)
34-
);
35-
}
36-
catch (Exception e){}
26+
public CompletableFuture<NetworkContainer<NetworkRequestDTO>> call() throws IOException, ClassNotFoundException{
27+
return CompletableFuture.supplyAsync(() -> {
28+
try {
29+
return this.driver.receive();
30+
} catch (IOException e) {
31+
throw new RuntimeException(e);
32+
}
33+
}).thenApply(
34+
res -> {
35+
try {
36+
return new NetworkContainer<>(
37+
res.socketAddress(),
38+
this.serializer.deserialize(
39+
res.data()
40+
)
41+
);
42+
} catch (IOException e) {
43+
throw new RuntimeException(e);
44+
} catch (ClassNotFoundException e) {
45+
throw new RuntimeException(e);
46+
}
47+
}
48+
);
3749
}
3850
}

programming/sem2/lab5_v2/src/main/java/server/network/managers/SendManager.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import server.network.container.NetworkContainer;
44
import server.network.drivers.INetworkDriver;
55
import server.network.serializers.INetworkSerializers;
6-
import shared.objects.NetworkRequestDTO;
76
import shared.objects.NetworkResponseDTO;
87

98
import java.io.IOException;
@@ -17,17 +16,14 @@ public class SendManager {
1716
INetworkSerializers serializer;
1817
ExecutorService executor;
1918

20-
public SendManager(INetworkDriver driver, INetworkSerializers serializer) {
19+
public SendManager(INetworkDriver driver, INetworkSerializers serializer, ExecutorService executor) {
2120
this.driver = driver;
2221
this.serializer = serializer;
23-
this.executor = Executors.newFixedThreadPool(1);
22+
this.executor = executor;
2423
}
2524

26-
public void call(Queue<NetworkContainer<NetworkResponseDTO>> outQueue) throws Exception{
27-
NetworkContainer<NetworkResponseDTO> elem = outQueue.poll();
28-
if(elem == null){return;}
29-
30-
CompletableFuture.supplyAsync(
25+
public CompletableFuture<Void> call(NetworkContainer<NetworkResponseDTO> elem){
26+
return CompletableFuture.supplyAsync(
3127
() -> {
3228
try {
3329
return this.serializer.serialize(
649 Bytes
Binary file not shown.
Binary file not shown.
290 Bytes
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)