From 6576b5405746b6589e50e4ca0afe3df869496c33 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Sat, 22 Nov 2025 02:29:28 -0300 Subject: [PATCH] - Add `HeartbeatHandler` and enhance `EchoHandler` for Protocol Buffers support. - Extend `test.proto` schema with heartbeat and echo message definitions. - Register `HeartbeatHandler` in `DelegateActionManager`. - Refactor Log4j2 configuration to standardize log levels. - Optimize client wait time in `IPCManager` for reduced latency. --- .../delegate/DelegateActionManager.java | 2 ++ .../service/delegate/handler/EchoHandler.java | 34 ++++++++++++++---- .../delegate/handler/HeartbeatHandler.java | 36 +++++++++++++++++++ .../mediamanager/service/ipc/IPCManager.java | 2 +- src/main/proto/test.proto | 24 +++++++++++++ src/main/resources/log4j2.xml | 6 ++-- 6 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/mediamanager/service/delegate/handler/HeartbeatHandler.java create mode 100644 src/main/proto/test.proto diff --git a/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java b/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java index 6293947..1d2c0a6 100644 --- a/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java +++ b/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java @@ -3,6 +3,7 @@ package com.mediamanager.service.delegate; import com.google.protobuf.ByteString; import com.mediamanager.protocol.TransportProtocol; import com.mediamanager.service.delegate.handler.EchoHandler; +import com.mediamanager.service.delegate.handler.HeartbeatHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -23,6 +24,7 @@ public class DelegateActionManager { private void registerHandlers() { handlerRegistry.put("echo",new EchoHandler()); + handlerRegistry.put("heartbeat",new HeartbeatHandler()); } public void start(){ diff --git a/src/main/java/com/mediamanager/service/delegate/handler/EchoHandler.java b/src/main/java/com/mediamanager/service/delegate/handler/EchoHandler.java index 23463e6..4945efc 100644 --- a/src/main/java/com/mediamanager/service/delegate/handler/EchoHandler.java +++ b/src/main/java/com/mediamanager/service/delegate/handler/EchoHandler.java @@ -1,17 +1,39 @@ package com.mediamanager.service.delegate.handler; import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; +import com.mediamanager.protocol.TestProtocol.EchoCommand; // ← Import +import com.mediamanager.protocol.TestProtocol.EchoResponse; // ← Import import com.mediamanager.protocol.TransportProtocol; import com.mediamanager.service.delegate.ActionHandler; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class EchoHandler implements ActionHandler { - @Override - public TransportProtocol.Response.Builder handle(ByteString requestPayload) { - String payloadText = requestPayload.toStringUtf8(); - String responseText = "Server received: " + payloadText; + private static final Logger logger = LogManager.getLogger(EchoHandler.class); + @Override + public TransportProtocol.Response.Builder handle(ByteString requestPayload) + throws InvalidProtocolBufferException { // ← Pode lançar exceção + + // 1. Parse Protobuf bytes → EchoCommand + EchoCommand command = EchoCommand.parseFrom(requestPayload); + + logger.debug("Echo received: {}", command.getMessage()); + + // 2. Cria EchoResponse (Protobuf) + EchoResponse echoResponse = EchoResponse.newBuilder() + .setMessage(command.getMessage()) + .setServerTimestamp(System.currentTimeMillis()) + .build(); + + // 3. Serializa EchoResponse → bytes + ByteString responsePayload = ByteString.copyFrom(echoResponse.toByteArray()); + + // 4. Retorna Response return TransportProtocol.Response.newBuilder() - .setPayload(ByteString.copyFromUtf8(responseText)) - .setStatusCode(200); + .setPayload(responsePayload) + .setStatusCode(200) + .putHeaders("Content-Type", "application/x-protobuf"); } } diff --git a/src/main/java/com/mediamanager/service/delegate/handler/HeartbeatHandler.java b/src/main/java/com/mediamanager/service/delegate/handler/HeartbeatHandler.java new file mode 100644 index 0000000..c385433 --- /dev/null +++ b/src/main/java/com/mediamanager/service/delegate/handler/HeartbeatHandler.java @@ -0,0 +1,36 @@ +package com.mediamanager.service.delegate.handler; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; +import com.mediamanager.protocol.TestProtocol.HeartbeatCommand; +import com.mediamanager.protocol.TestProtocol.HeartbeatResponse; +import com.mediamanager.protocol.TransportProtocol; +import com.mediamanager.service.delegate.ActionHandler; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class HeartbeatHandler implements ActionHandler { + private static final Logger logger = LogManager.getLogger(HeartbeatHandler.class); + + @Override + public TransportProtocol.Response.Builder handle(ByteString requestPayload) + throws InvalidProtocolBufferException { + + HeartbeatCommand command = HeartbeatCommand.parseFrom(requestPayload); + + long serverTime = System.currentTimeMillis(); + + logger.debug("Heartbeat received. Client T1={}, Server T2={}", + command.getClientTimestamp(), serverTime); + + HeartbeatResponse response = HeartbeatResponse.newBuilder() + .setClientTimestamp(command.getClientTimestamp()) // Echo T1 + .setServerTimestamp(serverTime) // T2 + .build(); + + return TransportProtocol.Response.newBuilder() + .setPayload(ByteString.copyFrom(response.toByteArray())) + .setStatusCode(200) + .putHeaders("Content-Type", "application/x-protobuf"); + } +} \ No newline at end of file diff --git a/src/main/java/com/mediamanager/service/ipc/IPCManager.java b/src/main/java/com/mediamanager/service/ipc/IPCManager.java index 17ff8b1..00ed070 100644 --- a/src/main/java/com/mediamanager/service/ipc/IPCManager.java +++ b/src/main/java/com/mediamanager/service/ipc/IPCManager.java @@ -185,7 +185,7 @@ public class IPCManager { // Nenhum cliente conectado no momento // Dorme por um curto período antes de verificar novamente // Isso evita consumir CPU desnecessariamente em um loop vazio - Thread.sleep(100); // 100 milissegundos + Thread.sleep(1); // 1 milissegundos } } catch (InterruptedException e) { diff --git a/src/main/proto/test.proto b/src/main/proto/test.proto new file mode 100644 index 0000000..ea4bf62 --- /dev/null +++ b/src/main/proto/test.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +option java_package = "com.mediamanager.protocol"; +option java_outer_classname = "TestProtocol"; + +package mediamanager.test; + +message EchoCommand { + string message = 1; +} + +message EchoResponse { + string message = 1; + int64 server_timestamp = 2; +} + +message HeartbeatCommand { + int64 client_timestamp = 1; +} + +message HeartbeatResponse { + int64 client_timestamp = 1; + int64 server_timestamp = 2; +} \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 39be1a8..a9f3f84 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -18,17 +18,17 @@ - + - + - +