Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        void Enqueue(PersistenceRequest request)
        {
            _buffer.AddLast(new BufferEntry {
                Request = request, Sender = Sender
            });

            if (!_flushRequested)
            {
                Self.Tell(new FlushBufferCommand(), Self);
                _flushRequested = true;
            }
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
            }
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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;
                }
            }
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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));
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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);
            }
        }
Beispiel #17
0
        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);
            }
        }
Beispiel #18
0
        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));
            }
        }
Beispiel #19
0
        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);
        }
Beispiel #20
0
        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();
        }
Beispiel #21
0
        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);
        }
Beispiel #22
0
        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);
        }