这里简单的记录了 在windows azure上面运行jetty. (--Java,jsp)

Windows azure 提供的Fast CGI支持可以很方便的运行Php程序, Native Code Support的特性,也可以很方便的运行其他您想运行的东西, 当然  还是有一定的限制的。

具体参看: Executing Native Code in Windows Azure and the Development Environment

http://msdn.microsoft.com/en-us/library/dd573362.aspx

 

效果:http://singtel.cloudapp.net:9527/
Winows Azure运行Jetty-

1.准备材料

Jre 和Jetty.都可以Google下载到.

这里使用jre6 64bit和jetty7的Zip包.

2.上传jre和jetty.

这2个东西也可以打包到项目里面上传,但是那样文件太大了,这里先上传到 Blob里面.一个简单的上传程序:

---

string[] args)
        {
            const string config = @"*************";
            CloudStorageAccount acct = CloudStorageAccount.Parse(config);
            CloudBlobClient blobclient = acct.CreateCloudBlobClient();
            var container = blobclient.GetContainerReference("jre6");        
            container.CreateIfNotExist();           
            Upload(container);
        }
        private static void Upload(CloudBlobContainer container)
        {
            List<string> failed = new List<string>();
            string baseDir = @"C:\Temp\jre6\";
            var files = GetFiles(baseDir);
            foreach (string file in files)
            {
                try
                {
                    string fileName = file.Replace(baseDir, string.Empty);
                    Console.WriteLine(fileName);
                    var blob = container.GetBlobReference(fileName);
                    blob.DeleteIfExists();
                    using (FileStream sr = File.Open(file, FileMode.Open))
                    {
                        blob.UploadFromStream(sr);
                    }
                    Console.WriteLine(fileName + "-OK");
                    Thread.Sleep(100);
                }
                catch 
                {
                    failed.Add(file);
                }
            }
            foreach (var item in failed) 
            {
                Console.WriteLine(item + "-Failed");
            }
            Console.WriteLine("All OK");
            Console.ReadKey();
        }

---

上传jre和jetty到blob.
Winows Azure运行Jetty-Winows Azure运行Jetty-
使用Azure Storage Explorer看看
Winows Azure运行Jetty- 
3.新建一个带有一个worker role的cloud项目.

ServiceConfiguration.cscfg

---

JettyWorker">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" value="DefaultEndpointsProtocol=https;AccountName=**;AccountKey=**" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

---

ServiceDefinition.csdef

---

JettyWorker" enableNativeCodeExecution="true">
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" />
    </ConfigurationSettings>
    <Endpoints>
      <InputEndpoint name="Jetty7" protocol="tcp" port="9527" />
    </Endpoints>
    <LocalResources>
      <LocalStorage name="Jetty7Home" cleanOnRoleRecycle="false" sizeInMB="1024" />
    </LocalResources>
  </WorkerRole>
</ServiceDefinition>

---

在worker role里面下载blob上的程序到LocalStorage 里面.并配置运行jetty.

JettyWorker.cs

---

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace JettyWorker
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            // This is a sample worker implementation. Replace with your logic.
            Trace.WriteLine("JettyWorker entry point called", "Information");

            while (true)
            {             
                Trace.WriteLine("Working", "Information");
                Thread.Sleep(1000 * 60 * 20);
            }
        }

        public override bool OnStart()
        {
            // Set the maximum number of concurrent connections 
            ServicePointManager.DefaultConnectionLimit = 12;

            //DiagnosticMonitor.Start("DiagnosticsConnectionString");
            DiagnosticMonitorConfiguration diagObj = DiagnosticMonitor.GetDefaultInitialConfiguration();
            diagObj.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
            DiagnosticMonitor.Start("DiagnosticsConnectionString", diagObj);

            RunJetty runJetty = new RunJetty();
            string resourceDir = RoleEnvironment.GetLocalResource("Jetty7Home").RootPath;
            string port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Jetty7"].IPEndpoint.Port.ToString();
            runJetty.StartJetty(resourceDir, port);

            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
            RoleEnvironment.Changing += RoleEnvironmentChanging;

            return base.OnStart();
        }

        private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
        {
            // If a configuration setting is changing
            if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
            {
                // Set e.Cancel to true to restart this role instance
                e.Cancel = true;
            }
        }
    }
}

---

RunJetty.cs

---

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.IO;
using System.Threading;

namespace JettyWorker
{
    public class RunJetty
    {
        const string JreName = "jre6";
        const string JettyName = "jetty7";
        const string stAcct = @"DefaultEndpointsProtocol=https;AccountName=;AccountKey=";
        
