138 lines
3.1 KiB
Go
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))
|
|
} |