I'm implementing the Espresso Pattern of ZMQ.
I want to connect many subscribers <> Proxy <> many publishers
However, the listener in the proxy only receives messages from one publisher. Hence, the subscribers only receive from that particular publisher. I can't figure out what's the problem with my code.
package playground
import (
zmq "github.com/pebbe/zmq4"
"fmt"
"math/rand"
"time"
"testing"
)
func subscriber_thread(id int) {
subscriber, _ := zmq.NewSocket(zmq.SUB)
subscriber.Connect("tcp://localhost:6001")
subscriber.SetSubscribe("")
defer subscriber.Close()
for {
msg, err := subscriber.RecvMessage(0)
if err != nil {
panic(err)
}
fmt.Println("subscriber id:", id,"received:", msg)
}
}
func publisher_thread(n int) {
publisher, _ := zmq.NewSocket(zmq.PUB)
publisher.Bind("tcp://*:6000")
for {
s := fmt.Sprintf("%c-%05d", n +'A', rand.Intn(100000))
_, err := publisher.SendMessage(s)
if err != nil {
panic(err)
}
fmt.Println("publisher sent:", s)
time.Sleep(100 * time.Millisecond) // Wait for 1/10th second
}
}
// The listener receives all messages flowing through the proxy, on its
// pipe. In CZMQ, the pipe is a pair of ZMQ_PAIR sockets that connects
// attached child threads. In other languages your mileage may vary:
func listener_thread() {
pipe, _ := zmq.NewSocket(zmq.PAIR)
pipe.Bind("inproc://pipe")
// Print everything that arrives on pipe
for {
msg, err := pipe.RecvMessage(0)
if err != nil {
break // Interrupted
}
fmt.Printf("%q
", msg)
}
}
func TestZmqEspresso(t *testing.T) {
go publisher_thread(0)
go publisher_thread(1)
go publisher_thread(2)
go subscriber_thread(1)
go subscriber_thread(2)
go listener_thread()
time.Sleep(100 * time.Millisecond)
subscriber, _ := zmq.NewSocket(zmq.XSUB)
subscriber.Connect("tcp://localhost:6000")
publisher, _ := zmq.NewSocket(zmq.XPUB)
publisher.Bind("tcp://*:6001")
listener, _ := zmq.NewSocket(zmq.PAIR)
listener.Connect("inproc://pipe")
zmq.Proxy(subscriber, publisher, listener)
fmt.Println("interrupted")
}