@ -0,0 +1,62 @@ | |||
package rabbitmq | |||
import ( | |||
"errors" | |||
"log" | |||
"github.com/streadway/amqp" | |||
) | |||
var Conn *amqp.Connection | |||
var Chan *amqp.Channel | |||
func Connect(host, port, username, pwd, vhost string) error { | |||
log.Println("RabbitMQ connecting...") | |||
var err error | |||
if username != "" && pwd != "" && host != "" && port != "" { | |||
if vhost == "" { | |||
vhost = "/" | |||
} | |||
Conn, err = amqp.Dial("amqp://" + username + ":" + pwd + "@" + host + ":" + port + "/" + vhost) | |||
if err != nil { | |||
log.Println("ERROR", "Failed to connect to RabbitMQ", err) | |||
} else { | |||
log.Println("RabbitMQ has connected") | |||
} | |||
// defer conn.Close() | |||
} else { | |||
log.Println("ERROR", "RabbitMQ connection params errors") | |||
err = errors.New("RabbitMQ connection params errors") | |||
} | |||
return err | |||
} | |||
func Channel() error { | |||
var err error | |||
Chan, err = Conn.Channel() | |||
if err != nil { | |||
log.Println("ERROR", "Failed to open a channel") | |||
} else { | |||
log.Println("open a channel") | |||
} | |||
// defer ch.Close() | |||
return err | |||
} | |||
func CloseChannel() error { | |||
err := Chan.Close() | |||
if err == nil { | |||
log.Println("RabbitMQ channel closed") | |||
} | |||
return err | |||
} | |||
func CloseConn() error { | |||
err := Conn.Close() | |||
if err == nil { | |||
log.Println("RabbitMQ connection closed") | |||
} | |||
return err | |||
} |
@ -0,0 +1,55 @@ | |||
package rabbitmq | |||
import ( | |||
"encoding/json" | |||
) | |||
/** | |||
* 发送一条api通知消息 | |||
* @param exchange 交换机名 | |||
* @param extype 消息类型 | |||
* @param route 路由key | |||
* @param body 内容 | |||
*/ | |||
func SendNotice(site_id, dbname, msg_id string) error { | |||
msgData := map[string]interface{}{ | |||
"site_id": site_id, | |||
"dbname": dbname, | |||
"data": map[string]string{ | |||
"msg_id": msg_id, | |||
}, | |||
} | |||
msgDataJson, err := json.Marshal(msgData) | |||
if err != nil { | |||
return err | |||
} | |||
return Send("direct", SEND_MSG_EXCHANGE, SEND_API_MSG_KEY, msgDataJson) | |||
} | |||
/** | |||
* 发布订单已支付消息 | |||
* @param exchange 交换机名 | |||
* @param extype 消息类型 | |||
* @param route 路由key | |||
* @param body 内容 | |||
*/ | |||
func SendOrderPayed(site_id, dbname, order_id, order_sn, price string) error { | |||
//发布订单已支付消息 | |||
orderData := map[string]interface{}{ | |||
"site_id": site_id, | |||
"dbname": dbname, | |||
"data": map[string]string{ | |||
"order_id": order_id, | |||
"order_sn": order_sn, | |||
"price": price, | |||
}, | |||
} | |||
orderDataJson, _ := json.Marshal(orderData) | |||
return Send("direct", ORDER_EXCHANGE, ORDER_PAYED_KEY, orderDataJson) | |||
} |
@ -0,0 +1,105 @@ | |||
package rabbitmq | |||
import ( | |||
"github.com/streadway/amqp" | |||
) | |||
/** | |||
* 发送消息 | |||
* @param exchange 交换机名 | |||
* @param extype 消息类型 | |||
* @param route 路由key | |||
* @param body 内容 | |||
*/ | |||
func Send(extype string, exchange string, route string, body []byte, extend ...bool) error { | |||
var durable, auto_delete, no_wait, internal bool = true, false, false, false | |||
if len(extend) > 0 { | |||
durable = extend[0] | |||
} | |||
if len(extend) > 1 { | |||
auto_delete = extend[1] | |||
} | |||
if len(extend) > 2 { | |||
no_wait = extend[2] | |||
} | |||
if len(extend) > 3 { | |||
internal = extend[3] | |||
} | |||
var err error | |||
err = Chan.ExchangeDeclare( | |||
exchange, // name | |||
extype, // type | |||
durable, // durable | |||
auto_delete, // auto-deleted | |||
internal, // internal | |||
no_wait, // no-wait | |||
nil, // arguments | |||
) | |||
if err != nil { | |||
return err | |||
} | |||
err = Chan.Publish( | |||
exchange, // exchange | |||
route, // routing key | |||
false, // mandatory | |||
false, // immediate | |||
amqp.Publishing{ | |||
ContentType: "text/plain", | |||
Body: body, | |||
}) | |||
return err | |||
} | |||
/** | |||
* 发送消息 | |||
* @param exchange 交换机名 | |||
* @param extype 消息类型 | |||
* @param route 路由key | |||
* @param body 内容 | |||
* @param delay 延迟多少毫秒 | |||
*/ | |||
func SendDelay(extype string, exchange string, route string, body []byte, delay int64, extend ...bool) error { | |||
var durable, auto_delete, no_wait, internal bool = true, false, false, false | |||
if len(extend) > 0 { | |||
durable = extend[0] | |||
} | |||
if len(extend) > 1 { | |||
auto_delete = extend[1] | |||
} | |||
if len(extend) > 2 { | |||
no_wait = extend[2] | |||
} | |||
if len(extend) > 3 { | |||
internal = extend[3] | |||
} | |||
var err error | |||
err = Chan.ExchangeDeclare( | |||
exchange, // name | |||
"x-delayed-message", // type | |||
durable, // durable | |||
auto_delete, // auto-deleted | |||
internal, // internal | |||
no_wait, // no-wait | |||
amqp.Table{"x-delayed-type": extype}, // arguments | |||
) | |||
if err != nil { | |||
return err | |||
} | |||
err = Chan.Publish( | |||
exchange, // exchange | |||
route, // routing key | |||
false, // mandatory | |||
false, // immediate | |||
amqp.Publishing{ | |||
Headers: amqp.Table{"x-delay": delay}, | |||
ContentType: "text/plain", | |||
Body: body, | |||
}) | |||
return err | |||
} |
@ -0,0 +1,19 @@ | |||
package rabbitmq | |||
import ( | |||
"testing" | |||
) | |||
func Test_Send(t *testing.T) { | |||
err := Connect("127.0.0.1", "5672", "tetele", "fly123456@", "ttl") | |||
t.Log(err) | |||
err = Channel() | |||
t.Log(err) | |||
body := []byte("order is expire") | |||
// err = Send("direct", "ex_order_delay", "order_expire", body) | |||
err = SendDelay("direct", "ex_order_delay", "order_expire", body, 5000) | |||
t.Log(err) | |||
} |
@ -0,0 +1,139 @@ | |||
package rabbitmq | |||
// --订单-- | |||
//订单路由 | |||
const ORDER_EXCHANGE string = "ex_order" | |||
//已创建订单route key | |||
const ORDER_CREATED_KEY string = "created" | |||
//订单已创建队列,订单服务用 | |||
const ORDER_CREATED_QUEUE = "order_created_queue" | |||
//已创建订单队列,串货服务用 | |||
const CHANNEL_ORDER_CREATED_QUEUE = "channel_order_created_queue" | |||
//已支付订单route key | |||
const ORDER_PAYED_KEY string = "payed" | |||
//订单已支付队列,订单服务用 | |||
const ORDER_PAYED_QUEUE = "order_payed_queue" | |||
//订单已支付队列,串货服务用 | |||
const CHANNEL_ORDER_PAYED_QUEUE = "channel_order_payed_queue" | |||
//订单状态更新route key | |||
const ORDER_STATUS_CHANGE_KEY string = "status_change" | |||
//订单状态更新队列,订单服务用 | |||
const ORDER_STATUS_UPDATE_QUEUE = "order_status_update_queue" | |||
//订单状态更新,串货服务用 | |||
const CHANNEL_ORDER_STATUS_CHANGE_QUEUE = "channel_order_update_status" | |||
//订单取消route key | |||
const ORDER_CANCELED_KEY string = "canceled" | |||
//订单取消队列,订单服务用 | |||
const ORDER_CANCELED_QUEUE = "order_canceled_queue" | |||
//订单取消队列,串货服务用 | |||
const CHANNEL_ORDER_CANCELED_QUEUE = "channel_order_canceled_queue" | |||
//订单发货route key | |||
const ORDER_DELIVERED_KEY string = "delivered" | |||
//订单发货队列,订单服务用 | |||
const ORDER_DELIVERED_QUEUE = "order_delivered_queue" | |||
//订单发货队列,串货服务用 | |||
const CHANNEL_ORDER_DELIVERED_QUEUE = "channel_order_delivered_queue" | |||
//订单收货route key | |||
const ORDER_RECEIVED_KEY string = "received" | |||
//订单取消队列,订单服务用 | |||
const ORDER_RECEIVED_QUEUE = "order_received_queue" | |||
//订单取消队列,串货服务用 | |||
const CHANNEL_ORDER_RECEIVED_QUEUE = "channel_order_received_queue" | |||
//订单退款route key | |||
const ORDER_REFUNDED_KEY string = "refunded" | |||
//订单退款队列,订单服务用 | |||
const ORDER_REFUNDED_QUEUE = "order_refunded_queue" | |||
//订单退款队列,串货服务用 | |||
const CHANNEL_ORDER_REFUNDED_QUEUE = "channel_order_refunded_queue" | |||
//订单完成route key | |||
const ORDER_FINISHED_KEY string = "finished" | |||
//订单退款队列,订单服务用 | |||
const ORDER_FINISHED_QUEUE = "order_finished_queue" | |||
//订单退款队列,串货服务用 | |||
const CHANNEL_ORDER_FINISHED_QUEUE = "channel_order_finished_queue" | |||
//订单等待创建key,订单服务用 | |||
const ORDER_ADD_KEY = "add" | |||
//订单等待创建队列,订单服务用 | |||
const ORDER_ADD_QUEUE = "order_add_queue" | |||
//订单延迟队列路由 | |||
const ORDER_DELAY_EXCHANGE string = "ex_order_delay" | |||
//未支付订单过期自动取消key | |||
const ORDER_AUTO_CANCEL_KEY string = "order_auto_cancel" | |||
//未支付订单过期自动取消队列 | |||
const ORDER_AUTO_CANCEL_QUEUE string = "order_auto_cancel_queue" | |||
//未支付订单过期自动取消队列,串货服务用 | |||
const CHANNEL_ORDER_AUTO_CANCEL_QUEUE string = "channel_order_auto_cancel_queue" | |||
//订单发货后到期自动收货key | |||
const ORDER_AUTO_RECEIVE_KEY string = "order_auto_received" | |||
//订单发货后到期自动收货队列 | |||
const ORDER_AUTO_RECEIVE_QUEUE string = "order_auto_receive_queue" | |||
//订单自动收货队列,串货服务用 | |||
const CHANNEL_ORDER_AUTO_RECEIVE_QUEUE string = "channel_order_auto_receive_queue" | |||
//订单申请退款消息key | |||
const ORDER_ASK_FOR_REFUND_KEY string = "order_ask_for_refund" | |||
//订单申请退款消息队列 | |||
const ORDER_ASK_FOR_REFUND_QUEUE string = "order_ask_for_refund_queue" | |||
//订单申请退款队列,串货服务用 | |||
const CHANNEL_ORDER_ASK_FOR_REFUND_QUEUE string = "channel_order_ask_for_refund_queue" | |||
// --串货-- | |||
//串货订单路由 | |||
const CHANNEL_ORDER_EXCHANGE string = "ex_channel_order" | |||
//串货订单请求支付route key | |||
const CHANNEL_ORDER_ASKPAY_KEY = "channel_order_askpay" | |||
//订单请求支付队列,串货服务用 | |||
const CHANNEL_ORDER_ASKPAY_QUEUE = "channel_order_askpay_queue" | |||
//订单请求支付route key | |||
const ORDER_ASKPAY_KEY = "order_askpay" | |||
//订单请求支付队列,串货服务用 | |||
const ORDER_ASKPAY_QUEUE = "order_askpay_queue" | |||
// --通知-- | |||
//发送接口请求路由 | |||
const SEND_MSG_EXCHANGE string = "ex_send_msg" | |||
//发送接口请求路由route key | |||
const SEND_API_MSG_KEY = "api_send_msg" | |||
//发送接口请求队列,定时服务用 | |||
const SEND_MSG_QUEUE = "send_msg_queue" |