From 45eb16c6b2764c27960e0cb8d73c5039acda1897 Mon Sep 17 00:00:00 2001 From: markpollack Date: Thu, 14 Aug 2008 07:09:03 +0000 Subject: [PATCH] misc updates for quick start application --- .../Config/Application.xml | 2 +- .../Config/Messaging.xml | 35 +++--------------- .../Gateways/NmsStockServiceGateway.cs | 30 +++++----------- .../Data/TradeResponse.cs | 12 +++++++ .../Data/TradeResponse.xsd | 1 + .../Spring.NmsQuickStart.Server/App.config | 3 +- .../Config/{Services.xml => Handlers.xml} | 5 ++- .../Config/Messaging.xml | 34 ++---------------- .../Config/ServiceStubs.xml | 10 ++++++ .../Gateways/MarketDataServiceGateway.cs | 10 +++--- .../Handlers/StockAppHandler.cs | 18 +++++++--- .../Spring.NmsQuickStart.Server/Program.cs | 2 +- .../Services/Stubs/CreditCheckServiceStub.cs | 16 +++++++++ .../Stubs/ExecutionVenueServiceStub.cs | 36 +++++++++++++++++++ .../Services/Stubs/TradingServiceStub.cs | 15 ++++++++ .../Spring.NmsQuickStart.Server.csproj | 8 ++++- ...ListenerContainerObjectDefinitionParser.cs | 6 ++++ .../Messaging/Nms/Config/spring-nms-1.2.xsd | 10 ++++++ 18 files changed, 155 insertions(+), 98 deletions(-) rename examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/{Services.xml => Handlers.xml} (60%) create mode 100644 examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/ServiceStubs.xml create mode 100644 examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs create mode 100644 examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs create mode 100644 examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Application.xml b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Application.xml index d5673437..3e8f40fc 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Application.xml +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Application.xml @@ -4,7 +4,7 @@ - + diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Messaging.xml b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Messaging.xml index 80bdcac2..f3b9dcda 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Messaging.xml +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Config/Messaging.xml @@ -24,23 +24,13 @@ - - - - - - - - - - - - - - - + + + + + @@ -60,20 +50,5 @@ - - - diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Gateways/NmsStockServiceGateway.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Gateways/NmsStockServiceGateway.cs index b1d3c4fa..da9e937e 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Gateways/NmsStockServiceGateway.cs +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/Gateways/NmsStockServiceGateway.cs @@ -1,6 +1,7 @@ +using System; using Apache.NMS; using Spring.Messaging.Nms.Core; using Spring.NmsQuickStart.Common.Data; @@ -8,7 +9,7 @@ using Spring.Objects.Factory; namespace Spring.NmsQuickStart.Client.Gateways { - public class NmsStockServiceGateway : NmsGatewaySupport, IStockService, IInitializingObject + public class NmsStockServiceGateway : NmsGatewaySupport, IStockService { private IDestination defaultReplyToQueue; @@ -19,25 +20,12 @@ namespace Spring.NmsQuickStart.Client.Gateways public void Send(TradeRequest tradeRequest) { - NmsTemplate.ConvertAndSend(tradeRequest, new ReplyToPostProcessor(defaultReplyToQueue)); - } - - - public class ReplyToPostProcessor : IMessagePostProcessor - { - private IDestination replyToDestination; - - public ReplyToPostProcessor(IDestination replyToDestination) - { - this.replyToDestination = replyToDestination; - } - - public IMessage PostProcessMessage(IMessage message) - { - message.NMSReplyTo = replyToDestination; - return message; - } - } - + NmsTemplate.ConvertAndSendWithDelegate(tradeRequest, delegate(IMessage message) + { + message.NMSReplyTo = defaultReplyToQueue; + message.NMSCorrelationID = new Guid().ToString(); + return message; + }); + } } } \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.cs index 7fb013c6..f74a7eca 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.cs +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.cs @@ -32,6 +32,8 @@ namespace Spring.NmsQuickStart.Common.Data { private string orderTypeField; + private string confirmationNumberField; + private bool errorField; private string errorMessageField; @@ -76,6 +78,16 @@ namespace Spring.NmsQuickStart.Common.Data { } } + /// + public string ConfirmationNumber { + get { + return this.confirmationNumberField; + } + set { + this.confirmationNumberField = value; + } + } + /// public bool Error { get { diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.xsd b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.xsd index 272c6826..d930e79d 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.xsd +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/Data/TradeResponse.xsd @@ -7,6 +7,7 @@ + diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/App.config b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/App.config index 9f32148d..0b06dbce 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/App.config +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/App.config @@ -18,7 +18,8 @@ - + + diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Services.xml b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Handlers.xml similarity index 60% rename from examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Services.xml rename to examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Handlers.xml index 69b30e5b..fb6b6249 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Services.xml +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Handlers.xml @@ -2,7 +2,10 @@ - + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Messaging.xml b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Messaging.xml index 7103a2eb..0b3efe39 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Messaging.xml +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/Messaging.xml @@ -6,8 +6,6 @@ - - @@ -16,28 +14,15 @@ - + - - - - - - - - - - - - - + @@ -57,19 +42,4 @@ - - - diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/ServiceStubs.xml b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/ServiceStubs.xml new file mode 100644 index 00000000..d94b6394 --- /dev/null +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Config/ServiceStubs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs index b3645eef..b4785e73 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs @@ -11,7 +11,7 @@ namespace Spring.NmsQuickStart.Server.Gateways private static readonly ILog log = LogManager.GetLogger(typeof (MarketDataServiceGateway)); private readonly Random random; - private int sleepTimeInSeconds = 2; + private TimeSpan sleepTimeInSeconds = new TimeSpan(0,0,0,10,0); public MarketDataServiceGateway() @@ -19,7 +19,7 @@ namespace Spring.NmsQuickStart.Server.Gateways random = new Random(); } - public int SleepTimeInSeconds + public TimeSpan SleepTimeInSeconds { set { sleepTimeInSeconds = value; } } @@ -32,15 +32,15 @@ namespace Spring.NmsQuickStart.Server.Gateways log.Info("Sending market data."); NmsTemplate.ConvertAndSend(data); log.Info("Sleeping " + sleepTimeInSeconds + " seconds before sending more market data."); - Thread.Sleep(sleepTimeInSeconds*1000); + Thread.Sleep(sleepTimeInSeconds); } } private IDictionary GenerateFakeMarketData() { IDictionary md = new Hashtable(); - md.Add("TICKER", "CSCO"); - md.Add("PRICE", "22" + string.Format("{0:#.###}", Math.Abs(Gaussian()))); + md.Add("TICKER", "CSCO"); + md.Add("PRICE", string.Format("{0:##.##}", 22+Math.Abs(Gaussian()))); return md; } diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Handlers/StockAppHandler.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Handlers/StockAppHandler.cs index 17bc2055..6004aada 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Handlers/StockAppHandler.cs +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Handlers/StockAppHandler.cs @@ -1,9 +1,9 @@ using System.Collections; -using Common.Logging; using Spring.NmsQuickStart.Common.Data; using Spring.NmsQuickStart.Server.Services; +using Spring.Util; namespace Spring.NmsQuickStart.Server.Handlers { @@ -14,22 +14,30 @@ namespace Spring.NmsQuickStart.Server.Handlers private ICreditCheckService creditCheckService; private ITradingService tradingService; - + + public StockAppHandler(IExecutionVenueService executionVenueService, ICreditCheckService creditCheckService, ITradingService tradingService) + { + this.executionVenueService = executionVenueService; + this.creditCheckService = creditCheckService; + this.tradingService = tradingService; + } + public TradeResponse Handle(TradeRequest tradeRequest) { TradeResponse tradeResponse; - IList errors = new ArrayList(); + ArrayList errors = new ArrayList(); if (creditCheckService.CanExecute(tradeRequest, errors)) { tradeResponse = executionVenueService.ExecuteTradeRequest(tradeRequest); - tradingService.ProcessTrade(tradeRequest, tradeResponse); } else { tradeResponse = new TradeResponse(); tradeResponse.Error = true; - tradeResponse.ErrorMessage = errors[0].ToString(); + tradeResponse.ErrorMessage = StringUtils.ArrayToCommaDelimitedString(errors.ToArray()); + } + tradingService.ProcessTrade(tradeRequest, tradeResponse); return tradeResponse; } } diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Program.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Program.cs index c27df0c8..aacb7169 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Program.cs +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Program.cs @@ -18,7 +18,7 @@ namespace Spring.NmsQuickStart.Server ContextRegistry.GetContext().GetObject("MarketDataGateway") as MarketDataServiceGateway; ThreadStart job = new ThreadStart(marketDataService.SendMarketData); Thread thread = new Thread(job); - //thread.Start(); + thread.Start(); Console.Out.WriteLine("--- Press to quit ---"); Console.ReadLine(); } diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs new file mode 100644 index 00000000..e377d8eb --- /dev/null +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs @@ -0,0 +1,16 @@ + + +using System.Collections; +using Spring.NmsQuickStart.Common.Data; +using Spring.NmsQuickStart.Server.Services; + +namespace Spring.NmsQuickStart.Server.Services.Stubs +{ + public class CreditCheckServiceStub : ICreditCheckService + { + public bool CanExecute(TradeRequest tradeRequest, IList errors) + { + return true; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs new file mode 100644 index 00000000..1009cdf5 --- /dev/null +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs @@ -0,0 +1,36 @@ + + +using System; +using Spring.NmsQuickStart.Common.Data; +using Spring.NmsQuickStart.Server.Services; + +namespace Spring.NmsQuickStart.Server.Services.Stubs +{ + public class ExecutionVenueServiceStub : IExecutionVenueService + { + public TradeResponse ExecuteTradeRequest(TradeRequest request) + { + TradeResponse response = new TradeResponse(); + response.OrderType = request.OrderType; + response.Price = CalculatePrice(request.Ticker, request.Quantity, request.OrderType, request.Price, request.UserName); + response.Quantity = request.Quantity; + response.Ticker = request.Ticker; + response.ConfirmationNumber = new Guid().ToString(); + return response; + } + + private decimal CalculatePrice(string ticker, long quantity, string ordertype, decimal limitPrice, string userName) + { + // provide as sophisticed an impl as testing requires...for now all the same price. + if (ordertype.CompareTo("LIMIT") == 0) + { + return limitPrice; + } + else + { + return 27.6m; + } + + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs new file mode 100644 index 00000000..df7145bb --- /dev/null +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs @@ -0,0 +1,15 @@ + + +using Spring.NmsQuickStart.Common.Data; +using Spring.NmsQuickStart.Server.Services; + +namespace Spring.NmsQuickStart.Server.Services.Stubs +{ + public class TradingServiceStub : ITradingService + { + public void ProcessTrade(TradeRequest request, TradeResponse response) + { + //do nothing implementation, typical implementations would persist state to the database. + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Spring.NmsQuickStart.Server.csproj b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Spring.NmsQuickStart.Server.csproj index f31d3782..bd6e6e49 100644 --- a/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Spring.NmsQuickStart.Server.csproj +++ b/examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/Spring.NmsQuickStart.Server.csproj @@ -54,6 +54,9 @@ + + + @@ -81,10 +84,13 @@ + + Always + Always - + Always diff --git a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/MessageListenerContainerObjectDefinitionParser.cs b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/MessageListenerContainerObjectDefinitionParser.cs index 9747e8d5..1648d67c 100644 --- a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/MessageListenerContainerObjectDefinitionParser.cs +++ b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/MessageListenerContainerObjectDefinitionParser.cs @@ -88,6 +88,8 @@ namespace Spring.Messaging.Nms.Config private readonly string MAX_RECOVERY_TIME_ATTRIBUTE = "max-recovery-time"; private readonly string CONNECTION_FACTORY_ATTRIBUTE = "connection-factory"; + + private readonly string PUBSUB_DOMAIN_ATTRIBUTE = "pubsub-domain"; #endregion @@ -190,6 +192,10 @@ namespace Spring.Messaging.Nms.Config parserContext.ReaderContext.GenerateObjectName(containerDefBuilder.RawObjectDefinition); } + string pubsubDomain = listenerElement.GetAttribute(PUBSUB_DOMAIN_ATTRIBUTE); + containerDefBuilder.AddPropertyValue("PubSubDomain", pubsubDomain); + + parserContext.Registry.RegisterObjectDefinition(containerObjectName, containerDefBuilder.ObjectDefinition); } diff --git a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/spring-nms-1.2.xsd b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/spring-nms-1.2.xsd index ee49fc2d..3ccfe1bb 100644 --- a/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/spring-nms-1.2.xsd +++ b/src/Spring/Spring.Messaging.Nms/Messaging/Nms/Config/spring-nms-1.2.xsd @@ -196,6 +196,16 @@ ]]> + + + + + + +