diff --git a/doc/reference/src/messaging.xml b/doc/reference/src/messaging.xml index e13176e99..a2b2d1d37 100644 --- a/doc/reference/src/messaging.xml +++ b/doc/reference/src/messaging.xml @@ -252,6 +252,64 @@ otherwise be part of a ConnectionFactory 'Wrappers' (to be discussed later) are provided. + +
+ Caching EMS Resources + + The class + Spring.Messaging.Nms.Connections.CachingConnectionFactory +
+ + +
+ Caching Messaging Resources + + The standard API usage of NMS and other JMS inspired APIs involves + creating many intermediate objects. To send a message the following + 'API' walk is performed + + IConnectionFactory->IConnection->ISession->IMessageProducer->Send + + Between the ConnectionFactory and the Send operation there are + three intermediate objects that are created and destroyed. To optimise + the resource usage and increase performance two implementations of + IConnectionFactory are provided. Note that the TIBCO EMS implementation + is not based on interfaces and an alternative strategy was selected for + the time being. See the last section in this manual for details. + +
+ SingleConnectionFactory + + Spring.Messaging.Nms.Connections.SingleConnectionFactory + will return the same connection on all calls to + CreateConnection and ignore calls to Close. +
+ +
+ CachingConnectionFactory + + Spring.Messaging.Nms.Connections.CachingConnectionFactory + extends the functionality of SingleConnectionFactory and adds the + caching of Sessions, MessageProducers, and MessageConsumers. + + The initial cache size is set to 1, use the property + SessionCacheSize to increase the number of cached + sessions. Note that the number of actual cached sessions will be more + than that number as sessions are cached based on their acknowledgment + mode, so there can be up to 4 cached session instances when + SessionCacheSize is set to one, one for each + AcknowledgementMode. + MessageProducers and + MessageConsumers are cached within their owning + session and also take into account the unique properties of the + producers and consumers when caching. + + MessageProducers are cached based on + their destination. MessageConsumers are cached + based on a key composed of the destination, selector, noLocal delivery + flag, and the durable subscription name (if creating durable + consumers). +
@@ -1159,9 +1217,10 @@ namespace MyApp pubsub-domain - An optional boolean value. Set to true for the publish-subscribe domain - (Topics) or false (the default) for point-to-point domain (Queues). This is useful - when using the default implementation for destination resolvers. + An optional boolean value. Set to true for the + publish-subscribe domain (Topics) or false (the default) for + point-to-point domain (Queues). This is useful when using the + default implementation for destination resolvers. diff --git a/doc/reference/src/wcf-quickstart.xml b/doc/reference/src/wcf-quickstart.xml new file mode 100644 index 000000000..a40f030e4 --- /dev/null +++ b/doc/reference/src/wcf-quickstart.xml @@ -0,0 +1,165 @@ + + + WCF QuickStart + +
+ Introduction + + The WCF quickstart application shows how to configure your WCF + services using dependency injection and how to to apply AOP advice to your + services. It is based on the same interfaces used in the portable service abstractions + quickstart example that demonstrates similar features for .NET + Remoting, Enterprise Services, and ASMX web sevices. At the moment the + quickstart example is only available as a VS.NET 2008 solution. + + There are two server applications in the solution, one is a web + application where the WCF service will be hosted, and the other is a + self-hosting console application, (Spring.WcfQuickStart.Server.2008. The + client application is located in Sprng.WcfQuickStart.ClientApp.2008. To + run the solution make sure that all three projects are set to + startup. +
+ +
+ The server side + + The service contract is shown below + + [ServiceContract(Namespace = "http://Spring.WcfQuickStart")] + public interface ICalculator + { + [OperationContract] + double Add(double n1, double n2); + [OperationContract] + double Subtract(double n1, double n2); + [OperationContract] + double Multiply(double n1, double n2); + [OperationContract] + double Divide(double n1, double n2); + [OperationContract] + string GetName(); + } + + and the implementation is straightforward, only adding a property + that controls how long each method should sleep. An abbreviated listing of + the implementation is shown below + + public class CalculatorService : ICalculator + { + private int sleepInSeconds; + + public int SleepInSeconds + { + get { return sleepInSeconds; } + set { sleepInSeconds = value; } + } + + public double Add(double n1, double n2) + { + Thread.Sleep(sleepInSeconds*1000); + return n1 + n2; + } + + + // other methods omitted for brevity. + + } + +
+ DI using dynamic proxies + + The approach using dynamic proxies is used in the console + application inside the Spring.WcfQuickStart.Server.2008 project. For + more information on this approach refer to this section in the reference docs. The + configuration of your service is done as you would typically do with + Spring, including applying of any AOP advice. The class is hosted inside + the console application through the use of Spring's + ServiceHostFactoryObject exporter. The + configuration for the server console application is shown below. + + <objects xmlns="http://www.springframework.net" + xmlns:aop="http://www.springframework.net/aop"> + + <!-- Service definition --> + <object id="calculator" singleton="false" + type="Spring.WcfQuickStart.CalculatorService, Spring.WcfQuickStart.ServerApp"> + <property name="SleepInSeconds" value="1"/> + </object> + + <object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop"> + <property name="pattern" value="Spring.WcfQuickStart.*"/> + </object> + + <object id="perfAdvice" type="Spring.WcfQuickStart.SimplePerformanceInterceptor, Spring.WcfQuickStart.ServerApp"> + <property name="Prefix" value="Service Layer Performance"/> + </object> + + <aop:config> + <aop:advisor pointcut-ref="serviceOperation" advice-ref="perfAdvice"/> + </aop:config> + + <!-- host the service object --> + <object id="calculatorServiceHost" type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services"> + <property name="TargetName" value="calculator" /> + </object> + + </objects> + + Look at the standard WCF configuration section in App.config for + additional configuration details. In that section you will see that the + name of the WCF service corresponds to the name of the service object + inside the spring container. +
+ +
+ DI using WCF extension points + + This approach uses Spring specific implementation of the WCF + interfaces + System.ServiceModel.Dispatcher.IInstanceProvider + and + System.ServiceModel.Description.IServiceBehavior + are used to integrate Spring directly into the instancing of WCF + services. For more information on this approach refer to this section of the reference + documentation. The web application shows this approach in action. + + Much of the configuration ob the objects is the same as before, + the .svc file though refers to the type of the service inside the Spring + container as well as using Spring's + Spring.ServiceModel.Activation.ServiceHostFactory. The .svc file is + shown below. + + <%@ ServiceHost Language="C#" Debug="true" Service="Spring.WcfQuickStart.CalculatorService" + Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %> + +
+
+ +
+ Client access + + The project Spring.WcfQuickStart.ClientApp.2008 is a console + application that calls the two WCF services. It creates a client side + proxy based on using ChannelFactory<T>.CreateChannel. Running the + client application produces the following output. + + --- Press <return> to continue --- +Web Calculator +Add(1, 1) : 2 +Divide(11, 2) : 5.5 +Multiply(2, 5) : 10 +Subtract(7, 4) : 3 + +ServerApp Calculator +Add(1, 1) : 2 +Divide(11, 2) : 5.5 +Multiply(2, 5) : 10 +Subtract(7, 4) : 3 + +--- Press <return> to continue --- + +
+
\ No newline at end of file