dagarcos 1 місяць тому
батько
коміт
7eb5bfcad4

+ 1 - 1
GUI/index.html

@@ -133,7 +133,7 @@
 </div>
 
 <script>
-    const WORLD_API = "http://localhost:8080/world";
+    const WORLD_API = "http://localhost:8020/world";
     const ACTIONS = ["EXPLORE", "GATHER", "FIGHT", "REST"];
 
     let autoTimer = null;

+ 2 - 0
src/main/java/es/uv/dagarcos/shard/core/ShardCoreApplication.java

@@ -3,9 +3,11 @@ package es.uv.dagarcos.shard.core;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @EnableFeignClients
+@EnableScheduling
 public class ShardCoreApplication {
 
 	public static void main(String[] args) {

+ 21 - 0
src/main/java/es/uv/dagarcos/shard/core/client/MasterClient.java

@@ -5,6 +5,8 @@ import org.springframework.stereotype.Component;
 
 import org.springframework.web.client.RestTemplate;
 
+import es.uv.dagarcos.shard.core.dto.MasterEventRequest;
+
 @Component
 public class MasterClient {
 
@@ -12,6 +14,8 @@ public class MasterClient {
 
     @Value("${master.url}")
     private String masterUrl;
+    @Value("${shard.id}")
+    private String shardId;
 
     public void registerShard(String shardId) {
         restTemplate.postForEntity(
@@ -20,6 +24,23 @@ public class MasterClient {
                 Void.class
         );
     }
+
+    public void sendEvent(MasterEventRequest request) {
+        restTemplate.postForEntity(
+                masterUrl + "/master/events",
+                request,
+                Void.class
+        );
+    }
+
+    public void sendHeartbeat() {
+        restTemplate.postForEntity(
+                masterUrl + "/master/shards/" + shardId + "/heartbeat",
+                null,
+                Void.class
+        );
+    }
+
 }
 
 

+ 79 - 0
src/main/java/es/uv/dagarcos/shard/core/dto/MasterEventRequest.java

@@ -0,0 +1,79 @@
+package es.uv.dagarcos.shard.core.dto;
+
+import java.time.Instant;
+
+public class MasterEventRequest {
+
+    private String shardId;
+    private String playerId;
+    private Instant timestamp;
+    private String eventType;
+    private String action;
+    private Integer pointsDelta;
+    private Boolean winner;
+    private String payload;
+
+    public MasterEventRequest(){}
+
+    public MasterEventRequest(String shardId, String playerId, Instant timestamp, String eventType, String action,
+            Integer pointsDelta, Boolean winner, String payload) {
+        this.shardId = shardId;
+        this.playerId = playerId;
+        this.timestamp = timestamp;
+        this.eventType = eventType;
+        this.action = action;
+        this.pointsDelta = pointsDelta;
+        this.winner = winner;
+        this.payload = payload;
+    }
+    public String getShardId() {
+        return shardId;
+    }
+    public void setShardId(String shardId) {
+        this.shardId = shardId;
+    }
+    public String getPlayerId() {
+        return playerId;
+    }
+    public void setPlayerId(String playerId) {
+        this.playerId = playerId;
+    }
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+    public void setTimestamp(Instant timestamp) {
+        this.timestamp = timestamp;
+    }
+    public String getEventType() {
+        return eventType;
+    }
+    public void setEventType(String eventType) {
+        this.eventType = eventType;
+    }
+    public String getAction() {
+        return action;
+    }
+    public void setAction(String action) {
+        this.action = action;
+    }
+    public Integer getPointsDelta() {
+        return pointsDelta;
+    }
+    public void setPointsDelta(Integer pointsDelta) {
+        this.pointsDelta = pointsDelta;
+    }
+    public Boolean getWinner() {
+        return winner;
+    }
+    public void setWinner(Boolean winner) {
+        this.winner = winner;
+    }
+    public String getPayload() {
+        return payload;
+    }
+    public void setPayload(String payload) {
+        this.payload = payload;
+    }
+
+    
+}

+ 18 - 0
src/main/java/es/uv/dagarcos/shard/core/scheduler/ShardHeartbeatScheduler.java

@@ -0,0 +1,18 @@
+package es.uv.dagarcos.shard.core.scheduler;
+
+import es.uv.dagarcos.shard.core.client.MasterClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ShardHeartbeatScheduler {
+
+    @Autowired
+    private MasterClient masterClient;
+
+    @Scheduled(fixedRateString = "${shard.heartbeat.interval:60000}")
+    public void sendHeartbeat() {
+        masterClient.sendHeartbeat();
+    }
+}

+ 21 - 0
src/main/java/es/uv/dagarcos/shard/core/service/WorldActionService.java

@@ -1,11 +1,14 @@
 package es.uv.dagarcos.shard.core.service;
 
+import es.uv.dagarcos.shard.core.client.MasterClient;
 import es.uv.dagarcos.shard.core.client.PersistenceClient;
 import es.uv.dagarcos.shard.core.domain.ActionResult;
 import es.uv.dagarcos.shard.core.domain.PlayerAction;
+import es.uv.dagarcos.shard.core.dto.MasterEventRequest;
 import es.uv.dagarcos.shard.core.dto.WorldEventRequest;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.Instant;
@@ -17,6 +20,10 @@ public class WorldActionService {
     
     @Autowired
     private PersistenceClient persistenceClient;
+    @Autowired
+    private MasterClient masterClient;
+    @Value("${shard.id}")
+    private String shardId;
 
     public ActionResult processAction(PlayerAction action) {
 
@@ -51,6 +58,20 @@ public class WorldActionService {
 
         persistenceClient.saveEvent(event);
 
+        /* Reenviamos el evento a master */
+        MasterEventRequest masterEvent = new MasterEventRequest();
+        masterEvent.setShardId(shardId); 
+        masterEvent.setPlayerId(event.getPlayerId());
+        masterEvent.setTimestamp(event.getTimestamp());
+        masterEvent.setEventType(event.getEventType());
+        masterEvent.setAction(action.getAction());
+        masterEvent.setPointsDelta(event.getPointsDelta());
+        masterEvent.setWinner(event.getWinner());
+        masterEvent.setPayload(event.getPayload().toString());
+
+        masterClient.sendEvent(masterEvent);
+
+
         return new ActionResult(
                 action.getPlayerId(),
                 action.getAction(),

+ 5 - 0
src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -13,5 +13,10 @@
     "name": "master.url",
     "type": "java.lang.String",
     "description": "Dirección y puerto del servidor Master"
+  },
+  {
+    "name": "shard.heartbeat.interval",
+    "type": "java.lang.String",
+    "description": "Intervalo en el que se enviará la señal de ping a master"
   }
 ]}

+ 4 - 3
src/main/resources/application.properties

@@ -1,7 +1,8 @@
-server.port=8081
+server.port=8020
 spring.application.name=shard-core
 spring.cloud.discovery.enabled=false
 
-shard.persistence.url=http://localhost:8090
+shard.persistence.url=http://localhost:8021
 shard.id=shard-01
-master.url=http://localhost:8080
+shard.heartbeat.interval=60000
+master.url=http://localhost:8010