package main import ( "github.com/influxdata/influxdb-client-go/v2/api/write" amqp "github.com/rabbitmq/amqp091-go" ) func create_and_connect_to_queue(ch *amqp.Channel, name string, routing_key string) <-chan amqp.Delivery { q, err := ch.QueueDeclare( name, // name false, // durable false, // delete when unused true, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") err = ch.QueueBind( q.Name, // queue name routing_key, // routing key "amq.topic", // exchange false, nil, ) failOnError(err, "Failed to bind a queue") msgs, err := ch.Consume( q.Name, // queue "", // consumer true, // auto ack false, // exclusive false, // no local false, // no wait nil, // args ) failOnError(err, "Failed to register a consumer") return msgs } type Piper struct { influx *InfluxWriter delivery <-chan amqp.Delivery } func (p *Piper) Init(writer *InfluxWriter, amqp AMQPConnection, queue_name string, routing_key string) { // Create a new client using an InfluxDB server base URL and an authentication token p.influx = writer p.delivery, _ = amqp.ConnectToQueue(queue_name, routing_key) notify := amqp.NotifyError() go func() { for _ = range notify { p.delivery, _ = amqp.ConnectToQueue(queue_name, routing_key) println("Reconnected to queue") } }() } func (p *Piper) RunPipe( conversion func(amqp.Delivery) ([]*write.Point, error), ) { // Create point using fluent style for msg := range p.delivery { points, _ := conversion(msg) // Write data for _, point := range points { p.influx.Write(point) } } }