本文整理汇总了Golang中github.com/bitly/nsq/nsq.DecodeMessage函数的典型用法代码示例。如果您正苦于以下问题:Golang DecodeMessage函数的具体用法?Golang DecodeMessage怎么用?Golang DecodeMessage使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DecodeMessage函数的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: TestBasicV2
// exercise the basic operations of the V2 protocol
func TestBasicV2(t *testing.T) {
log.SetOutput(ioutil.Discard)
defer log.SetOutput(os.Stdout)
options := NewNsqdOptions()
options.clientTimeout = 60 * time.Second
tcpAddr, _ := mustStartNSQd(options)
defer nsqd.Exit()
topicName := "test_v2" + strconv.Itoa(int(time.Now().Unix()))
topic := nsqd.GetTopic(topicName)
msg := nsq.NewMessage(<-nsqd.idChan, []byte("test body"))
topic.PutMessage(msg)
conn, err := mustConnectNSQd(tcpAddr)
assert.Equal(t, err, nil)
identify(t, conn)
sub(t, conn, topicName, "ch")
err = nsq.Ready(1).Write(conn)
assert.Equal(t, err, nil)
resp, err := nsq.ReadResponse(conn)
assert.Equal(t, err, nil)
frameType, data, err := nsq.UnpackResponse(resp)
msgOut, _ := nsq.DecodeMessage(data)
assert.Equal(t, frameType, nsq.FrameTypeMessage)
assert.Equal(t, msgOut.Id, msg.Id)
assert.Equal(t, msgOut.Body, msg.Body)
assert.Equal(t, msgOut.Attempts, uint16(1))
}
示例2: messagePump
// messagePump selects over the in-memory and backend queue and
// writes messages to every channel for this topic
func (t *Topic) messagePump() {
var msg *nsq.Message
var buf []byte
var err error
for {
// do an extra check for exit before we select on all the memory/backend/exitChan
// this solves the case where we are closed and something else is writing into
// backend. we don't want to reverse that
if atomic.LoadInt32(&t.exitFlag) == 1 {
goto exit
}
select {
case msg = <-t.memoryMsgChan:
case buf = <-t.backend.ReadChan():
msg, err = nsq.DecodeMessage(buf)
if err != nil {
log.Printf("ERROR: failed to decode message - %s", err.Error())
continue
}
case <-t.exitChan:
goto exit
}
t.RLock()
// check if all the channels have been deleted
if len(t.channelMap) == 0 {
// put this message back on the queue
// we need to background because we currently hold the lock
go func() {
t.PutMessage(msg)
}()
// reset the sync.Once
t.messagePumpStarter = new(sync.Once)
t.RUnlock()
goto exit
}
for _, channel := range t.channelMap {
// copy the message because each channel
// needs a unique instance
chanMsg := nsq.NewMessage(msg.Id, msg.Body)
chanMsg.Timestamp = msg.Timestamp
err := channel.PutMessage(chanMsg)
if err != nil {
log.Printf("TOPIC(%s) ERROR: failed to put msg(%s) to channel(%s) - %s", t.name, msg.Id, channel.name, err.Error())
}
}
t.RUnlock()
}
exit:
log.Printf("TOPIC(%s): closing ... messagePump", t.name)
}
示例3: subWorker
func subWorker(n int, workers int, tcpAddr string, topic string, channel string, rdyChan chan int, goChan chan int, id int) {
conn, err := net.DialTimeout("tcp", tcpAddr, time.Second)
if err != nil {
panic(err.Error())
}
conn.Write(nsq.MagicV2)
rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
ci := make(map[string]interface{})
ci["short_id"] = "test"
ci["long_id"] = "test"
cmd, _ := nsq.Identify(ci)
cmd.Write(rw)
nsq.Subscribe(topic, channel).Write(rw)
rdyCount := int(math.Min(math.Max(float64(n/workers), 1), 2500))
rdyChan <- 1
<-goChan
nsq.Ready(rdyCount).Write(rw)
rw.Flush()
nsq.ReadResponse(rw)
nsq.ReadResponse(rw)
num := n / workers
numRdy := num/rdyCount - 1
rdy := rdyCount
for i := 0; i < num; i += 1 {
resp, err := nsq.ReadResponse(rw)
if err != nil {
panic(err.Error())
}
frameType, data, err := nsq.UnpackResponse(resp)
if err != nil {
panic(err.Error())
}
if frameType == nsq.FrameTypeError {
panic("got something else")
}
msg, err := nsq.DecodeMessage(data)
if err != nil {
panic(err.Error())
}
nsq.Finish(msg.Id).Write(rw)
rdy--
if rdy == 0 && numRdy > 0 {
nsq.Ready(rdyCount).Write(rw)
rdy = rdyCount
numRdy--
rw.Flush()
}
}
}
示例4: TestMultipleConsumerV2
func TestMultipleConsumerV2(t *testing.T) {
log.SetOutput(ioutil.Discard)
defer log.SetOutput(os.Stdout)
msgChan := make(chan *nsq.Message)
options := NewNsqdOptions()
options.clientTimeout = 60 * time.Second
tcpAddr, _ := mustStartNSQd(options)
defer nsqd.Exit()
topicName := "test_multiple_v2" + strconv.Itoa(int(time.Now().Unix()))
topic := nsqd.GetTopic(topicName)
msg := nsq.NewMessage(<-nsqd.idChan, []byte("test body"))
topic.GetChannel("ch1")
topic.GetChannel("ch2")
topic.PutMessage(msg)
for _, i := range []string{"1", "2"} {
conn, err := mustConnectNSQd(tcpAddr)
assert.Equal(t, err, nil)
identify(t, conn)
sub(t, conn, topicName, "ch"+i)
err = nsq.Ready(1).Write(conn)
assert.Equal(t, err, nil)
go func(c net.Conn) {
resp, _ := nsq.ReadResponse(c)
_, data, _ := nsq.UnpackResponse(resp)
msg, _ := nsq.DecodeMessage(data)
msgChan <- msg
}(conn)
}
msgOut := <-msgChan
assert.Equal(t, msgOut.Id, msg.Id)
assert.Equal(t, msgOut.Body, msg.Body)
assert.Equal(t, msgOut.Attempts, uint16(1))
msgOut = <-msgChan
assert.Equal(t, msgOut.Id, msg.Id)
assert.Equal(t, msgOut.Body, msg.Body)
assert.Equal(t, msgOut.Attempts, uint16(1))
}
示例5: messagePump
// messagePump reads messages from either memory or backend and writes
// to the client output go channel
//
// it is also performs in-flight accounting and initiates the auto-requeue
// goroutine
func (c *Channel) messagePump() {
var msg *nsq.Message
var buf []byte
var err error
for {
// do an extra check for closed exit before we select on all the memory/backend/exitChan
// this solves the case where we are closed and something else is draining clientMsgChan into
// backend. we don't want to reverse that
if atomic.LoadInt32(&c.exitFlag) == 1 {
goto exit
}
select {
case msg = <-c.memoryMsgChan:
case buf = <-c.backend.ReadChan():
msg, err = nsq.DecodeMessage(buf)
if err != nil {
log.Printf("ERROR: failed to decode message - %s", err.Error())
continue
}
case <-c.exitChan:
goto exit
}
msg.Attempts++
atomic.StoreInt32(&c.bufferedCount, 1)
c.clientMsgChan <- msg
atomic.StoreInt32(&c.bufferedCount, 0)
// the client will call back to mark as in-flight w/ it's info
}
exit:
log.Printf("CHANNEL(%s): closing ... messagePump", c.name)
close(c.clientMsgChan)
}
示例6: messagePump
// messagePump selects over the in-memory and backend queue and
// writes messages to every channel for this topic
func (t *Topic) messagePump() {
var msg *nsq.Message
var buf []byte
var err error
var chans []*Channel
var memoryMsgChan chan *nsq.Message
var backendChan chan []byte
t.RLock()
for _, c := range t.channelMap {
chans = append(chans, c)
}
t.RUnlock()
if len(chans) > 0 {
memoryMsgChan = t.memoryMsgChan
backendChan = t.backend.ReadChan()
}
for {
select {
case msg = <-memoryMsgChan:
case buf = <-backendChan:
msg, err = nsq.DecodeMessage(buf)
if err != nil {
log.Printf("ERROR: failed to decode message - %s", err.Error())
continue
}
case <-t.channelUpdateChan:
chans = make([]*Channel, 0)
t.RLock()
for _, c := range t.channelMap {
chans = append(chans, c)
}
t.RUnlock()
if len(chans) == 0 {
memoryMsgChan = nil
backendChan = nil
} else {
memoryMsgChan = t.memoryMsgChan
backendChan = t.backend.ReadChan()
}
continue
case <-t.exitChan:
goto exit
}
for i, channel := range chans {
chanMsg := msg
// copy the message because each channel
// needs a unique instance but...
// fastpath to avoid copy if its the first channel
// (the topic already created the first copy)
if i > 0 {
chanMsg = nsq.NewMessage(msg.Id, msg.Body)
chanMsg.Timestamp = msg.Timestamp
}
err := channel.PutMessage(chanMsg)
if err != nil {
log.Printf("TOPIC(%s) ERROR: failed to put msg(%s) to channel(%s) - %s", t.name, msg.Id, channel.name, err.Error())
}
}
}
exit:
log.Printf("TOPIC(%s): closing ... messagePump", t.name)
}
示例7: messagePump
// messagePump selects over the in-memory and backend queue and
// writes messages to every channel for this topic
func (t *Topic) messagePump() {
var msg *nsq.Message
var buf []byte
var err error
var chans []*Channel
t.RLock()
for _, c := range t.channelMap {
chans = append(chans, c)
}
t.RUnlock()
for {
select {
case msg = <-t.memoryMsgChan:
case buf = <-t.backend.ReadChan():
msg, err = nsq.DecodeMessage(buf)
if err != nil {
log.Printf("ERROR: failed to decode message - %s", err.Error())
continue
}
case <-t.channelUpdateChan:
chans = chans[:0]
t.RLock()
for _, c := range t.channelMap {
chans = append(chans, c)
}
t.RUnlock()
continue
case <-t.exitChan:
goto exit
}
// check if all the channels have been deleted
if len(chans) == 0 {
// put this message back on the queue
t.PutMessage(msg)
// reset the sync.Once
t.messagePumpStarter = new(sync.Once)
goto exit
}
for i, channel := range chans {
chanMsg := msg
// copy the message because each channel
// needs a unique instance but...
// fastpath to avoid copy if its the first channel
// (the topic already created the first copy)
if i > 0 {
chanMsg = nsq.NewMessage(msg.Id, msg.Body)
chanMsg.Timestamp = msg.Timestamp
}
err := channel.PutMessage(chanMsg)
if err != nil {
log.Printf("TOPIC(%s) ERROR: failed to put msg(%s) to channel(%s) - %s", t.name, msg.Id, channel.name, err.Error())
}
}
}
exit:
log.Printf("TOPIC(%s): closing ... messagePump", t.name)
}
示例8: TestClientTimeout
//.........这里部分代码省略.........
conn, err := mustConnectNSQd(tcpAddr)
assert.Equal(t, err, nil)
hbi := int(options.maxHeartbeatInterval/time.Millisecond + 1)
identifyHeartbeatInterval(t, conn, hbi, nsq.FrameTypeError, "E_BAD_BODY IDENTIFY heartbeat interval (300001) is invalid")
}
func TestPausing(t *testing.T) {
log.SetOutput(ioutil.Discard)
defer log.SetOutput(os.Stdout)
topicName := "test_pause_v2" + strconv.Itoa(int(time.Now().Unix()))
tcpAddr, _ := mustStartNSQd(NewNsqdOptions())
defer nsqd.Exit()
conn, err := mustConnectNSQd(tcpAddr)
assert.Equal(t, err, nil)
identify(t, conn)
sub(t, conn, topicName, "ch")
err = nsq.Ready(1).Write(conn)
assert.Equal(t, err, nil)
topic := nsqd.GetTopic(topicName)
msg := nsq.NewMessage(<-nsqd.idChan, []byte("test body"))
channel := topic.GetChannel("ch")
topic.PutMessage(msg)
// receive the first message via the client, finish it, and send new RDY
resp, _ := nsq.ReadResponse(conn)
_, data, _ := nsq.UnpackResponse(resp)
msg, err = nsq.DecodeMessage(data)
assert.Equal(t, msg.Body, []byte("test body"))
err = nsq.Finish(msg.Id).Write(conn)
assert.Equal(t, err, nil)
err = nsq.Ready(1).Write(conn)
assert.Equal(t, err, nil)
// sleep to allow the RDY state to take effect
time.Sleep(50 * time.Millisecond)
// pause the channel... the client shouldn't receive any more messages
channel.Pause()
// sleep to allow the paused state to take effect
time.Sleep(50 * time.Millisecond)
msg = nsq.NewMessage(<-nsqd.idChan, []byte("test body2"))
topic.PutMessage(msg)
// allow the client to possibly get a message, the test would hang indefinitely
// if pausing was not working on the internal clientMsgChan read
time.Sleep(50 * time.Millisecond)
msg = <-channel.clientMsgChan
assert.Equal(t, msg.Body, []byte("test body2"))
// unpause the channel... the client should now be pushed a message
channel.UnPause()
msg = nsq.NewMessage(<-nsqd.idChan, []byte("test body3"))
topic.PutMessage(msg)