adjast wss + docker logs
This commit is contained in:
@@ -1,27 +1,26 @@
|
||||
package com.jambotronGroup.jambotron.WebSocket;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocket;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
|
||||
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
|
||||
import org.springframework.web.socket.config.annotation.*;
|
||||
|
||||
@Configuration
|
||||
@EnableWebSocket
|
||||
public class WebSocketConfig implements WebSocketConfigurer {
|
||||
@EnableWebSocketMessageBroker
|
||||
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
|
||||
|
||||
private final DockerLogsHandler dockerLogsHandler;
|
||||
|
||||
public WebSocketConfig(DockerLogsHandler dockerLogsHandler) {
|
||||
this.dockerLogsHandler = dockerLogsHandler;
|
||||
@Override
|
||||
public void configureMessageBroker(MessageBrokerRegistry config) {
|
||||
// Брокер для сообщений клиенту
|
||||
config.enableSimpleBroker("/topic");
|
||||
// Префикс для запросов от клиента к серверу
|
||||
config.setApplicationDestinationPrefixes("/app");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
|
||||
registry.addHandler(dockerLogsHandler, "/api/ws-jambotron/{projectId}")
|
||||
// Поскольку есть proxy.conf.json, запросы приходят как Same-Origin.
|
||||
// Но для стабильности разработки лучше явно указать localhost.
|
||||
public void registerStompEndpoints(StompEndpointRegistry registry) {
|
||||
registry.addEndpoint("/api/ws-jambotron")
|
||||
.setAllowedOriginPatterns("https://*.jambotron.com", "https://jambotron.com")
|
||||
|
||||
.setAllowedOrigins("http://localhost:8082", "http://localhost:4200");
|
||||
.setAllowedOrigins("http://localhost:8082", "http://localhost:4200")
|
||||
.withSockJS(); // Для стабильности соединения
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.jambotronGroup.jambotron.console;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
|
||||
@Configuration
|
||||
@EnableAsync // <--- Обязательно добавь это
|
||||
public class AsyncConfig {
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.jambotronGroup.jambotron.console;
|
||||
|
||||
import com.github.dockerjava.api.DockerClient;
|
||||
import com.github.dockerjava.api.async.ResultCallback;
|
||||
import com.github.dockerjava.api.model.Frame;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class DockerLogService {
|
||||
|
||||
private final SimpMessagingTemplate messagingTemplate;
|
||||
private final DockerClient dockerClient;
|
||||
|
||||
// Spring сам подставит сюда dockerClient из твоего DockerConfig
|
||||
public DockerLogService(SimpMessagingTemplate messagingTemplate, DockerClient dockerClient) {
|
||||
this.messagingTemplate = messagingTemplate;
|
||||
this.dockerClient = dockerClient;
|
||||
}
|
||||
|
||||
@Async
|
||||
public void streamLogs(String containerId) {
|
||||
dockerClient.logContainerCmd(containerId)
|
||||
.withStdOut(true)
|
||||
.withStdErr(true)
|
||||
.withFollowStream(true)
|
||||
.withTail(100)
|
||||
.exec(new ResultCallback.Adapter<Frame>() {
|
||||
@Override
|
||||
public void onNext(Frame frame) {
|
||||
String logLine = new String(frame.getPayload());
|
||||
// Отправляем в топик, на который подпишется фронтенд
|
||||
messagingTemplate.convertAndSend("/topic/logs/" + containerId, logLine);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.jambotronGroup.jambotron.controllers;
|
||||
|
||||
import com.jambotronGroup.jambotron.console.DockerLogService;
|
||||
import org.springframework.messaging.handler.annotation.MessageMapping;
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
@Controller
|
||||
public class LogController {
|
||||
|
||||
private final DockerLogService dockerLogService;
|
||||
|
||||
public LogController(DockerLogService dockerLogService) {
|
||||
this.dockerLogService = dockerLogService;
|
||||
}
|
||||
|
||||
// Когда клиент шлет сообщение на /app/start-logs
|
||||
@MessageMapping("/start-logs")
|
||||
public void handleStartLogs(String containerId) {
|
||||
dockerLogService.streamLogs(containerId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user