在应用中经常要在多个程序或应用服务器之间进行锁资源操作,达到数据同步的目的.组件Smark.WebServices提供资源锁功能,通过调用Smark.WebServices.ObjectEnterService的TryEnter和Exit对资源进行锁和解锁.部署Smark.WebServices.
svn地址https://smark.svn.codeplex.com/svn/Smark/Smark.WebServices
测试地址http://www.nbao.net/ObjectEnterService.asmx
ObjectEnterService


支持下列操作。有关正式定义,请查看服务说明。 

Exit 

TryEnter 


--------------------------------------------------------------------------------

此 Web 服务使用 http://tempuri.org/ 作为默认命名空间。
建议: 公开 XML Web services 之前,请更改默认命名空间。
每个 XML Web services 都需要一个唯一的命名空间,以便客户端应用程序能够将它与 Web 上的其他服务区分开。http://tempuri.org/ 可用于处于开发阶段的 XML Web services,而已发布的 XML Web services 应使用更为永久的命名空间。

应使用您控制的命名空间来标识 XML Web services。例如,可以使用公司的 Internet 域名作为命名空间的一部分。尽管有许多 XML Web services 命名空间看似 URL,但它们不必指向 Web 上的实际资源。(XML Web services 命名空间为 URI。)

使用 ASP.NET 创建 XML Web services 时,可以使用 WebService 特性的 Namespace 属性更改默认命名空间。WebService 特性适用于包含 XML Web services 方法的类。下面的代码实例将命名空间设置为“http://microsoft.com/webservices/”:

C#

[WebService(Namespace="http://microsoft.com/webservices/")]
public class MyWebService {
    // 实现
}
Visual Basic

<WebService(Namespace:="http://microsoft.com/webservices/")> Public Class MyWebService
    ' 实现
End Class
C++

[WebService(Namespace="http://microsoft.com/webservices/")]
public ref class MyWebService {
    // 实现
};
有关 XML 命名空间的更多详细信息,请参阅 Namespaces in XML (XML 命名空间)上的 W3C 建议。

有关 WSDL 的更多详细信息,请参阅 WSDL Specification (WSDL 规范)。

有关 URI 的更多详细信息,请参阅 RFC 2396。

在Client定义简单操作对象

 /// <summary>
        /// 分布式对象锁Client调用
        /// </summary>
        public class ObjectEnter:IDisposable
        {
            private net.nbao.www.ObjectEnterService mEnterService = new net.nbao.www.ObjectEnterService();
            private bool mDisposed = false;
            private string mResources;
            private string mOwnerid;
            /// <summary>
            /// 构造锁对象
            /// </summary>
            /// <param name="resources">需要锁的资源标识</param>
            /// <param name="seconds">锁占用的时间,超过这个时间组件自动释放;单位为毫秒</param>
            /// <param name="timeout">锁等待时间;单位为毫秒</param>
            public ObjectEnter(string resources, int seconds, int timeout)
            {
                mEnterService.Url = "http://localhost:2443/ObjectEnterService.asmx";
                mResources = resources;
                OnInit(seconds, timeout);
            }
            /// <summary>
            /// 构造锁对象
            /// </summary>
            /// <param name="url">分布式锁服务地址</param>
            /// <param name="resources">需要锁的资源标识</param>
            /// <param name="seconds">锁占用的时间,超过这个时间组件自动释放;单位为毫秒</param>
            /// <param name="timeout">锁等待时间;单位为毫秒</param>
            public ObjectEnter(string url, string resources, int seconds, int timeout)
            {
                mEnterService.Url = url;
                mResources = resources;
                OnInit(seconds, timeout);
            }
            private void OnInit(int seconds, int timeout)
            {
                mOwnerid = mEnterService.TryEnter(mResources, seconds, timeout);
            }
            /// <summary>
            /// 获取锁分配的ID,如果为null则表示没有锁成功
            /// </summary>
            public string Owner
            {
                get
                {
                    return mOwnerid;
                }
            }
            #region IDisposable 成员

            public void Dispose()
            {
                lock (this)
                {
                    if (!mDisposed)
                    {
                        if (!string.IsNullOrEmpty(mOwnerid))
                        {
                            mEnterService.Exit(mOwnerid, mResources);
                        }
                        mDisposed = true;

                    }
                }
            }

            #endregion
        }

测试代码

    class Program
    {
        static System.Random mRan = new Random();
        static void Main(string[] args)
        {
            Smark.Core.Functions.Action(Lock1);
            System.Threading.Thread.Sleep(1000);
            Smark.Core.Functions.Action(Lock2);
            System.Threading.Thread.Sleep(1000);
            Smark.Core.Functions.Action(Lock3);
            while (true)
            {
                System.Threading.Thread.Sleep(5000);
            }
        }
        static void Lock1()
        {
            while (true)
            {
                using (ObjectEnter oe = new ObjectEnter("henry", 50000, 10000))
                {
                    Console.WriteLine("Lock1 Fun Locked Henry State[{0}] ", oe.Owner);
                    System.Threading.Thread.Sleep(mRan.Next(1000,4000));
                }
                
            }
          
           
        }
        static void Lock2()
        {
            while (true)
            {
                using (ObjectEnter oe = new ObjectEnter("henry", 50000, 10000))
                {
                    Console.WriteLine("Lock2 Fun Locked Henry State[{0}] ", oe.Owner);
                    System.Threading.Thread.Sleep(mRan.Next(1000, 4000));
                }
          
                
            }
        }
        static void Lock3()
        {
            while (true)
            {
                using (ObjectEnter oe = new ObjectEnter("henry", 50000, 10000))
                {
                    Console.WriteLine("Lock3 Fun Locked Henry State[{0}] ", oe.Owner);
                    System.Threading.Thread.Sleep(mRan.Next(1000, 4000));

                }


            }
        }
       
    }

Last edited Jun 9, 2010 at 8:52 AM by smarkhenry, version 5

Comments

No comments yet.