我想创建一个网络爬虫,它获取某个网站的内容并将其保存在 blob 存储中。在 Azure 上执行此操作的正确方法是什么?我应该启动一个 Worker 角色,并使用 Thread.Sleep 方法使其每天运行一次吗?
我还想知道,如果我使用这个辅助角色,如果我创建它的两个实例,它会如何工作?我注意到使用“Compute Emulator UI”命令“Trace.WriteLine”同时适用于两个实例,有人可以澄清这一点吗?
我使用 php 创建了相同的爬虫,并将 cron 作业设置为每天启动一次脚本,但需要 6 个小时才能获取全部内容,这就是我想使用 Azure 的原因。
我尝试向Azure工作者角色添加可执行文件,并从代码中调用它.但我不是百分之百确定路径的样子.我将Visual Studio中的可执行文件添加到我的worker角色项目中,设置为content并始终复制.在我的工作角色中,我打电话
Process.Start(Path.Combine(Environment.GetEnvironmentVariable("RoleRoot"), "Executable.exe"));
Run Code Online (Sandbox Code Playgroud)
结果如何
AppDomain未处理的异常异常:系统无法在System.Threading.ThreadHelper.ThreadStart()中找到System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)[...]中指定的文件.
我的azure项目的名称是"AzureProject",我的worker角色的名称是"QueueWorker",可执行文件"Executable.exe".我想这条路是错的.
从Azure门户中重新启动Windows Azure辅助角色实例时,是否删除了e:\ approot文件夹的内容?我有一个提升的启动任务,在添加一些注册表设置之前检查此文件夹中是否存在文件.这在过去是有效的,但现在失败了,因为它预期找到的文件在门户引发的重启之后不再存在.如果我从启动任务中执行'shutdown'命令,则实例重新启动,但e:\ approot的内容不受影响.
我很怀疑.
我有一个代码创建一个文件"foo.txt",然后使用UploadFile()将其复制到blob.
如果我不想要和天蓝色的概念我不能在"c:\"中创建这个文件?
我不得不在ServiceDefinition.csdef中使用本地存储,并在azureLocalResource.RootPath中创建它.
但是有ac:\驱动器用于写入(ad:\用于操作系统,ae:\用于代码),不是吗?
有什么用?
我们可以在启动任务中使用它吗?
我问,因为我相信代码今天用c:\ util运行.
我无法找到为什么类似的代码不能在新的工作角色中工作.
(这是文件和目录问题,而不仅仅是文件)
[答案]
我可以在c中创建此文件:但强烈建议使用本地存储API,因为驱动器号并不总是相同(例如重启后).
本地存储只是使用当前实例的读写驱动器的捷径.
在启动任务的特定情况下,我们可以通过两种方式访问此存储:使用ac#program/script中的azure API(请参阅本主题)或使用环境变量(请参阅此主题).
我正在玩Azure Worker Roles.调用异步WinRT方法并使用await
关键字时,服务执行结束.我猜这是因为await
返回控制权给调用者,这是服务内部的链接.也许调用者在Run()
完成执行并假定服务已完成或出现故障之前不期望返回控制权?
我不确定,是否有人知道是否async
打算与Azure Worker Roles一起使用?
有很多人说使用a Timer
而不是Thread.Sleep(...)
in Azure Worker Role
.没有这方面的问题.
我正在努力理解的是如何编写代码.
目前,我有以下(pseduo代码)
_timer.Elapsed += (sender, args) => DoWork();
public override void Run()
{
while(true)
{
DoWork();
}
}
public void DoWork()
{
try
{
_timer.Stop();
// Now - do stuff ....
}
catch(....) { ... }
_timer.Start()
}
Run Code Online (Sandbox Code Playgroud)
会发生什么,是代码进入DoWork()
方法一次,然后DoesStuff(tm)
..罚款..启动计时器(比如......间隔30秒),然后退出该方法.
然后,它返回到main Run()
循环中的main 方法.所以它立即回来并DoWork()
再次进入方法..而不是等待计时器将其关闭.
所以我不确定如何Thread.Sleep(...)
用Timers 替换任何.
有线索吗?
我不想退出Run()
方法:)我很高兴永远保持循环.我坚持使用的是替换标准Thread.Sleep(...)
调用(阻塞线程)并将其替换Timer
为大多数人建议的.
请不要链接或建议我cancelSource.Token.WaitHandle.WaitOne();
作为解决方案使用.这不是我想在这里实现的.请注意帖子标题!
通过ServiceBus
任何自定义传递代理消息DataContractSerializer[as Default XML Serializer Take Place]
.
var message = new BrokeredMessage(objMess.MessageBody);
Run Code Online (Sandbox Code Playgroud)
注意: 主要是邮件正文是HTML电子邮件的类型.
但是当在传递给worker角色的消息之后deserialization
,我看到一些随机文本被附加在顶部正文中,
var reader = new StreamReader(receivedMessage.GetBody<Stream>());
@string3http://schemas.microsoft.com/2003/10/Serialization/? .
Rest of Message Body
Run Code Online (Sandbox Code Playgroud)
我试着给定制DataContractSerializer
.但这搞砸了HTML符号.
一些格式化我找到的服务总线消息文章的内容,但仍然找到摆脱模式字符串的方法.
现在我正在substring
使用消息体.
我在Azure中运行了一个具有4个工作实例的服务.当我扩展到5个工作器实例时,已启动的第一个实例进入"忙"状态.这是为什么?放大期间会发生什么?azure会重新运行所有启动任务吗?我很困惑,似乎无法找到任何关于此的文档.
在扩展到5个实例后,第一个实例将其状态更改为:
Busy (Waiting for role to start... Application startup tasks are running. [2014-08-12T18:36:52Z])
Run Code Online (Sandbox Code Playgroud)
并且在那里运行的java进程停止了.为什么会这样?!
任何帮助,将不胜感激.
STARTUP.CMD
REM Log the startup date and time.
ECHO Startup.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
REM enable ICMP
netsh advfirewall firewall add rule name="ICMPv6 echo" dir=in action=allow enable=yes protocol=icmpv6:128,any
ECHO Starting WebService >> "%TEMP%\StartupLog.txt" 2>&1
tasklist /FI "IMAGENAME eq java.exe" 2>NUL | find /I /N "java.exe" >NUL 2>&1 …
Run Code Online (Sandbox Code Playgroud) azure azure-worker-roles azure-configuration azure-cloud-services
有谁知道这两者之间有什么区别?我看起来似乎找不到一个清楚描述它们如何不同的页面.微软解释其中两个的方式非常模糊.
该文件包含可用于云服务的角色的定义,指定服务端点,以及为服务建立配置设置.
指定要为服务中的每个角色部署的角色实例的数量,任何配置设置的值以及与角色关联的任何证书的指纹
我想部署仅具有辅助角色的云服务(没有Web角色.Web角色部署为Azure WebSite).可能吗?
PS.为什么我会考虑这个解决方案 - 我需要一个能够发送电子邮件的网站.我将消息放入Web中排队,并以工作者角色获取这些消息,这些消息会发送电子邮件.我尝试在云服务中部署这两种服务,但是Web部署WebSite更加舒适(部署速度更快,能够为本地和远程设置连接字符串).所以,我想只使用worker角色部署服务