code_runner/cmd/push_service.go
2025-06-20 15:11:48 +03:00

138 lines
3.1 KiB
Go

package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"github.com/streadway/amqp"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // Allow all origins (for development). In production, specify allowed origins.
},
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
type Code struct {
IDTask string `json:"id_task"`
TpRunner string `json:"tp_runner"`
Code string `json:"code"`
Test string `json:"test"`
}
// Define RabbitMQ server URL.
amqpServerURL := os.Getenv("AMQP_SERVER_URL")
if amqpServerURL == "" {
amqpServerURL = "amqp://guest:guest@localhost:5672/" // Default URL if not set
}
// Create a new RabbitMQ connection.
connectRabbitMQ, err := amqp.Dial(amqpServerURL)
if err != nil {
panic(err)
}
defer connectRabbitMQ.Close()
// Opening a channel to our RabbitMQ instance over
// the connection we have already established.
channelRabbitMQ, err := connectRabbitMQ.Channel()
if err != nil {
panic(err)
}
defer channelRabbitMQ.Close()
// todo: заменен QueueService1 на динамический
// id_user_id_task
// Subscribing to QueueService1 for getting messages.
messages, err := channelRabbitMQ.Consume(
"QueueService1", // queue name
"", // consumer
true, // auto-ack
false, // exclusive
false, // no local
false, // no wait
nil, // arguments
)
if err != nil {
log.Println(err)
}
// Build a welcome message.
log.Println("Successfully connected to RabbitMQ")
log.Println("Waiting for messages")
// Upgrade initial GET request to a websocket
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
// Make sure we close the connection when the function returns
defer ws.Close()
// Make a channel to receive messages into infinite loop.
forever := make(chan bool)
go func() {
for message := range messages {
// For example, show received message in a console.
log.Printf(" > Received message: %s\n", message.Body)
// Создание экземпляра структуры Task
var code_obj Code
// Разбор JSON строки в структуру
err := json.Unmarshal([]byte(message.Body), &code_obj)
if err != nil {
log.Fatalf("Ошибка при разборе JSON: %v", err)
}
// Write message back to browser
err = ws.WriteMessage(websocket.TextMessage, []byte(code_obj.Code))
if err != nil {
log.Println(err)
return
}
fmt.Println(code_obj.Code)
}
}()
<-forever
// for {
// // Read message from browser
// _, msg, err := ws.ReadMessage()
// if err != nil {
// log.Println(err)
// return
// }
// // Print the message to the console
// fmt.Printf("Received: %s\n", msg)
// // Write message back to browser
// err = ws.WriteMessage(websocket.TextMessage, msg)
// if err != nil {
// log.Println(err)
// return
// }
// }
}
func main() {
fmt.Println("Starting WebSocket server...")
http.HandleFunc("/ws", handleConnections)
log.Fatal(http.ListenAndServe(":8081", nil))
}