Пример #1
0
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
		}
	}
}
Пример #2
0
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
}