This commit is contained in:
2022-12-01 04:37:42 +01:00
parent cf2ec45b9a
commit 97afd0d966
8 changed files with 60 additions and 34 deletions

26
rabbitmq/connect.go Normal file
View File

@@ -0,0 +1,26 @@
package rabbitmq
import (
"log"
"github.com/streadway/amqp"
)
func Open(url string) (*amqp.Connection, *amqp.Channel, error) {
conn, err := amqp.Dial(url)
if err != nil {
return nil, nil, err
}
ch, err := conn.Channel()
if err != nil {
log.Printf("Failed to open a channel: %v\n", err)
return nil, nil, err
}
return conn, ch, nil
}
func Close(conn *amqp.Connection) {
conn.Close()
}

5
rabbitmq/go.mod Normal file
View File

@@ -0,0 +1,5 @@
module git.pbiernat.dev/egommerce/go-api-pkg/rabbitmq
go 1.18
require github.com/streadway/amqp v1.0.0

2
rabbitmq/go.sum Normal file
View File

@@ -0,0 +1,2 @@
github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo=
github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=

85
rabbitmq/queue.go Normal file
View File

@@ -0,0 +1,85 @@
package rabbitmq
import (
"bytes"
"encoding/json"
"fmt"
"log"
"github.com/streadway/amqp"
)
type Message map[string]interface{}
func Serialize(msg any) (string, error) {
var b bytes.Buffer
encoder := json.NewEncoder(&b)
err := encoder.Encode(msg)
return b.String(), err
}
func Deserialize(b []byte) (Message, error) {
var msg Message
buf := bytes.NewBuffer(b)
decoder := json.NewDecoder(buf)
err := decoder.Decode(&msg)
return msg, err
}
func NewExchange(chn *amqp.Channel, name string) error {
err := chn.ExchangeDeclare(
name,
"direct", // type
true, // durable
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
if err != nil {
return err
}
return nil
}
func Publish(chn *amqp.Channel, name, routingKey string, msg any) error {
jsonData, err := Serialize(msg)
if err != nil {
return err
}
msgBody := fmt.Sprintf(`{"event":"%T","data":%s}`, msg, jsonData)
chn.Publish(
name, // exchange name
routingKey, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "application/json",
Body: []byte(msgBody),
},
)
return nil
}
func BindQueueToExchange(chn *amqp.Channel, queueName, exchName, routingKey string) error {
err := chn.QueueBind(
queueName, // queue name
routingKey, // routing key
exchName, // exchange name
false,
nil,
)
if err != nil {
log.Printf("Failed to bind a queue: %s\n", queueName)
return err
}
return nil
}