Winows Azure运行Jetty-
这里简单的记录了 在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/
1.准备材料
Jre 和Jetty.都可以Google下载到.
这里使用jre6 64bit和jetty7的Zip包.
2.上传jre和jetty.
这2个东西也可以打包到项目里面上传,但是那样文件太大了,这里先上传到 Blob里面.一个简单的上传程序:
---
Upload to blobstatic void Main(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.
使用Azure Storage Explorer看看
3.新建一个带有一个worker role的cloud项目.
ServiceConfiguration.cscfg
---
ServiceConfiguration<ServiceConfiguration serviceName="JettyServer" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"> <Role name="JettyWorker"> <Instances count="1" /> <ConfigurationSettings> <Setting name="DiagnosticsConnectionString" value="DefaultEndpointsProtocol=https;AccountName=**;AccountKey=**" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
---
ServiceDefinition.csdef
---
ServiceDefinition<ServiceDefinition name="JettyServer" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WorkerRole name="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
---
JettyWorker WorkerRoleusing 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
---
RunJetty.csusing 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); } } } }
---
PS:这里仅仅是记录了一下在Windows azure平台上面运行jetty. demo的代码很乱,还有很多东西也没考虑,比如对jetty运行状况的监控等等.不过,有了Native Code Support ,LocalStorage 的支持,你可以在该平台上运行一些你想的程序了,比如mysql (http://microsoftpdc.com/Sessions/SVC51)