@@ -2,45 +2,43 @@ package quickfix
2
2
3
3
import (
4
4
"bufio"
5
+ "io"
5
6
"net"
7
+ "time"
6
8
)
7
9
8
10
//Picks up session from net.Conn Initiator
9
- func handleInitiatorConnection (netConn net.Conn , log Log , sessID SessionID , quit chan bool ) {
10
- defer func () {
11
- if err := recover (); err != nil {
12
- log .OnEventf ("Connection Terminated: %v" , err )
13
- }
14
-
15
- netConn .Close ()
16
- }()
17
-
11
+ func handleInitiatorConnection (address string , log Log , sessID SessionID , quit chan bool ) {
12
+ reconnectInterval := 30 * time .Second
18
13
session := activate (sessID )
19
14
if session == nil {
20
15
log .OnEventf ("Session not found for SessionID: %v" , sessID )
21
16
return
22
17
}
23
- defer func () {
24
- deactivate (sessID )
25
- }()
26
18
27
- var msgOut chan []byte
28
- var err error
29
- if msgOut , err = session .initiate (); err != nil {
30
- log .OnEventf ("Session cannot initiate: %v" , err )
31
- return
32
- }
19
+ defer deactivate (sessID )
33
20
34
- reader := bufio .NewReader (netConn )
35
- parser := newParser (reader )
21
+ for {
22
+ msgIn := make (chan fixIn )
23
+ msgOut := make (chan []byte )
36
24
37
- msgIn := make (chan fixIn )
38
- go writeLoop (netConn , msgOut )
39
- go func () {
40
- readLoop (parser , msgIn )
41
- }()
25
+ netConn , err := net .Dial ("tcp" , address )
26
+ if err != nil {
27
+ goto reconnect
28
+ }
42
29
43
- session .run (msgIn , quit )
30
+ go readLoop (newParser (bufio .NewReader (netConn )), msgIn )
31
+ go func () {
32
+ writeLoop (netConn , msgOut )
33
+ netConn .Close ()
34
+ }()
35
+ session .initiate (msgIn , msgOut , quit )
36
+
37
+ reconnect:
38
+ log .OnEventf ("%v Reconnecting in %v" , sessID , reconnectInterval )
39
+ time .Sleep (reconnectInterval )
40
+ continue
41
+ }
44
42
}
45
43
46
44
//Picks up session from net.Conn Acceptor
@@ -96,32 +94,25 @@ func handleAcceptorConnection(netConn net.Conn, qualifiedSessionIDs map[SessionI
96
94
deactivate (qualifiedSessID )
97
95
}()
98
96
99
- var msgOut chan []byte
100
- if msgOut , err = session .accept (); err != nil {
101
- log .OnEventf ("Session cannot accept: %v" , err )
102
- return
103
- }
104
-
105
97
msgIn := make (chan fixIn )
106
- go writeLoop (netConn , msgOut )
98
+ msgOut := make (chan []byte )
99
+
107
100
go func () {
108
101
msgIn <- fixIn {msgBytes , parser .lastRead }
109
102
readLoop (parser , msgIn )
110
103
}()
111
104
112
- session .run (msgIn , quit )
105
+ go session .accept (msgIn , msgOut , quit )
106
+ writeLoop (netConn , msgOut )
113
107
}
114
108
115
- func writeLoop (connection net.Conn , messageOut chan []byte ) {
116
- defer func () {
117
- close (messageOut )
118
- }()
119
-
120
- var msg []byte
109
+ func writeLoop (connection io.Writer , messageOut chan []byte ) {
121
110
for {
122
- if msg = <- messageOut ; msg == nil {
111
+ msg , ok := <- messageOut
112
+ if ! ok {
123
113
return
124
114
}
115
+
125
116
connection .Write (msg )
126
117
}
127
118
}
@@ -133,17 +124,9 @@ func readLoop(parser *parser, msgIn chan fixIn) {
133
124
134
125
for {
135
126
msg , err := parser .ReadMessage ()
136
-
137
127
if err != nil {
138
- switch err .(type ) {
139
- //ignore message parser errors
140
- case parseError :
141
- continue
142
- default :
143
- return
144
- }
145
- } else {
146
- msgIn <- fixIn {msg , parser .lastRead }
128
+ return
147
129
}
130
+ msgIn <- fixIn {msg , parser .lastRead }
148
131
}
149
132
}
0 commit comments