97 lines
1.7 KiB
Go
97 lines
1.7 KiB
Go
|
|
package ensureSendUtil
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
"goutil/webUtil"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 实现 EnsureSender和sender接口
|
|||
|
|
type httpSender struct {
|
|||
|
|
// 需要实现的接口
|
|||
|
|
EnsureSender
|
|||
|
|
|
|||
|
|
// 包含sender接口部分实现
|
|||
|
|
*baseSender
|
|||
|
|
|
|||
|
|
// 数据目录
|
|||
|
|
dataFolder string
|
|||
|
|
|
|||
|
|
// 发送地址
|
|||
|
|
url string
|
|||
|
|
|
|||
|
|
// 用于sendLoop和resendLoop发送退出信号
|
|||
|
|
closeSignal chan struct{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建一个http数据发送器
|
|||
|
|
// 参数:
|
|||
|
|
//
|
|||
|
|
// _dataFolder 数据存放目录
|
|||
|
|
// _url 发送地址
|
|||
|
|
func NewHTTPSender(_dataFolder, _url string) (EnsureSender, error) {
|
|||
|
|
this := &httpSender{
|
|||
|
|
dataFolder: _dataFolder,
|
|||
|
|
url: _url,
|
|||
|
|
baseSender: newBaseSender(),
|
|||
|
|
closeSignal: make(chan struct{}),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 新开协程发送数据
|
|||
|
|
go sendLoop(this, this.closeSignal)
|
|||
|
|
|
|||
|
|
// 定时重发
|
|||
|
|
go resendLoop(this, _dataFolder, this.closeSignal)
|
|||
|
|
|
|||
|
|
return this, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// EnsureSender接口
|
|||
|
|
// Write:写入数据
|
|||
|
|
func (this *httpSender) Write(data string) error {
|
|||
|
|
item := newHTTPData(data)
|
|||
|
|
|
|||
|
|
this.waitingDataChan <- item
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// EnsureSender接口
|
|||
|
|
// Close:关闭
|
|||
|
|
func (this *httpSender) Close() error {
|
|||
|
|
close(this.done)
|
|||
|
|
|
|||
|
|
// 等待sendLoop和resendLoop退出
|
|||
|
|
<-this.closeSignal
|
|||
|
|
<-this.closeSignal
|
|||
|
|
|
|||
|
|
// 保存数据
|
|||
|
|
_, e1 := saveData(this.Cache(), this.dataFolder)
|
|||
|
|
_, e2 := saveData(this.Data(), this.dataFolder)
|
|||
|
|
|
|||
|
|
if e2 != nil {
|
|||
|
|
if e1 != nil {
|
|||
|
|
return fmt.Errorf("%s %s", e1, e2)
|
|||
|
|
}
|
|||
|
|
return e2
|
|||
|
|
} else {
|
|||
|
|
return e1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// sender接口
|
|||
|
|
// Send:发送数据
|
|||
|
|
func (this *httpSender) Send(item dataItem) error {
|
|||
|
|
statusCode, _, err := webUtil.PostByteData2(this.url, item.Bytes(), nil, nil)
|
|||
|
|
if err != nil || statusCode != 200 {
|
|||
|
|
if err == nil {
|
|||
|
|
err = fmt.Errorf("StatusCode is not 200")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 发送失败时发送次数+1
|
|||
|
|
item.SetCount(item.Count() + 1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return err
|
|||
|
|
}
|