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