Apply .gitignore rules
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
package mqMgr
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
)
|
||||
|
||||
// Queue对象
|
||||
type HSYQueue struct {
|
||||
conn *amqp.Connection
|
||||
channel *amqp.Channel
|
||||
// 队列名称
|
||||
queueName string
|
||||
// 交换机
|
||||
exchange string
|
||||
// routing Key
|
||||
routingKey string
|
||||
//MQ链接字符串
|
||||
mqurl string
|
||||
}
|
||||
|
||||
// 消息队列配置对象
|
||||
type HSYQueueConfig struct {
|
||||
QueueName string
|
||||
Exchange string
|
||||
RoutingKey string
|
||||
Network string
|
||||
Port int
|
||||
UserName string
|
||||
Password string
|
||||
}
|
||||
|
||||
// 创建新的Queue对象
|
||||
func NewHSYQueue(queueName, exchange, routingKey, userName, password string, network string, port int) *HSYQueue {
|
||||
queueConfigObj := &HSYQueueConfig{
|
||||
QueueName: queueName,
|
||||
Exchange: exchange,
|
||||
RoutingKey: routingKey,
|
||||
UserName: userName,
|
||||
Password: password,
|
||||
Network: network,
|
||||
Port: port,
|
||||
}
|
||||
|
||||
return NewHSYQueueByConfig(queueConfigObj)
|
||||
}
|
||||
|
||||
// 通过队列配置对象创建新的Queue对象
|
||||
func NewHSYQueueByConfig(queueConfigObj *HSYQueueConfig) *HSYQueue {
|
||||
queueObj := &HSYQueue{
|
||||
queueName: queueConfigObj.QueueName,
|
||||
exchange: queueConfigObj.Exchange,
|
||||
routingKey: queueConfigObj.RoutingKey,
|
||||
mqurl: fmt.Sprintf("amqp://%s:%s@%s:%d/", queueConfigObj.UserName, queueConfigObj.Password, queueConfigObj.Network, queueConfigObj.Port),
|
||||
}
|
||||
|
||||
if err := queueObj.GetQueueAttributes(); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return queueObj
|
||||
}
|
||||
|
||||
// 连接RabbitMQ服务器
|
||||
func (this *HSYQueue) GetQueueAttributes() (err error) {
|
||||
this.conn, err = amqp.Dial(this.mqurl)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
this.channel, err = this.conn.Channel()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 释放连接
|
||||
func (this *HSYQueue) ReleaseRes() {
|
||||
this.conn.Close()
|
||||
this.channel.Close()
|
||||
}
|
||||
|
||||
// SendMessage 发送单条消息
|
||||
func (this *HSYQueue) SendMessage(message string, ex string) (err error) {
|
||||
// 声明队列
|
||||
_, err = this.channel.QueueDeclare(
|
||||
this.queueName, // 队列名
|
||||
true, // 是否持久化
|
||||
false, // 是否自动删除(前提是至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。注意:生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列)
|
||||
false, // 是否为排他队列(排他的队列仅对“首次”声明的conn可见[一个conn中的其他channel也能访问该队列],conn结束后队列删除)
|
||||
false, // 是否阻塞
|
||||
nil, // 额外属性
|
||||
)
|
||||
if err != nil {
|
||||
err = errors.New("声明队列失败")
|
||||
return
|
||||
}
|
||||
|
||||
// 声明交换器
|
||||
err = this.channel.ExchangeDeclare(
|
||||
this.exchange, //交换器名
|
||||
ex, //exchange type:一般用fanout、direct、topic
|
||||
true, // 是否持久化
|
||||
false, //是否自动删除(自动删除的前提是至少有一个队列或者交换器与这和交换器绑定,之后所有与这个交换器绑定的队列或者交换器都与此解绑)
|
||||
false, //设置是否内置的。true表示是内置的交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式
|
||||
false, // 是否阻塞
|
||||
nil, // 额外属性
|
||||
)
|
||||
if err != nil {
|
||||
err = errors.New("声明交换器失败")
|
||||
return
|
||||
}
|
||||
|
||||
// Binding
|
||||
err = this.channel.QueueBind(
|
||||
this.queueName, // 绑定的队列名称
|
||||
this.routingKey, // bindkey 用于消息路由分发的key
|
||||
this.exchange, // 绑定的exchange名
|
||||
false, // 是否阻塞
|
||||
nil, // 额外属性
|
||||
)
|
||||
if err != nil {
|
||||
err = errors.New("绑定队列和交换器失败")
|
||||
return
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
||||
err = this.channel.PublishWithContext(ctx,
|
||||
this.exchange,
|
||||
this.routingKey,
|
||||
false,
|
||||
false,
|
||||
amqp.Publishing{
|
||||
ContentType: "text/plain",
|
||||
Body: []byte(message),
|
||||
})
|
||||
if err != nil {
|
||||
err = errors.New("发布消息失败")
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// ReceiveMessage 消费单条消息
|
||||
func (this *HSYQueue) ReceiveMessage() (msgs <-chan amqp.Delivery, err error) {
|
||||
_, err = this.channel.QueueDeclare(
|
||||
this.queueName, // 队列名
|
||||
true, // 是否持久化
|
||||
false, // 是否自动删除(前提是至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。注意:生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列)
|
||||
false, // 是否为排他队列(排他的队列仅对“首次”声明的conn可见[一个conn中的其他channel也能访问该队列],conn结束后队列删除)
|
||||
false, // 是否阻塞
|
||||
nil, // 额外属性(我还不会用)
|
||||
)
|
||||
if err != nil {
|
||||
err = errors.New("声明队列失败")
|
||||
return
|
||||
}
|
||||
|
||||
msgs, err = this.channel.Consume(
|
||||
this.queueName, // 队列名
|
||||
"", // 消费者名,用来区分多个消费者,以实现公平分发或均等分发策略
|
||||
true, // 是否自动应答
|
||||
false, // 是否排他
|
||||
false, // 是否接收只同一个连接中的消息,若为true,则只能接收别的conn中发送的消息
|
||||
true, // 队列消费是否阻塞
|
||||
nil, // 额外属性
|
||||
)
|
||||
if err != nil {
|
||||
err = errors.New("获取消息失败")
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
package stringUtil
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"runtime"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// 检查一个字符串是否是空字符串
|
||||
// content:上下文字符串
|
||||
// 返回值:
|
||||
// bool:true:空字符串 false:非空字符串
|
||||
func IsEmpty(content string) bool {
|
||||
if len(content) <= 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
return strings.IndexFunc(content, func(item rune) bool {
|
||||
return unicode.IsSpace(item) == false
|
||||
}) < 0
|
||||
}
|
||||
|
||||
// 截取字符串
|
||||
// start:开始位置
|
||||
// length:截取长度
|
||||
// 返回值:
|
||||
// 截取后的字符串
|
||||
func Substring(str string, start, length int) string {
|
||||
// 先将字符串转化为[]rune格式(由于rune是字符串的基本单位)
|
||||
runeString := []rune(str)
|
||||
runeLength := len(runeString)
|
||||
end := 0
|
||||
|
||||
// 计算起始位置
|
||||
if start > runeLength {
|
||||
start = runeLength
|
||||
}
|
||||
|
||||
// 计算终止位置
|
||||
end = start + length
|
||||
if end > runeLength {
|
||||
end = runeLength
|
||||
}
|
||||
|
||||
if start > end {
|
||||
start, end = end, start
|
||||
}
|
||||
|
||||
return string(runeString[start:end])
|
||||
}
|
||||
|
||||
// 根据不同平台获取换行符
|
||||
// 返回值:
|
||||
// 换行符
|
||||
func GetNewLineString() string {
|
||||
switch os := runtime.GOOS; os {
|
||||
case "windows":
|
||||
return "\r\n"
|
||||
default:
|
||||
return "\n"
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否存在特殊符号
|
||||
// 1. emoji字符
|
||||
// 2. ascii控制字符
|
||||
// 3. \ " '
|
||||
// val:待检查的字符串
|
||||
// 返回值:
|
||||
// bool:true:有特殊字符 false:无特殊字符
|
||||
func IfHaveSpecialChar(val string) bool {
|
||||
if len(val) <= 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
// 表情符号过滤
|
||||
// Wide UCS-4 build
|
||||
emojiReg, _ := regexp.Compile("[^\U00000000-\U0000FFFF]+")
|
||||
if emojiReg.Match([]byte(val)) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 排除控制字符和特殊字符
|
||||
for _, charItem := range val {
|
||||
// 排除控制字符
|
||||
if (charItem > 0 && charItem < 0x20) || charItem == 0x7F {
|
||||
return true
|
||||
}
|
||||
|
||||
// 排除部分特殊字符: \ " '
|
||||
switch charItem {
|
||||
case '\\':
|
||||
fallthrough
|
||||
case '"':
|
||||
fallthrough
|
||||
case '\'':
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// 判断string数组是否内容唯一
|
||||
func IsDistinct_string(list []string) (result bool) {
|
||||
if len(list) == 0 || len(list) == 1 {
|
||||
result = true
|
||||
return
|
||||
}
|
||||
|
||||
sort.Strings(list)
|
||||
|
||||
for i := 0; i < len(list)-1; i++ {
|
||||
if list[i] == list[i+1] {
|
||||
result = false
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
result = true
|
||||
return
|
||||
}
|
||||
|
||||
// 验证是否是电话号码
|
||||
func VerifyPhone(phone string) bool {
|
||||
regular := "^1[3-9]\\d{9}$"
|
||||
|
||||
reg := regexp.MustCompile(regular)
|
||||
return reg.MatchString(phone)
|
||||
}
|
||||
|
||||
// 转型成int64
|
||||
func StringToInt64(str string) int64 {
|
||||
num, err := strconv.ParseInt(str, 10, 64)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return num
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package managecenterModel
|
||||
|
||||
// 服务器状态
|
||||
type GroupLoad int32
|
||||
|
||||
const (
|
||||
// 正常
|
||||
Con_GroupLoad_Normal GroupLoad = 1
|
||||
|
||||
// 火爆
|
||||
Con_GroupLoad_Hot GroupLoad = 2
|
||||
)
|
||||
@@ -0,0 +1,53 @@
|
||||
package mathUtil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestQuartile(t *testing.T) {
|
||||
|
||||
intList := []int{}
|
||||
var lower, mid, upper float64
|
||||
var err error
|
||||
lower, mid, upper, err = Quartile_Int(intList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error:%s\n", err)
|
||||
}
|
||||
|
||||
intList = []int{4}
|
||||
lower, mid, upper, err = Quartile_Int(intList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error:%s\n", err)
|
||||
}
|
||||
fmt.Printf("LowerQuartile:%f\n", lower)
|
||||
fmt.Printf("MidQuartile:%f\n", mid)
|
||||
fmt.Printf("UpperQuartile:%f\n", upper)
|
||||
|
||||
intList = []int{4, 93}
|
||||
lower, mid, upper, err = Quartile_Int(intList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error:%s\n", err)
|
||||
}
|
||||
fmt.Printf("LowerQuartile:%f\n", lower)
|
||||
fmt.Printf("MidQuartile:%f\n", mid)
|
||||
fmt.Printf("UpperQuartile:%f\n", upper)
|
||||
|
||||
intList = []int{4, 93, 84}
|
||||
lower, mid, upper, err = Quartile_Int(intList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error:%s\n", err)
|
||||
}
|
||||
fmt.Printf("LowerQuartile:%f\n", lower)
|
||||
fmt.Printf("MidQuartile:%f\n", mid)
|
||||
fmt.Printf("UpperQuartile:%f\n", upper)
|
||||
|
||||
intList = []int{4, 93, 84, 85, 80, 37, 81, 93, 27, 12}
|
||||
lower, mid, upper, err = Quartile_Int(intList)
|
||||
if err != nil {
|
||||
fmt.Printf("Error:%s\n", err)
|
||||
}
|
||||
fmt.Printf("LowerQuartile:%f\n", lower)
|
||||
fmt.Printf("MidQuartile:%f\n", mid)
|
||||
fmt.Printf("UpperQuartile:%f\n", upper)
|
||||
}
|
||||
Reference in New Issue
Block a user