2015-05-20 22:57:19 +01:00
|
|
|
package transport
|
|
|
|
|
|
|
|
//
|
|
|
|
// All credit to Mondo
|
|
|
|
//
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"github.com/nu7hatch/gouuid"
|
|
|
|
"github.com/streadway/amqp"
|
|
|
|
)
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
type rabbitMQChannel struct {
|
2015-05-20 22:57:19 +01:00
|
|
|
uuid string
|
|
|
|
connection *amqp.Connection
|
|
|
|
channel *amqp.Channel
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func newRabbitChannel(conn *amqp.Connection) (*rabbitMQChannel, error) {
|
2015-05-20 22:57:19 +01:00
|
|
|
id, err := uuid.NewV4()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2015-05-21 21:08:19 +01:00
|
|
|
rabbitCh := &rabbitMQChannel{
|
2015-05-20 22:57:19 +01:00
|
|
|
uuid: id.String(),
|
|
|
|
connection: conn,
|
|
|
|
}
|
|
|
|
if err := rabbitCh.Connect(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return rabbitCh, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) Connect() error {
|
2015-05-20 22:57:19 +01:00
|
|
|
var err error
|
|
|
|
r.channel, err = r.connection.Channel()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) Close() error {
|
2015-05-20 22:57:19 +01:00
|
|
|
if r.channel == nil {
|
|
|
|
return errors.New("Channel is nil")
|
|
|
|
}
|
|
|
|
return r.channel.Close()
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) Publish(exchange, key string, message amqp.Publishing) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
if r.channel == nil {
|
|
|
|
return errors.New("Channel is nil")
|
|
|
|
}
|
2015-05-21 19:24:57 +01:00
|
|
|
return r.channel.Publish(exchange, key, false, false, message)
|
2015-05-20 22:57:19 +01:00
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) DeclareExchange(exchange string) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
return r.channel.ExchangeDeclare(
|
|
|
|
exchange, // name
|
|
|
|
"topic", // kind
|
|
|
|
false, // durable
|
|
|
|
false, // autoDelete
|
|
|
|
false, // internal
|
|
|
|
false, // noWait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) DeclareQueue(queue string) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
_, err := r.channel.QueueDeclare(
|
|
|
|
queue, // name
|
|
|
|
false, // durable
|
|
|
|
true, // autoDelete
|
|
|
|
false, // exclusive
|
|
|
|
false, // noWait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) DeclareDurableQueue(queue string) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
_, err := r.channel.QueueDeclare(
|
|
|
|
queue, // name
|
|
|
|
true, // durable
|
|
|
|
false, // autoDelete
|
|
|
|
false, // exclusive
|
|
|
|
false, // noWait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) DeclareReplyQueue(queue string) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
_, err := r.channel.QueueDeclare(
|
|
|
|
queue, // name
|
|
|
|
false, // durable
|
|
|
|
true, // autoDelete
|
|
|
|
true, // exclusive
|
|
|
|
false, // noWait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) ConsumeQueue(queue string) (<-chan amqp.Delivery, error) {
|
2015-05-20 22:57:19 +01:00
|
|
|
return r.channel.Consume(
|
|
|
|
queue, // queue
|
|
|
|
r.uuid, // consumer
|
|
|
|
true, // autoAck
|
|
|
|
false, // exclusive
|
|
|
|
false, // nolocal
|
|
|
|
false, // nowait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2015-05-21 21:08:19 +01:00
|
|
|
func (r *rabbitMQChannel) BindQueue(queue, exchange string) error {
|
2015-05-20 22:57:19 +01:00
|
|
|
return r.channel.QueueBind(
|
|
|
|
queue, // name
|
|
|
|
queue, // key
|
|
|
|
exchange, // exchange
|
|
|
|
false, // noWait
|
|
|
|
nil, // args
|
|
|
|
)
|
|
|
|
}
|