// Send messages to a particular queue func sender(qn, mc int) { ltag := tag + "-sender" qns := fmt.Sprintf("%d", qn) // string queue number id := stompngo.Uuid() // A unique sender id d := sngecomm.Dest() + "." + qns ll.Printf("%stag:%s connsess:%s queue_info id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) // wh := stompngo.Headers{"destination", d, "senderId", id, "qnum", qns} // send Headers if senv.Persistent() { wh = wh.Add("persistent", "true") } // tmr := time.NewTimer(100 * time.Hour) // Send loop for i := 1; i <= mc; i++ { si := fmt.Sprintf("%d", i) sh := append(wh, "msgnum", si) // Generate a message to send ............... ll.Printf("%stag:%s connsess:%s send_headers id:%v d:%v qnum:%v headers:%v\n", exampid, ltag, conn.Session(), id, d, qn, sh) e := conn.Send(sh, string(sngecomm.Partial())) if e != nil { ll.Fatalf("%stag:%s connsess:%s send_error qnum:%v error:%v", exampid, tag, conn.Session(), qn, e.Error()) // Handle this ...... } if i == mc { break } if sw { dt := time.Duration(sngecomm.ValueBetween(min, max, sf)) ll.Printf("%stag:%s connsess:%s send_stagger id:%v d:%v qnum:%v stagger:%v\n", exampid, ltag, conn.Session(), id, d, qn, dt) tmr.Reset(dt) _ = <-tmr.C runtime.Gosched() } } // Sending is done ll.Printf("%stag:%s connsess:%s finish_info id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) wgs.Done() }
// Send messages to a particular queue func sender(conn *stompngo.Connection, qn, nmsgs int) { ltag := tag + "-sender" qns := fmt.Sprintf("%d", qn) // queue number d := sngecomm.Dest() + "." + qns ll.Printf("%stag:%s connsess:%s starts qn:%d nmsgs:%d d:%s\n", exampid, ltag, conn.Session(), qn, nmsgs, d) // wh := stompngo.Headers{"destination", d, "qnum", qns} // send Headers if senv.Persistent() { wh = wh.Add("persistent", "true") } // tmr := time.NewTimer(100 * time.Hour) // Send loop for i := 1; i <= nmsgs; i++ { si := fmt.Sprintf("%d", i) sh := append(wh, "msgnum", si) // Generate a message to send ............... ll.Printf("%stag:%s connsess:%s message qns:%s si:%s\n", exampid, ltag, conn.Session(), qns, si) e := conn.Send(sh, string(sngecomm.Partial())) if e != nil { ll.Fatalf("%stag:%s connsess:%s send_error qnum:%v error:%v", exampid, ltag, conn.Session(), qn, e.Error()) // Handle this ...... } if i == nmsgs { break } if sw { runtime.Gosched() // yield for this example dt := time.Duration(sngecomm.ValueBetween(min, max, sf)) ll.Printf("%stag:%s connsess:%s send_stagger dt:%v qns:%s\n", exampid, ltag, conn.Session(), dt, qns) tmr.Reset(dt) _ = <-tmr.C } } // Sending is done ll.Printf("%stag:%s connsess:%s sender_ends qn:%d nmsgs:%d\n", exampid, ltag, conn.Session(), qn, nmsgs) wgs.Done() }
/* runSender sends all messages to a specified queue. */ func runSender(conn *stompngo.Connection, qns string) { ltag := tag + "-runsender" d := sngecomm.Dest() + "." + qns id := stompngo.Uuid() // A unique sender id ll.Printf("%stag:%s connsess:%s start id:%s dest:%s\n", exampid, ltag, conn.Session(), id, d) wh := stompngo.Headers{"destination", d, "senderId", id, "qnum", qns} // basic send Headers if senv.Persistent() { wh = wh.Add("persistent", "true") } tmr := time.NewTimer(100 * time.Hour) nmsgs := senv.Nmsgs() for mc := 1; mc <= nmsgs; mc++ { sh := append(wh, "msgnum", fmt.Sprintf("%d", mc)) // Generate a message to send ............... ll.Printf("%stag:%s connsess:%s send id:%s qns:%s mc:%d\n", exampid, ltag, conn.Session(), id, qns, mc) e := conn.Send(sh, string(sngecomm.Partial())) if e != nil { ll.Fatalf("%stag:%s connsess:%s send_error qns:%v error:%v", exampid, ltag, conn.Session(), qns, e.Error()) // Handle this ...... } if mc == nmsgs { break } if sw { dt := time.Duration(sngecomm.ValueBetween(min, max, sf)) ll.Printf("%stag:%s connsess:%s send_stagger dt:%v qns:%s mc:%d\n", exampid, ltag, conn.Session(), dt, qns, mc) tmr.Reset(dt) _ = <-tmr.C runtime.Gosched() } } ll.Printf("%stag:%s connsess:%s end id:%s dest:%s\n", exampid, ltag, conn.Session(), id, d) // wgs.Done() }
func sendMessages(conn *stompngo.Connection, qnum int, nc net.Conn) { ltag := tag + "-sendmessages" qns := fmt.Sprintf("%d", qnum) // queue number d := sngecomm.Dest() + "." + qns ll.Printf("%stag:%s connsess:%s start d:%s qnum:%d\n", exampid, ltag, conn.Session(), d, qnum) wh := stompngo.Headers{"destination", d, "qnum", qns} // send Headers if senv.Persistent() { wh = wh.Add("persistent", "true") } // tmr := time.NewTimer(100 * time.Hour) // Send messages for mc := 1; mc <= nmsgs; mc++ { mcs := fmt.Sprintf("%d", mc) sh := append(wh, "msgnum", mcs) // Generate a message to send ............... ll.Printf("%stag:%s connsess:%s message mc:%d qnum:%d\n", exampid, ltag, conn.Session(), mc, qnum) e := conn.Send(sh, string(sngecomm.Partial())) if e != nil { ll.Fatalf("%stag:%s connsess:%s send_error qnum:%v error:%v", exampid, ltag, conn.Session(), qnum, e.Error()) // Handle this ...... } if mc == nmsgs { break } if sw { runtime.Gosched() // yield for this example dt := time.Duration(sngecomm.ValueBetween(min, max, sf)) ll.Printf("%stag:%s connsess:%s send_stagger dt:%v qnum:%s mc:%d\n", exampid, ltag, conn.Session(), dt, qnum, mc) tmr.Reset(dt) _ = <-tmr.C } } }
/* runReceive receives all messages from a specified queue. */ func runReceive(conn *stompngo.Connection, q int, w *sync.WaitGroup) { ltag := tag + "-runreceive" qns := fmt.Sprintf("%d", q) // queue number id := stompngo.Uuid() // A unique subscription ID d := sngecomm.Dest() + "." + qns ll.Printf("%stag:%s connsess:%s starts id:%s qns:%s d:%s\n", exampid, ltag, conn.Session(), id, qns, d) // Subscribe (use common helper) sc := sngecomm.HandleSubscribe(conn, d, id, sngecomm.AckMode()) ll.Printf("%stag:%s connsess:%s subscribe_done id:%s qns:%s d:%s\n", exampid, ltag, conn.Session(), id, qns, d) // tmr := time.NewTimer(100 * time.Hour) pbc := sngecomm.Pbc() // Print byte count nmsgs := senv.Nmsgs() // Receive loop var md stompngo.MessageData for mc := 1; mc <= nmsgs; mc++ { ll.Printf("%stag:%s connsess:%s chanchek id:%s qns:%s lensc:%d capsc:%d\n", exampid, ltag, conn.Session(), id, qns, len(sc), cap(sc)) select { case md = <-sc: case md = <-conn.MessageData: // Frames RECEIPT or ERROR not expected here ll.Fatalf("%stag:%s connsess:%s send_error qns:%v md:%v", exampid, ltag, conn.Session(), qns, md) // Handle this ...... } if md.Error != nil { ll.Fatalf("%stag:%s connsess:%s receive_error qns:%v error:%v\n", exampid, ltag, conn.Session(), qns, md.Error) } // Process the inbound message ................. ll.Printf("%stag:%s connsess:%s inbound id:%s qns:%s mc:%d\n", exampid, ltag, conn.Session(), id, qns, mc) // Sanity check the message Command, and the queue and message numbers mns := fmt.Sprintf("%d", mc) // string message number if md.Message.Command != stompngo.MESSAGE { ll.Fatalf("%stag:%s connsess:%s bad_frame qns:%s mc:%d md:%v\n", exampid, ltag, conn.Session(), qns, mc, md) } if !md.Message.Headers.ContainsKV("qnum", qns) || !md.Message.Headers.ContainsKV("msgnum", mns) { ll.Fatalf("%stag:%s connsess:%s dirty_message qns:%v msgnum:%v md:%v", exampid, tag, conn.Session(), qns, mns, md) // Handle this ...... } sl := len(md.Message.Body) if pbc > 0 { sl = pbc if len(md.Message.Body) < sl { sl = len(md.Message.Body) } } ll.Printf("%stag:%s connsess:%s runReceive_recv_message id:%s body:%s qns:%s msgnum:%s\n", exampid, ltag, conn.Session(), id, string(md.Message.Body[0:sl]), qns, md.Message.Headers.Value("msgnum")) // Handle ACKs if needed if sngecomm.AckMode() != "auto" { ah := stompngo.Headers{} sngecomm.HandleAck(conn, ah, id) } if mc == nmsgs { break } if rw { dt := time.Duration(sngecomm.ValueBetween(min, max, rf)) ll.Printf("%stag:%s connsess:%s recv_stagger dt:%v qns:%s mc:%d\n", exampid, ltag, conn.Session(), dt, qns, mc) tmr.Reset(dt) _ = <-tmr.C runtime.Gosched() } } // Unsubscribe sngecomm.HandleUnsubscribe(conn, d, id) ll.Printf("%stag:%s connsess:%s runRecieve_ends id:%s qns:%s\n", exampid, ltag, conn.Session(), id, qns) w.Done() }
// Asynchronously process all messages for a given subscription. func receiveWorker(sc <-chan stompngo.MessageData, qns string, nmsgs int, qc chan<- bool, conn *stompngo.Connection, id string) { // ltag := tag + "-receiveWorker" tmr := time.NewTimer(100 * time.Hour) pbc := sngecomm.Pbc() // Print byte count // Receive loop var md stompngo.MessageData for i := 1; i <= nmsgs; i++ { select { case md = <-sc: case md = <-conn.MessageData: // Frames RECEIPT or ERROR not expected here ll.Fatalf("%stag:%s connsess:%s bad_frame qns:%v md:%v", exampid, ltag, conn.Session(), qns, md) // Handle this ...... } if md.Error != nil { ll.Fatalf("%stag:%s connsess:%s recv_error qns:%v error:%v", exampid, ltag, conn.Session(), qns, md.Error) // Handle this ...... } // Sanity check the queue and message numbers mns := fmt.Sprintf("%d", i) // message number if !md.Message.Headers.ContainsKV("qnum", qns) || !md.Message.Headers.ContainsKV("msgnum", mns) { ll.Fatalf("%stag:%s connsess:%s dirty_message qnum:%v msgnum:%v md:%v", exampid, ltag, conn.Session(), qns, mns, md) // Handle this ...... } // Process the inbound message ................. sl := len(md.Message.Body) if pbc > 0 { sl = pbc if len(md.Message.Body) < sl { sl = len(md.Message.Body) } } // Handle ACKs if needed if sngecomm.AckMode() != "auto" { ah := []string{} sngecomm.HandleAck(conn, ah, id) } ll.Printf("%stag:%s connsess:%s recv_message body:%s qns:%s msgnum:%s i:%v\n", exampid, ltag, conn.Session(), string(md.Message.Body[0:sl]), qns, md.Message.Headers.Value("msgnum"), i) if i == nmsgs { break } if rw { runtime.Gosched() // yield for this example dt := time.Duration(sngecomm.ValueBetween(min, max, rf)) ll.Printf("%stag:%s connsess:%s recv_stagger dt:%v qns:%s\n", exampid, ltag, conn.Session(), dt, qns) tmr.Reset(dt) _ = <-tmr.C } } // qc <- true }
func receiveMessages(conn *stompngo.Connection, qnum int, nc net.Conn) { ltag := tag + "-receivemessages" qns := fmt.Sprintf("%d", qnum) // queue number d := sngecomm.Dest() + "." + qns id := stompngo.Uuid() // A unique subscription ID ll.Printf("%stag:%s connsess:%s receiveMessages_start id:%s d:%s qnum:%d nmsgs:%d\n", exampid, ltag, conn.Session(), id, d, qnum, nmsgs) // Subscribe sc := sngecomm.HandleSubscribe(conn, d, id, sngecomm.AckMode()) pbc := sngecomm.Pbc() // Print byte count // tmr := time.NewTimer(100 * time.Hour) var md stompngo.MessageData for mc := 1; mc <= nmsgs; mc++ { select { case md = <-sc: case md = <-conn.MessageData: // Frames RECEIPT or ERROR not expected here ll.Fatalf("%stag:%s connsess:%s send_error qns:%v md:%v", exampid, ltag, conn.Session(), qns, md) // Handle this ...... } if md.Error != nil { ll.Fatalf("%stag:%s connsess:%s receive_error qns:%v error:%v\n", exampid, ltag, conn.Session(), qns, md.Error) } if md.Message.Command != stompngo.MESSAGE { ll.Fatalf("%stag:%s connsess:%s bad_frame qns:%s mc:%d md:%v\n", exampid, ltag, conn.Session(), qns, mc, md) } mcs := fmt.Sprintf("%d", mc) // message number if !md.Message.Headers.ContainsKV("qnum", qns) || !md.Message.Headers.ContainsKV("msgnum", mcs) { ll.Fatalf("%stag:%s connsess:%s dirty_message qns:%v msgnum:%v md:%v", exampid, tag, conn.Session(), qns, mcs, md) // Handle this ...... } // Process the inbound message ................. sl := len(md.Message.Body) if pbc > 0 { sl = pbc if len(md.Message.Body) < sl { sl = len(md.Message.Body) } } ll.Printf("%stag:%s connsess:%s receiveMessages_msg d:%s body:%s qnum:%d msgnum:%s\n", exampid, ltag, conn.Session(), d, string(md.Message.Body[0:sl]), qnum, md.Message.Headers.Value("msgnum")) if mc == nmsgs { break } // Handle ACKs if needed if sngecomm.AckMode() != "auto" { ah := []string{} sngecomm.HandleAck(conn, ah, id) } if mc == nmsgs { break } // if rw { runtime.Gosched() // yield for this example dt := time.Duration(sngecomm.ValueBetween(min, max, rf)) ll.Printf("%stag:%s connsess:%s recv_stagger dt:%v qns:%s mc:%d\n", exampid, ltag, conn.Session(), dt, qns, mc) tmr.Reset(dt) _ = <-tmr.C } } ll.Printf("%stag:%s connsess:%s end d:%s qnum:%d nmsgs:%d\n", exampid, ltag, conn.Session(), d, qnum, nmsgs) // Unsubscribe sngecomm.HandleUnsubscribe(conn, d, id) // }
// Receive messages from a particular queue func receiver(qn, mc int) { ltag := tag + "-receiver" qns := fmt.Sprintf("%d", qn) // string queue number pbc := sngecomm.Pbc() id := stompngo.Uuid() // A unique subscription ID d := sngecomm.Dest() + "." + qns ll.Printf("%stag:%s connsess:%s queue_info id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) // Subscribe sc := sngecomm.HandleSubscribe(conn, d, id, sngecomm.AckMode()) ll.Printf("%stag:%s connsess:%s subscribe_complete id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) // tmr := time.NewTimer(100 * time.Hour) var md stompngo.MessageData // Receive loop for i := 1; i <= mc; i++ { ll.Printf("%stag:%s connsess:%s recv_ranchek id:%v d:%v qnum:%v mc:%v chlen:%v chcap:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc, len(sc), cap(sc)) select { case md = <-sc: case md = <-conn.MessageData: // A RECEIPT or ERROR frame is unexpected here ll.Fatalf("%stag:%s connsess:%s bad_frame qnum:%v headers:%v body:%s", exampid, tag, conn.Session(), qn, md.Message.Headers, md.Message.Body) // Handle this ...... } if md.Error != nil { ll.Fatalf("%stag:%s connsess:%s recv_error qnum:%v error:%v", exampid, tag, conn.Session(), qn, md.Error) // Handle this ...... } // Process the inbound message ................. ll.Printf("%stag:%s connsess:%s recv_message qnum:%v i:%v\n", exampid, tag, conn.Session(), qn, i) if pbc > 0 { maxlen := pbc if len(md.Message.Body) < maxlen { maxlen = len(md.Message.Body) } ss := string(md.Message.Body[0:maxlen]) ll.Printf("%stag:%s connsess:%s payload qnum:%v body:%s\n", exampid, tag, conn.Session(), qn, ss) } // Sanity check the message Command, and the queue and message numbers mns := fmt.Sprintf("%d", i) // message number if md.Message.Command != stompngo.MESSAGE { ll.Fatalf("%stag:%s connsess:%s bad_frame qnum:%v command:%v headers:%v body:%v\n", exampid, tag, conn.Session(), qn, md.Message.Command, md.Message.Headers, string(md.Message.Body)) // Handle this ...... } if !md.Message.Headers.ContainsKV("qnum", qns) || !md.Message.Headers.ContainsKV("msgnum", mns) { ll.Fatalf("%stag:%s connsess:%s dirty_message qns:%v msgnum:%v command:%v headers:%v body:%v\n", exampid, tag, conn.Session(), qns, mns, md.Message.Command, md.Message.Headers, string(md.Message.Body)) // Handle this ......) // Handle this ...... } if i == mc { break } if rw { dt := time.Duration(sngecomm.ValueBetween(min, max, rf)) ll.Printf("%stag:%s connsess:%s recv_stagger id:%v d:%v qnum:%v stagger:%v\n", exampid, ltag, conn.Session(), id, d, qn, dt) tmr.Reset(dt) _ = <-tmr.C runtime.Gosched() } // Handle ACKs if needed if sngecomm.AckMode() != "auto" { sngecomm.HandleAck(conn, md.Message.Headers, id) } } // Unsubscribe sngecomm.HandleUnsubscribe(conn, d, id) ll.Printf("%stag:%s connsess:%s unsubscribe_complete id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) // Receiving is done ll.Printf("%stag:%s connsess:%s recv_end id:%v d:%v qnum:%v mc:%v\n", exampid, ltag, conn.Session(), id, d, qn, mc) wgr.Done() }