        public void StartJetty(string jettyLocation, string jettyPort)
        {
            Trace.WriteLine("StartJetty...Begin");
            Trace.WriteLine("jettyLocation:" + jettyLocation + "||jettyPort:" + jettyPort);

            Trace.WriteLine("InitJettyFiles...Begin");
            InitJettyFiles(jettyLocation);;
            Trace.WriteLine("InitJettyFiles...End");

            Trace.WriteLine("StartJettyProcess...Begin");
            StartJettyProcess(jettyLocation,jettyPort);
            Trace.WriteLine("StartJettyProcess...End");

            Trace.WriteLine("StartJetty...End");
        }

        private void InitJettyFiles(string jettyLocation)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(stAcct);
            CloudBlobClient blobclient = storageAccount.CreateCloudBlobClient();
            Trace.WriteLine("DownLoad jetty begin");
            var container = blobclient.GetContainerReference(JettyName);
            container.CreateIfNotExist();
            DownLoad(container, jettyLocation);
            Trace.WriteLine("DownLoad jetty end");
            Trace.WriteLine("DownLoad jre begin");
            var containerJDK = blobclient.GetContainerReference(JreName);
            containerJDK.CreateIfNotExist();
            DownLoad(containerJDK, jettyLocation);
            Trace.WriteLine("DownLoad jre end");
        }

        private static void DownLoad(CloudBlobContainer container, string baseDir)
        {
            BlobRequestOptions option = new BlobRequestOptions();
            option.UseFlatBlobListing = true;
            var blobs = container.ListBlobs(option);
            if (!Directory.Exists(baseDir)) Directory.CreateDirectory(baseDir);
            List<IListBlobItem> failedFiles = new List<IListBlobItem>();
            foreach (var file in blobs)
            {
                try
                {
                    DownloadSingalFile(container, baseDir, file);
                }
                catch
                {
                    failedFiles.Add(file);
                    Trace.WriteLine("Failed:" + file.Uri.ToString());
                }
            }
            int tryCount = 0;
            while (failedFiles.Count > 0 || tryCount >5 )
            {
                Trace.WriteLine("Try failed files.");
                tryCount++;
                Trace.WriteLine("Try failed files." + tryCount);
                for (int i = failedFiles.Count - 1; i > -1; i--)
                {
                    try
                    {
                        DownloadSingalFile(container, baseDir, failedFiles[i]);
                        failedFiles.RemoveAt(i);
                    }
                    catch
                    {
                        Trace.WriteLine("Failed:" + failedFiles[i].Uri.ToString());
                    }
                }
            }
        }

        private static void DownloadSingalFile(CloudBlobContainer container, string baseDir, IListBlobItem file)
        {
            string filePath = baseDir + file.Uri.PathAndQuery;
            string temp = filePath.Substring(filePath.LastIndexOf('/'), filePath.Length - filePath.LastIndexOf('/'));
            temp = filePath.Replace(temp, string.Empty);
            if (temp.Trim().Length == 0) return;
            if (!Directory.Exists(temp)) Directory.CreateDirectory(temp);
            if (File.Exists(filePath)) File.Delete(filePath);
            var blob = container.GetBlobReference(file.Uri.ToString());
            blob.DownloadToFile(filePath);
            Thread.Sleep(50);
        }

        private void StartJettyProcess(string jettyLocation,string jettyPort)
        {   
            Process newProc = new Process();
            StreamReader sr;
            string returnDetails;
            try
            {
                string jettyHome = jettyLocation + @"\" + JettyName;
                string jreHome = jettyLocation + @"\" + JreName;
                newProc.StartInfo.UseShellExecute = true;
                newProc.StartInfo.RedirectStandardOutput = false;
                newProc.StartInfo.FileName = jreHome + "\\bin\\java.exe";
                newProc.StartInfo.Arguments = string.Format(" -Djetty.port={0} -Djetty.home=\"{1}\" -jar \"{1}\\start.jar\"",
                     jettyPort, jettyHome);
                newProc.EnableRaisingEvents = false;
                newProc.Start();
                Trace.WriteLine("Service started...");
                //sr = newProc.StandardOutput;
                //returnDetails = sr.ReadToEnd();
                //Trace.WriteLine("Information:" + returnDetails);        
            }
            catch (Exception ex)
            {
                returnDetails = ex.Message;
                Trace.WriteLine(ex.Message);
            }
        }
    }
}

---

4.发布程序,查看Trace信息和执行效果.
Winows Azure运行Jetty-

Winows Azure运行Jetty-
PS:这里仅仅是记录了一下在Windows azure平台上面运行jetty. demo的代码很乱,还有很多东西也没考虑,比如对jetty运行状况的监控等等.不过,有了Native Code Support ,LocalStorage  的支持,你可以在该平台上运行一些你想的程序了,比如mysql (http://microsoftpdc.com/Sessions/SVC51)

相关文章:

  • 2021-10-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
猜你喜欢
  • 2022-12-23
  • 2021-11-16
  • 2022-12-23
  • 2021-04-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案