2010-06-04 83 views
2

我在困境中是否为我的应用程序使用Windows服务,下面是关于我的应用程序的描述,请任何人都可以建议什么是我的需求的最佳方法,如果可能与专业人士和也是如此。Windows服务或任何其他替代

有一个应用程序“A”,它是一个封闭的应用程序,我需要从该应用程序获得的任何数据仅通过WCF服务公开。我的应用程序“M”必须调用由“A”公开的WCF服务之一,然后获取数据并处理它并丢弃文件。同样,如果某些文件被注入我的应用程序“M”,那么我需要处理它并使用其WCF服务将该信息推送到应用程序“A”中。这是简要的要求。

problems-

1)这里我的应用程序“M”需要不间断的调查申请“A” WCF服务来检查,如果事情是availabel它处理。我不喜欢投票,但有其他选择,请提出建议。 我想到了MSMQ,每当有新数据进入时,应用程序“A”都会向我的应用程序“M”发送消息。然后,我的应用程序“M”处理来自队列的消息。不知道该怎么做。请告知这是否正确。

2)另一件事是,如果一个新文件进入某个服务器文件夹,那么我的应用程序“M”必须将其接收并处理并将其发送到应用程序“A”。所以为了实现这个目标,我可能必须有一个文件系统监视器,只要有东西可用,就必须启动我的应用程序。再次敲击使用什么技术(仅在.Net中)。 MSMQ最好的方法是?

所以,现在我需要用哪些技术(只有在.Net中)才能有效地完成我的需求。通过不断轮询应用程序“A”并与其一起实施MSMQ,是Windows服务的最佳方法。请指教。

在此先感谢
西

+0

WCF具有可用于代替轮询的回调​​接口。 – 2010-06-04 16:20:59

+0

感谢亚历克斯,你能提供一些关于回调接口的更多细节..你的意思是双工绑定? – Sai 2010-06-04 16:24:00

回答

0

对于要求1,我会使用通过Windows进程激活服务托管的WCF服务(WAS) - 看到MSDN reference。这需要WAS(Windows Vista/7或Windows Server 2008/2008R2),但是,如果这些不可用,那么定期的NT服务将是适当的后备。

对于需求2,可以实现使用FileSystemWatcher类的NT服务(MSDN reference)。

所以,你可以实现一个单一的NT服务与FileSystemWatcher的轮询线程,或者你可以同时实现NT服务与FileSystemWatcher的,并且通过MSMQ监听一个单独的WAS托管WCF服务。

后者或许有点清洁,因为它遵循分离关注原则。但只有当应用程序“A”可以配置为通过MSMQ发送消息(即,您的服务“M”将成为“服务器”并且应用程序“A”将充当客户端)。所以,前一种选择(单一的NT服务可以做到这一点)可能会更好地适应你的情况,但我不完全确定你对“A”的描述。

至于发送消息应用程序“A”,MSMQ可能是也可能不是合适的选择。两个应用程序都在同一台机器上吗?然后使用命名管道。他们在不同的机器上?如果应用程序“A”始终在运行(即正在运行的服务),则使用TCP绑定,但如果需要保证传递消息并且应用程序“A”可能在应用程序“M”正在发送时偶尔脱机,则使用MSMQ绑定它的消息。(另外请注意,使用MSMQ要求将MSMQ Windows组件安装在接收机上。)

+0

谢谢Ton Lars的回复!我一定会探索WAS选项并检查是否适合我。所以对于要求2,那么我很好用NT服务。关于您的最后一段 - 将消息发送到应用程序“A” - 是否意味着将消息发送到应用程序“M”?因为我不会将消息发送到应用程序“A”。我的应用程序“M”将调用应用程序“A”公开的wcf服务来推送它从文件系统监视程序获得的已处理数据。 关于应用程序“A” - 它是一个silverlight 2应用程序,并具有wcf服务来获取和更新某些数据到应用程序中。 – Sai 2010-06-04 17:19:16

+0

我想我们在谈论同样的事情。 :)“发送消息到”和“呼叫”是等同的。 – 2010-06-04 17:21:31

+0

我在想“A”是一个没有msmq的常规wcf服务,所以应该清除发送(调用)“A”服务方法的问题。 – Sai 2010-06-04 17:30:11

0

听起来像选项A是不可变的,因此您无法更改它。 (“关闭”)

应用程序M应该是一个windows服务,正如Lars所描述的。但是,不要使用文件系统监视器,除非您稍后想要剔除代码并用轮询机制替换它。最好的办法是启动一个线程来轮询应用程序A,另一个线程轮询文件系统。

投票没有问题。使用Thread.Sleep(10),你会没事的。 FileSystemWatcher经常会给你一个'已被修改'但尚未完成写入的文件。这会导致你得到一个截断的文件。

不要打扰MSMQ,除非你绝对需要。这只是另一个维护,并且不能处理复杂的检索操作。

+0

谢谢stingyjack!点指出.. MSMQ是一个头痛,只有当没有其他选择时去... ...你提到,轮询是不是一个问题..如果somthing调查服务每5分钟左右,它不会导致服务器上的开销? – Sai 2010-06-04 17:26:57

+0

对于忽略FileSystemWatcher我会倾向于不同意......我没有提及过早提及的经验,但我怀疑它可能是文件写入方式的一种症状。 – Reddog 2010-06-04 17:26:57

+0

这是关于FileSystemWatcher的公正警告 - 只有在知道文件的源代码将以原子方式(一次全部)将其置于该目录中时才使用它。如果文件将逐个写入,并且在文件真正“完成”之前保存多个片段,那么您将需要不同的机制来告诉您文件是否“完成”。例如,我经常看到的一种做法是,一旦确保完全写入,将文件从“* .temp”重命名为其最终扩展名。 – 2010-06-04 17:28:16

相关问题