func main() { connection, err := amqp.Dial(sylvilagus.AMQP_URI) if err != nil { log.Fatal("Failed to connect!:", err) } defer connection.Close() channel, err := sylvilagus.CreateRPCTopology(connection) if err != nil { log.Fatal("Failed to build topology!:", err) } qResult, err := channel.QueueDeclare("", false, false, true, false, nil) if err != nil { log.Fatal("Failed to build topology!:", err) } msgBody := &sylvilagus.Ping{ ClientName: "RPC Client 1.0", Time: time.Now(), } msgBytes, err := json.Marshal(msgBody) if err != nil { log.Fatal("Failed to json.Marshal the ping!:", err) } msg := amqp.Publishing{ ContentType: "application/json", DeliveryMode: amqp.Persistent, Timestamp: time.Now(), Body: msgBytes, ReplyTo: qResult.Name, } channel.Publish("rpc", "ping", false, false, msg) log.Println("Sent 'ping' RPC call:", string(msg.Body)) log.Println("Waiting for reply...") pongs, err := channel.Consume(qResult.Name, qResult.Name, false, false, false, false, nil) for pong := range pongs { log.Println("RPC Reply ---", string(pong.Body)) if err = channel.Close(); err != nil { log.Fatal("Failed to close channel!:", err) } else { return } } }
func main() { connection, err := amqp.Dial(sylvilagus.AMQP_URI) if err != nil { log.Fatal("Failed to connect!:", err) } defer connection.Close() channel, err := sylvilagus.CreateRPCTopology(connection) if err != nil { log.Fatal("Failed to build topology!:", err) } pings, err := channel.Consume("ping", "ping", false, false, false, false, nil) if err != nil { log.Fatal("Failed to start consuming!:", err) } quit := make(chan bool) go func(quit chan bool) { log.Println("Waiting for RPC calls...") for ping := range pings { if err = ping.Ack(false); err == nil { log.Println("Received API call... replying...") pingInst := &sylvilagus.Ping{} err = json.Unmarshal(ping.Body, pingInst) if err == nil { msg := amqp.Publishing{ DeliveryMode: amqp.Persistent, Timestamp: time.Now(), ContentType: "text/plain", Body: []byte(fmt.Sprintf("Pong! %s", pingInst.Time)), } channel.Publish("", ping.ReplyTo, false, false, msg) } else { log.Println("Failed to json.Unmarshal the ping!:", err) } } else { log.Println("Failed to ACK the ping!:", err) } } }(quit) <-quit }