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