protected override void OnReceive(object message) { PersistenceRequest pr = message as PersistenceRequest; if (pr != null) { switch (pr.Type) { case PersistenceType.OPEN: _log.Debug("初始化,并打开Session"); // _init(); // _openSession(); break; case PersistenceType.SAVE: _save(pr.Body); break; case PersistenceType.LOAD: break; case PersistenceType.CLOSE: _log.Debug("关闭Session"); // _closeSession(); break; default: break; } } }
protected void _init() { _log.Debug("加载{0}策略的仓位信息", Desc.Id); String path = String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_PERSISTENCE); persistenceActor = Context.ActorSelection(path); PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.FIND, Body = String.Format("from EStrategy where Id={0}", Desc.Id) }; var ret = persistenceActor.Ask <EStrategy>(req, TimeSpan.FromSeconds(1)); ret.Wait(); Desc = ret.Result; _log.Debug("{0}策略连接交易接口", Desc.Id); if (Desc.Trader != null) { String tpath = String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_TRADER, Desc.Trader.Id); tradeActor = Context.ActorSelection(tpath); } else { // 默认的trade actor is /user/trader/ths tradeActor = Context.ActorSelection("/user/trader"); } onInit(); }
protected void sellSecurities(Securities securities, float price, int amount) { // 下单 Order order = _createOrder(securities, price, amount, OrderType.SELL); _notifyTrader(order); // 修改可用数量 foreach (EStockHolder shi in this.Desc.Holders) { if (shi.Symbol == securities.Symbol) { shi.EnableAmount -= amount; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.UPDATE, Body = shi }; persistenceActor.Tell(req); } } // 修改可用资金 float usedBanlance = price * amount; Desc.EnableBalance += usedBanlance; PersistenceRequest req2 = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = Desc }; persistenceActor.Tell(req2); }
protected void _init() { _log.Info("加载{0}策略的仓位信息", Desc.Id); try { String path = String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_PERSISTENCE); persistenceActor = Context.ActorSelection(path); PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.FIND, Body = String.Format("from EStrategy where Id={0}", Desc.Id) }; var ret = persistenceActor.Ask <EStrategy>(req, TimeSpan.FromSeconds(10)); ret.Wait(); Desc = ret.Result; } catch (Exception e) { _log.Error("发生异常 {0}", e.StackTrace); showLog(String.Format("必须重新启动,策略{0}加载超时", Desc.Id)); } _log.Info("{0}策略连接交易接口", Desc.Id); if (Desc.Trader != null) { String tpath = String.Format("/user/{0}/{1}", ConstantsHelper.AKKA_PATH_TRADER, Desc.Trader.Id); tradeActor = Context.ActorSelection(tpath); } else { // 默认的trade actor is /user/trader/ths // tradeActor = Context.ActorSelection("/user/trader"); } onInit(); }
public void TestServiceStackREST() { client = new JsonServiceClient(Environment.ServiceUrl); Environment.Log.Info("TestServiceStackREST"); ProductDTO product1 = new ProductDTO(); product1.RefCode = ProductRef1; product1.Caption = ProductCaption1; ProductRequest prq1 = new ProductRequest(); prq1.ProductDTO = product1; ProductResponse prr1 = client.Post <ProductResponse>("/ProductService", prq1); Assert.IsFalse(prr1.CommitResult.HasError, prr1.CommitResult.Message); product1 = prr1.ProductDTO; Assert.AreNotEqual(0, product1.Id, "Invalid Id"); Environment.Log.InfoFormat("1: product1.Id: {0}", product1.Id); ProductResponse prr2 = client.Delete <ProductResponse>(String.Format("/ProductService/Id/{0}", product1.Id)); Assert.IsFalse(prr2.CommitResult.HasError, prr2.CommitResult.Message); ProductDTO product2 = new ProductDTO(); product2.RefCode = ProductRef2; product2.Caption = ProductCaption2; UnitOfWorkDTO uow = new UnitOfWorkDTO(); uow.Save(product2); Environment.Log.InfoFormat("1: product2.Id: {0}", product2.Id); PersistenceRequest pr2 = new PersistenceRequest(); pr2.UnitOfWork = uow; PersistenceResponse ps2 = client.Post <PersistenceResponse>("/Persistence", pr2); Assert.IsFalse(ps2.CommitResult.HasError, ps2.CommitResult.Message); ps2.UpdatedObjects.Update <ProductDTO>(ref product2); Assert.AreNotEqual(0, product2.Id, "Invalid Id"); ProductResponse prr3 = client.Get <ProductResponse>("/ProductService/Id/" + product2.Id); Assert.IsNotNull(prr3.ProductDTO); ProductListResponse prodList = client.Get <ProductListResponse>("/ProductService"); foreach (ProductDTO prod in prodList.ProductDTOList) { if (prod.RefCode == ProductRef1 || prod.RefCode == ProductRef2) { client.Delete <ProductResponse>(String.Format("/ProductService/Id/{0}", prod.Id)); } } client.Dispose(); }
protected override void OnReceive(object message) { try { PersistenceRequest pr = message as PersistenceRequest; if (pr != null) { switch (pr.Type) { case PersistenceType.INIT_DATABASE: _createTables(); break; case PersistenceType.OPEN: _log.Debug("初始化,并打开Session"); _init(); _openSession(); break; case PersistenceType.SAVE: _save(pr.Body); break; case PersistenceType.LOAD: //_load((int)pr.Body); break; case PersistenceType.DELETE: _delete(pr.Body); break; case PersistenceType.UPDATE: _update(pr.Body); break; case PersistenceType.LIST: _list((String)pr.Body); break; case PersistenceType.FIND: _find((String)pr.Body); break; case PersistenceType.CLOSE: _log.Debug("关闭Session"); // _closeSession(); break; default: break; } } } catch (Exception e) { _log.Error("PersistenceActor.OnReceive 发生异常: {0}", e.StackTrace); } }
void Enqueue(PersistenceRequest request) { _buffer.AddLast(new BufferEntry { Request = request, Sender = Sender }); if (!_flushRequested) { Self.Tell(new FlushBufferCommand(), Self); _flushRequested = true; } }
void Ready() { SetReceiveTimeout(_options.CommandProcessorIdleTimeout); Receive <ProcessorCommand>(async c => { // ensure the timeout hasn't expired if (c.Timeout.IsExpired) { Sender.Tell(new CommandTimeout(c.CommandID)); return; } try { await Validate(c.Command); await _commandHandlers.Handle(c.Command); } // handle command rejections catch (RejectException ex) { Sender.Tell(new CommandRejected(c.CommandID, ex.Reasons)); return; } // handle unexpected exceptions catch (Exception ex) { Sender.Tell(new CommandFailed(c.CommandID, ex)); return; } if (_unpersistedEvents.Count > 0) { var request = new PersistenceRequest(_unpersistedEvents.ToList()); // command processors don't need to wait for persistence, so // we delegate it to a worker and move on to wait for new commands // the worker will wait for responses and notify the sender var props = PersistenceWorker.CreateProps(request.PersistenceID, c.CommandID, Sender, _options.CommandProcessorPersistenceTimeout); var worker = Context.ActorOf(props); // send the request on behalf of the worker and let it wait for responses _writer.Tell(request, worker); // clear the unpersisted events _unpersistedEvents.Clear(); } }); Receive <ReceiveTimeout>(_ => StopSelf()); }
public void save_update_load_find_delete_strategy() { TestActorRef <PersistenceActor> persistenceActorRef = ActorOfAsTestActorRef <PersistenceActor>("persistence"); EStrategy strategy = new EStrategy() { Type = "Quanter.Strategy.Demo.DemoStrategyActor, Quanter.Strategy.Demo", Desc = "测试策略", Name = "策略DEMO", Date = DateTime.Now }; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = strategy }; persistenceActorRef.Tell(req); }
protected void buySecurities(Securities securities, float price, int amount) { // 1、下单 Order order = _createOrder(securities, price, amount, OrderType.BUY); _notifyTrader(order); // 2、修改持仓 bool updated = false; // 修改可用数量 foreach (EStockHolder shi in this.Desc.Holders) { if (shi.Symbol == securities.Symbol) { shi.IncomeAmount += amount; shi.CostPrice = 0; updated = true; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.UPDATE, Body = shi }; persistenceActor.Tell(req); } } // 新开仓 if (!updated) { EStockHolder shi = new EStockHolder() { Symbol = securities.Symbol, Code = _getCode(securities.Symbol), CostPrice = price, LastPrice = price, IncomeAmount = amount, EnableAmount = 0, Strategy = this.Desc, Name = securities.Name, }; this.Desc.Holders.Add(shi); PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = shi }; persistenceActor.Tell(req); } }
public PersistenceActorSpec() { persistenceActorRef = ActorOfAsTestActorRef <PersistenceActor>("persistence"); PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.INIT_DATABASE }; persistenceActorRef.Tell(req); req = new PersistenceRequest() { Type = PersistenceType.OPEN }; persistenceActorRef.Tell(req); }
protected override void OnReceive(object message) { PersistenceRequest pr = message as PersistenceRequest; if (pr != null) { switch (pr.Type) { case PersistenceType.INIT_DATABASE: _createTables(); break; case PersistenceType.OPEN: _log.Debug("初始化,并打开Session"); _init(); _openSession(); break; case PersistenceType.SAVE: _save(pr.Body); break; case PersistenceType.LOAD: //_load((int)pr.Body); break; case PersistenceType.UPDATE: _update(pr.Body); break; case PersistenceType.LIST: _list((String)pr.Body); break; case PersistenceType.FIND: _find((String)pr.Body); break; case PersistenceType.CLOSE: _log.Debug("关闭Session"); // _closeSession(); break; default: break; } } }
public void Writer_tells_persistedevents_to_dispatcher_in_order() { var dispatcher = CreateTestProbe(); var writer = CreateWriter(writer: MockEventStore.SuccessfulWriter(), dispatcher: dispatcher); var request = new PersistenceRequest(new[] { new UnpersistedEvent("a", new SampleEvent3()), new UnpersistedEvent("a", new SampleEvent1()), new UnpersistedEvent("a", new SampleEvent2()) }); writer.Tell(request); dispatcher.ExpectMsg <IPersistedEvent <SampleEvent3> >(); dispatcher.ExpectMsg <IPersistedEvent <SampleEvent1> >(); dispatcher.ExpectMsg <IPersistedEvent <SampleEvent2> >(); dispatcher.ExpectNoMsg(50); }
public void Writer_does_not_publish_to_event_stream() { var dispatcher = CreateTestProbe(); var writer = CreateWriter(writer: MockEventStore.SuccessfulWriter(), dispatcher: dispatcher); var request = new PersistenceRequest(new[] { new UnpersistedEvent("a", new SampleEvent3()), new UnpersistedEvent("a", new SampleEvent1()), new UnpersistedEvent("a", new SampleEvent2()) }); var probe = CreateTestProbe(); Sys.EventStream.Subscribe(probe, typeof(IPersistedEvent)); writer.Tell(request); probe.ExpectNoMsg(TimeSpan.FromMilliseconds(500)); }
public void save_update_load_find_delete_trader() { ETrader trader = new ETrader() { Username = "******", Password = "******", ServicePwd = "12345678", Path = "c:/xiadan/xiadan.exe", Date = DateTime.Now }; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = trader }; persistenceActorRef.Tell(req); var result0 = ExpectMsg <ETrader>(); Assert.NotEqual(0, result0.Id); Assert.Equal("1234567", result0.Username); trader = new ETrader() { Username = "******", Password = "******", ServicePwd = "12345678", Path = "c:/xiadan/xiadan.exe", Date = DateTime.Now }; req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = trader }; persistenceActorRef.Tell(req); var result1 = ExpectMsg <ETrader>(); Assert.NotEqual(0, result1.Id); Assert.Equal("2345678", result1.Username); req = new PersistenceRequest() { Type = PersistenceType.FIND, Body = "from ETrader where Id=1" }; persistenceActorRef.Tell(req); var result2 = ExpectMsg <ETrader>(); Assert.Equal(1, result2.Id); Assert.Equal("1234567", result2.Username); }
private void _init() { _log.Debug("从数据库中读取交易接口的信息"); persistenceActor = Context.ActorSelection(String.Format("/user/{0}", ConstantsHelper.AKKA_PATH_PERSISTENCE)); // 读取交易接口 PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.LIST, Body = "from ETrader" }; var result = persistenceActor.Ask <IList <Object> >(req, TimeSpan.FromSeconds(3)); result.Wait(); var traders = result.Result; foreach (var o in traders) { var trader = (ETrader)o; _createTradeActor(trader); _log.Debug("加载交易接口 {0}", trader.Name); } }
protected async Task WriteEvents(PersistenceRequest request) { var events = request.Events; // serialize the events into raw events var rawEvents = UnpersistedRawEvent.FromUnpersistedEvents(events, _serializer); // writes all events to the store await _writer.WriteStreamAsync(request.Stream, request.ExpectedStreamSequence, rawEvents); // publishes the events in the order they were sent for (int i = 0, len = events.Count; i < len; i++) { var e = events[i]; var re = rawEvents[i]; var persistedEvent = PersistedEventFactory.FromUnpersistedEvent(re.GlobalSequence, e); // publish to the event stream _dispatcher.Tell(persistedEvent); } }
private async Task HandleRequest(PersistenceRequest request) { try { await WriteEvents(request); Sender.Tell(new PersistenceSuccess(request.PersistenceID)); } catch (UnexpectedStreamSequenceException) { Sender.Tell(new UnexpectedStreamSequence(request.PersistenceID)); } catch (DuplicatedEntryException) { Sender.Tell(new DuplicatedEntry(request.PersistenceID)); } catch (Exception ex) { Sender.Tell(new PersistenceFailure(request.PersistenceID, ex)); } }
public void save_update_load_find_delete_strategy() { ETrader trader = new ETrader() { Username = "******", Password = "******", ServicePwd = "012345678", Path = "c:/xiadan/xiadan.exe", Date = DateTime.Now }; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = trader }; persistenceActorRef.Tell(req); var result = ExpectMsg <ETrader>(); EStrategy strategy = new EStrategy() { Type = "Quanter.Strategy.Demo.DemoStrategyActor, Quanter.Strategy.Demo", Desc = "测试策略", Name = "策略DEMO", EnableBalance = 50000, FrozenBalance = 0, Enabled = true, Date = DateTime.Now, Trader = result }; req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = strategy }; persistenceActorRef.Tell(req); var result1 = ExpectMsg <EStrategy>(); Assert.NotEqual(0, result1.Id); req = new PersistenceRequest() { Type = PersistenceType.FIND, Body = "from EStrategy where Id=1" }; persistenceActorRef.Tell(req); var result2 = ExpectMsg <EStrategy>(); Assert.Equal(1, result2.Id); Assert.Equal("012345678", result2.Trader.Username); }
private void Ready() { SetReceiveTimeout(_options.AggregateIdleTimeout); Receive <AggregateCommand>(async ac => { // ensure the stream is the same if (!Stream.Equals(ac.Stream)) { RefuseInvalidStream(ac); return; } // ensure the timeout hasn't expired if (ac.Timeout.IsExpired) { Sender.Tell(new CommandTimeout(ac.CommandID)); return; } // save the context (used for persistence) _currentCommand = new CommandContext(Sender, ac); try { await Validate(ac.Command); await _commandHandlers.Handle(ac.Command); } // handle command rejections catch (RejectException ex) { Sender.Tell(new CommandRejected(ac.CommandID, ex.Reasons)); OnFinishProcessing(); return; } // handle unexpected exceptions catch (Exception ex) { Sender.Tell(new CommandFailed(ac.CommandID, ex)); OnFinishProcessing(); return; } // if there are events to persist, request persistence if (_unpersistedEvents.Count > 0) { var request = new PersistenceRequest(Stream, StreamSequence, _unpersistedEvents.ToList()); _persistenceRequest = request; _writer.Tell(request); Become(AwaitingPersistence); } // otherwise just reply and finish else { _currentCommand.Sender.Tell(new CommandSucceeded(ac.CommandID)); OnFinishProcessing(); } }); Receive <ReceiveTimeout>(_ => { StopSelf(); }); OnReady(); }
public void save_update_load_find_delete_cube() { PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.LIST, Body = "from ECube" }; persistenceActorRef.Tell(req); var result0 = ExpectMsg <List <object> >(); Assert.Equal(0, result0.Count); // 先保存Trader ETrader trader = new ETrader() { Username = "******", Password = "******", ServicePwd = "012345678", Path = "c:/xiadan/xiadan.exe", Date = DateTime.Now }; req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = trader }; persistenceActorRef.Tell(req); var result = ExpectMsg <ETrader>(); // 保存strategy EStrategy strategy = new EStrategy() { Type = "Quanter.Strategy.XueQiuStrategy.TraceXueQiuStrategyActor, Quanter.Strategy.XueQiuStrategy", Desc = "测试策略", Name = "组合策略DEMO", EnableBalance = 50000, FrozenBalance = 0, Enabled = true, Date = DateTime.Now, Trader = null }; EStockHolder holder = new EStockHolder() { Strategy = strategy, Code = "000001", Symbol = "000001.XSHE", Name = "平安银行", CostPrice = 11.03f, LastPrice = 12.0f, IncomeAmount = 1000, EnableAmount = 1000 }; EStockHolder holder1 = new EStockHolder() { Strategy = strategy, Code = "000002", Symbol = "000002.XSHE", Name = "万科A", CostPrice = 9.03f, LastPrice = 12.0f, IncomeAmount = 1000, EnableAmount = 1000 }; strategy.Holders.Add(holder); strategy.Holders.Add(holder1); ECube cube = new ECube() { Strategy = strategy, Symbol = "ZH000003", PreAdjustmentId = 0, }; req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = cube }; persistenceActorRef.Tell(req); var result2 = ExpectMsg <ECube>(); Assert.NotEqual(0, result2.Id); Assert.Equal(result2.Symbol, "ZH000003"); req = new PersistenceRequest() { Type = PersistenceType.LIST, Body = "from ECube" }; persistenceActorRef.Tell(req); var result3 = ExpectMsg <List <object> >(); Assert.NotEqual(0, result3.Count); Assert.Equal("ZH000003", ((ECube)result3[0]).Symbol); }
protected void buySecurities(Securities securities, float price, int amount) { // 1、下单 Order order = _createOrder(securities, price, amount, OrderType.BUY); _processRisk(order); if (order.Amount == 0) { return; } _notifyTrader(order); // 2、修改持仓 bool updated = false; // 修改可用数量 foreach (EStockHolder shi in this.Desc.Holders) { if (shi.Symbol == securities.Symbol) { _log.Debug("更新仓位 {0}, {1}, {2}", securities.Symbol, price, amount); shi.IncomeAmount += amount; shi.CostPrice = 0; updated = true; PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.UPDATE, Body = shi }; persistenceActor.Tell(req); } } // 新开仓 if (!updated) { _log.Debug("新开仓 {0}, {1}, {2}", securities.Symbol, price, amount); EStockHolder shi = new EStockHolder() { Symbol = securities.Symbol, Code = _getCode(securities.Symbol), CostPrice = price, LastPrice = price, IncomeAmount = amount, EnableAmount = 0, Strategy = this.Desc, Name = LastClosePriceDataHelper.Instance.LastClosePriceDatas[securities.Symbol].Name, }; this.Desc.Holders.Add(shi); PersistenceRequest req = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = shi }; persistenceActor.Tell(req); // 订阅这个股票价格 AddSecurities(securities); } // 修改可用资金 float usedBanlance = price * amount; Desc.EnableBalance -= usedBanlance; PersistenceRequest req2 = new PersistenceRequest() { Type = PersistenceType.SAVE, Body = Desc }; persistenceActor.Tell(req2); }