@ -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" |