1//
2//  Synchronized publisher.
3//
4
5package main
6
7import (
8	zmq "github.com/pebbe/zmq4"
9
10	"fmt"
11)
12
13const (
14	//  We wait for 10 subscribers
15	SUBSCRIBERS_EXPECTED = 10
16)
17
18func main() {
19
20	ctx, _ := zmq.NewContext()
21	defer ctx.Term()
22
23	//  Socket to talk to clients
24	publisher, _ := ctx.NewSocket(zmq.PUB)
25	defer publisher.Close()
26	publisher.SetSndhwm(1100000)
27	publisher.Bind("tcp://*:5561")
28
29	//  Socket to receive signals
30	syncservice, _ := ctx.NewSocket(zmq.REP)
31	defer syncservice.Close()
32	syncservice.Bind("tcp://*:5562")
33
34	//  Get synchronization from subscribers
35	fmt.Println("Waiting for subscribers")
36	for subscribers := 0; subscribers < SUBSCRIBERS_EXPECTED; subscribers++ {
37		//  - wait for synchronization request
38		syncservice.Recv(0)
39		//  - send synchronization reply
40		syncservice.Send("", 0)
41	}
42	//  Now broadcast exactly 1M updates followed by END
43	fmt.Println("Broadcasting messages")
44	for update_nbr := 0; update_nbr < 1000000; update_nbr++ {
45		publisher.Send("Rhubarb", 0)
46	}
47
48	publisher.Send("END", 0)
49
50}
51