@@ -2,45 +2,43 @@ package quickfix
22
33import (
44 "bufio"
5+ "io"
56 "net"
7+ "time"
68)
79
810//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
1813 session := activate (sessID )
1914 if session == nil {
2015 log .OnEventf ("Session not found for SessionID: %v" , sessID )
2116 return
2217 }
23- defer func () {
24- deactivate (sessID )
25- }()
2618
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 )
3320
34- reader := bufio .NewReader (netConn )
35- parser := newParser (reader )
21+ for {
22+ msgIn := make (chan fixIn )
23+ msgOut := make (chan []byte )
3624
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+ }
4229
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+ }
4442}
4543
4644//Picks up session from net.Conn Acceptor
@@ -96,32 +94,25 @@ func handleAcceptorConnection(netConn net.Conn, qualifiedSessionIDs map[SessionI
9694 deactivate (qualifiedSessID )
9795 }()
9896
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-
10597 msgIn := make (chan fixIn )
106- go writeLoop (netConn , msgOut )
98+ msgOut := make (chan []byte )
99+
107100 go func () {
108101 msgIn <- fixIn {msgBytes , parser .lastRead }
109102 readLoop (parser , msgIn )
110103 }()
111104
112- session .run (msgIn , quit )
105+ go session .accept (msgIn , msgOut , quit )
106+ writeLoop (netConn , msgOut )
113107}
114108
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 ) {
121110 for {
122- if msg = <- messageOut ; msg == nil {
111+ msg , ok := <- messageOut
112+ if ! ok {
123113 return
124114 }
115+
125116 connection .Write (msg )
126117 }
127118}
@@ -133,17 +124,9 @@ func readLoop(parser *parser, msgIn chan fixIn) {
133124
134125 for {
135126 msg , err := parser .ReadMessage ()
136-
137127 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
147129 }
130+ msgIn <- fixIn {msg , parser .lastRead }
148131 }
149132}
0 commit comments