Listening to rabbitmq events
This commit is contained in:
99
listener-service/event/consumer.go
Normal file
99
listener-service/event/consumer.go
Normal file
@ -0,0 +1,99 @@
|
||||
package event
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
)
|
||||
|
||||
type Consumer struct {
|
||||
conn *amqp.Connection
|
||||
queueName string
|
||||
}
|
||||
|
||||
func NewConsumer(conn *amqp.Connection) (Consumer, error) {
|
||||
consumer := Consumer{
|
||||
conn: conn,
|
||||
}
|
||||
|
||||
err := consumer.setup()
|
||||
if err != nil {
|
||||
return Consumer{}, err
|
||||
}
|
||||
return consumer, err
|
||||
}
|
||||
|
||||
func (consumer *Consumer) setup() error {
|
||||
channel, err := consumer.conn.Channel()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return declaireExchange(channel)
|
||||
}
|
||||
|
||||
type Payload struct {
|
||||
Name string `json:"name"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
func (consumer *Consumer) Listen(topics []string) error {
|
||||
ch, err := consumer.conn.Channel()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer ch.Close()
|
||||
|
||||
q, err := declaireRandomQueue(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, s := range topics {
|
||||
ch.QueueBind(q.Name, s, "logs_topic", false, nil)
|
||||
}
|
||||
|
||||
messages, err := ch.Consume(q.Name, "", true, false, false, false, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
forever := make(chan bool)
|
||||
go func() {
|
||||
for d := range messages {
|
||||
var payload Payload
|
||||
json.Unmarshal(d.Body, &payload)
|
||||
|
||||
go handlePayload(payload)
|
||||
}
|
||||
}()
|
||||
|
||||
fmt.Printf("Waiting for message [Exchange, Queue] [logs_topic, %s]\n", q.Name)
|
||||
<-forever
|
||||
return nil
|
||||
}
|
||||
|
||||
func handlePayload(payload Payload) {
|
||||
switch payload.Name {
|
||||
case "log", "event":
|
||||
// log whatever we get
|
||||
err := logEvent(payload)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
case "auth":
|
||||
// authenticate
|
||||
// You can have as many cases as you want, as long as you write the logic.
|
||||
default:
|
||||
err := logEvent(payload)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func logEvent(entry Payload) error {
|
||||
return nil
|
||||
}
|
28
listener-service/event/event.go
Normal file
28
listener-service/event/event.go
Normal file
@ -0,0 +1,28 @@
|
||||
package event
|
||||
|
||||
import (
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
)
|
||||
|
||||
func declaireExchange(ch *amqp.Channel) error {
|
||||
return ch.ExchangeDeclare(
|
||||
"logs_topic", // name
|
||||
"topic", // type
|
||||
true, // durable?
|
||||
false, // auto-deleted?
|
||||
false, // internal?
|
||||
false, // no-wait?
|
||||
nil, // arguments?
|
||||
)
|
||||
}
|
||||
|
||||
func declaireRandomQueue(ch *amqp.Channel) (amqp.Queue, error) {
|
||||
return ch.QueueDeclare(
|
||||
"", // name
|
||||
false, // durable
|
||||
false, // delete when unused
|
||||
true, // exclusive
|
||||
false, // nowait
|
||||
nil, // table
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user