// Handle a unsubscribe for the different protocol levels. func HandleUnsubscribe(c *stompngo.Connection, d, i string) { sbh := stompngo.Headers{} // switch c.Protocol() { case stompngo.SPL_12: sbh = sbh.Add("id", i) case stompngo.SPL_11: sbh = sbh.Add("id", i) case stompngo.SPL_10: sbh = sbh.Add("destination", d) default: llu.Fatalf("v1:%v v2:%v\n", "unsubscribe invalid protocol level, should not happen") } e := c.Unsubscribe(sbh) if e != nil { llu.Fatalf("v1:%v v2:%v d:%v\n", "unsubscribe failed", e, d) } return }
func recMessages(c *stompngo.Connection, q string, k int) { var error error ks := fmt.Sprintf("%d", k) // Receive phase headers := stompngo.Headers{"destination", q} sh := headers.Add("id", q) // log.Println("start subscribe", q) sc, error := c.Subscribe(sh) log.Println("end subscribe", q) if error != nil { log.Fatal(error) } for input := range sc { inmsg := input.Message.BodyString() if printMsgs { log.Println("Receive:", q, " / ", inmsg) } if inmsg == "***EOF***" { break } if !strings.HasPrefix(inmsg, ks) { log.Printf("bad prefix: [%v], [%v], [%v]\n", q, inmsg, ks) log.Fatal("bad prefix ....") } // d := time.Duration(getStagger(1e9/10, 1e9/5)) time.Sleep(d) } log.Println("quit for", q) error = c.Unsubscribe(headers) log.Println("end unsubscribe", q) if error != nil { log.Fatal(error) } wgrecv.Done() }
func recMessages(c *stompngo.Connection, q string) { var error error fmt.Printf("Start for q: %s\n", q) // Receive phase headers := stompngo.Headers{"destination", q} // no ID here. 1.1 library should provide fmt.Printf("qhdrs: %v\n", headers) sc, error := c.Subscribe(headers) if error != nil { // Handle error properly fmt.Printf("sub error: %v\n", error) } first := true firstSub := "" for input := range sc { inmsg := string(input.Message.Body) if printHdrs { fmt.Println("queue:", q, "Next Receive: ", input.Message.Headers) } if printMsgs { fmt.Println("queue:", q, "Next Receive: ", inmsg) } firstSub = input.Message.Headers.Value("subscription") if first { if firstSub == "" { panic("first subscription header is empty") } fmt.Println("queue:", q, "FirstSub: ", firstSub) first = false } else { if firstSub != input.Message.Headers.Value("subscription") { panic(firstSub + " / " + input.Message.Headers.Value("subscription")) } } time.Sleep(1e9 / 100) // Crudely simulate message processing incrCtl.Lock() numRecv++ incrCtl.Unlock() if strings.HasPrefix(inmsg, "***EOF***") { fmt.Println("queue:", q, "FirstSub:", firstSub, "goteof") break } if !strings.HasPrefix(inmsg, q) { fmt.Printf("bad prefix: %v, %v\n", q, inmsg) panic("bad prefix ....") } // Poll for adhoc errors select { case v := <-c.MessageData: fmt.Printf("frameError: %v\n", v.Message) fmt.Printf("frameError: [%v] [%v]\n", q, firstSub) default: fmt.Println("Nothing to show") } } uh := stompngo.Headers{"id", firstSub, "destination", q} error = c.Unsubscribe(uh) if error != nil { log.Fatalf("unsub error: %v\n", error) } wg.Done() }