mirror of
https://github.com/wassname/catalyst.git
synced 2026-09-11 12:00:50 +08:00
send sockets have zero linger, sync object now serves as heartbeat, components die on error, all components error on heartbeat timeout
This commit is contained in:
+21
-15
@@ -25,32 +25,38 @@ class TestClient(object):
|
||||
qutil.LOGGER.info("connecting to {address}".format(address=self.address))
|
||||
self.data_feed.connect(self.address)
|
||||
|
||||
self.sync.confirm()
|
||||
self.sync.open()
|
||||
|
||||
self.poller = zmq.Poller()
|
||||
self.poller.register(self.data_feed, zmq.POLLIN)
|
||||
|
||||
qutil.LOGGER.info("Starting the client loop")
|
||||
|
||||
prev_dt = None
|
||||
while True:
|
||||
msg = self.data_feed.recv()
|
||||
if(msg == "DONE"):
|
||||
qutil.LOGGER.info("DONE!")
|
||||
break
|
||||
self.received_count += 1
|
||||
event = json.loads(msg)
|
||||
if(prev_dt != None):
|
||||
if(not event['dt'] >= prev_dt):
|
||||
raise Exception("Message out of order: {date} after {prev}".format(date=event['dt'], prev=prev_dt))
|
||||
while self.sync.confirm():
|
||||
socks = dict(self.poller.poll(2000)) #timeout after 2 seconds.
|
||||
if self.data_feed in socks and socks[self.data_feed] == zmq.POLLIN:
|
||||
msg = self.data_feed.recv()
|
||||
if(msg == "DONE"):
|
||||
qutil.LOGGER.info("DONE!")
|
||||
break
|
||||
self.received_count += 1
|
||||
event = json.loads(msg)
|
||||
if(prev_dt != None):
|
||||
if(not event['dt'] >= prev_dt):
|
||||
raise Exception("Message out of order: {date} after {prev}".format(date=event['dt'], prev=prev_dt))
|
||||
|
||||
prev_dt = event['dt']
|
||||
if(self.received_count % 100 == 0):
|
||||
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
|
||||
prev_dt = event['dt']
|
||||
if(self.received_count % 100 == 0):
|
||||
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
|
||||
|
||||
qutil.LOGGER.info("received {n} messages".format(n=self.received_count))
|
||||
except:
|
||||
self.error = True
|
||||
qutil.LOGGER.exception("Error in test client.")
|
||||
qutil.LOGGER.exception("**********************Error in test client.")
|
||||
finally:
|
||||
self.data_feed.close()
|
||||
self.sync.close()
|
||||
self.context.term()
|
||||
|
||||
self.utest.assertEqual(self.expected_msg_count, self.received_count,
|
||||
|
||||
@@ -5,11 +5,13 @@ Test suite for the messaging infrastructure of QSim.
|
||||
|
||||
import unittest2 as unittest
|
||||
import multiprocessing
|
||||
import time
|
||||
|
||||
from qsim.core import Simulator
|
||||
from qsim.core import Simulator, DataFeed
|
||||
from qsim.transforms.technical import MovingAverage
|
||||
from qsim.sources import RandomEquityTrades
|
||||
import qsim.util as qutil
|
||||
import qsim.messaging as qmsg
|
||||
|
||||
from qsim.test.client import TestClient
|
||||
|
||||
@@ -56,3 +58,26 @@ class MessagingTestCase(unittest.TestCase):
|
||||
|
||||
self.assertEqual(sim.feed.data_buffer.pending_messages(), 0, "The feed should be drained of all messages.")
|
||||
|
||||
def test_zerror_in_feed(self):
|
||||
ret1 = RandomEquityTrades(133, "ret1", 400)
|
||||
ret2 = RandomEquityTrades(134, "ret2", 400)
|
||||
sources = {"ret1":ret1, "ret2":ret2}
|
||||
mavg1 = MovingAverage("mavg1", 30)
|
||||
mavg2 = MovingAverage("mavg2", 60)
|
||||
transforms = {"mavg1":mavg1, "mavg2":mavg2}
|
||||
client = TestClient(self, expected_msg_count=0)
|
||||
sim = Simulator(sources, transforms, client)
|
||||
sim.feed = DataFeedErr(sources.keys(), sim.data_address, sim.feed_address, qmsg.Sync(sim, "DataFeedErrorGenerator"))
|
||||
sim.simulate()
|
||||
|
||||
class DataFeedErr(DataFeed):
|
||||
"""Helper class for testing, simulates exceptions inside the DataFeed"""
|
||||
|
||||
def __init__(self, source_list, data_address, feed_address, sync):
|
||||
DataFeed.__init__(self, source_list, data_address, feed_address, sync)
|
||||
|
||||
def handle_all(self):
|
||||
#time.sleep(1000)
|
||||
raise Exception("simulated error in data feed from test helper")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user