@@ -66,18 +66,17 @@ func (d *ZmqDriver) Prepare() error {
66
66
67
67
func (d * ZmqDriver ) Init () error {
68
68
d .lock .Lock ()
69
+ defer d .lock .Unlock ()
69
70
d .context , _ = zmq .NewContext ()
70
71
d .publisher , _ = d .context .NewSocket (zmq .PUB )
71
72
if err := d .publisher .Bind (d .listenAddress ); err != nil {
72
- d .lock .Unlock ()
73
73
log .Fatalf ("Unable to bind: %s" , err .Error ())
74
74
}
75
75
76
76
log .Infof ("Started ZMQ listener on: %s" , d .listenAddress )
77
77
78
78
// Ensure subscriber connection has time to complete
79
79
time .Sleep (time .Second )
80
- d .lock .Unlock ()
81
80
return nil
82
81
}
83
82
@@ -91,6 +90,9 @@ func (d *ZmqDriver) Send(key, data []byte) error {
91
90
}
92
91
93
92
msg_len := uint16 (len (data ))
93
+ // Lock before creating zmq header to ensure messageId is unique
94
+ d .lock .Lock ()
95
+ defer d .lock .Unlock ()
94
96
header := d .newZmqHeader (msg_len )
95
97
96
98
// send our header with the topic first as a multi-part message
@@ -100,26 +102,21 @@ func (d *ZmqDriver) Send(key, data []byte) error {
100
102
return err
101
103
}
102
104
103
- d .lock .Lock ()
104
105
bytes , err := d .publisher .SendBytes (hbytes , zmq .SNDMORE )
105
106
if err != nil {
106
107
log .Errorf ("Unable to send header: %s" , err .Error ())
107
- d .lock .Unlock ()
108
108
return err
109
109
}
110
110
if bytes != len (hbytes ) {
111
111
log .Errorf ("Wrote the wrong number of header bytes: %d" , bytes )
112
- d .lock .Unlock ()
113
112
return err
114
113
}
115
114
116
115
// now send the actual payload
117
116
if _ , err = d .publisher .SendBytes (data , 0 ); err != nil {
118
117
log .Error (err )
119
- d .lock .Unlock ()
120
118
return err
121
119
}
122
- d .lock .Unlock ()
123
120
124
121
switch d .msgType {
125
122
case PBUF :
0 commit comments