我在两难困境是否使用的窗口服务,为我的应用程序或没有,下面是我的应用程序,请任何人都可以提出什么是我的需求的最佳方法,如果可能的利弊,以及描述。
应用程序“A”是一个封闭的应用程序,我需要从该应用程序获得的任何数据仅通过WCF服务公开。我的应用程序“M”必须调用“A”公开的WCF服务之一,然后获取数据并处理它并丢弃一个文件。类似地,如果某个文件被注入我的应用程序“M”,那么我需要处理它并使用其WCF服务将该信息推送到应用程序“A”。这是简要要求。
问题 -
1)这里我的应用程序“M”需要不间断的调查申请“A” WCF服务来检查,如果事情是availabel它处理。我不喜欢投票,但任何其他选择,请建议。 我想MSMQ的,该应用程序每当一个新的数据来自于“A”发送消息给我的应用程序“M”我的应用“M”,然后处理从队列中。不知道怎么做。请告知这是否正确。
2)的另一件事是,如果一个新的文件来自于一些服务器文件夹,然后我的应用程序“M”已经把它捡起来,并对其进行处理,并将其发送到应用程序“A”。所以为了达致这我可能必须有一个文件系统观察,一旦事情变得可用,那么它必须揭开序幕我的应用程序。再次强调要使用什么技术(仅限.Net)。 MSMQ是最好的方法吗?
现在我很惊讶我需要使用哪种技术(仅限.Net)来有效地完成我的要求。是Windows服务最好的方法是不断轮询应用程序“A”并实现MSMQ。请指教。
提前致谢
西
答案 0 :(得分:0)
对于要求1,我将使用通过Windows进程激活服务(WAS)托管的WCF服务 - 请参阅MSDN reference。但是,这需要WAS(Windows Vista / 7或Windows Server 2008 / 2008R2),因此,如果这些不可用,则常规NT服务将是适当的后备。
对于需求2,您可以实现使用FileSystemWatcher类(MSDN reference)的NT服务。
因此,您可以使用FileSystemWatcher 和实现轮询线程的单个NT服务,或者您可以使用FileSystemWatcher实现NT服务,并通过MSMQ实现单独的WAS托管WCF服务
后者可能有点清洁,因为它遵循关注点分离原则。但只有当应用程序“A”可以配置为通过MSMQ 发送消息时才有可能(即,您的服务“M”将成为“服务器”而应用程序“A”将充当客户端)。因此,前一个选项(单个NT服务同时执行这两个操作)可能更适合您的场景,但我不完全确定您对“A”的描述。
至于将消息发送到应用程序“A”,MSMQ可能是也可能不是合适的选择。两个应用程序都在同一台机器上吗?然后使用命名管道。他们在不同的机器上吗?如果应用程序“A”始终在运行(即正在运行的服务),则使用TCP绑定,但如果您需要保证传递消息,则使用MSMQ绑定,并且应用程序“M”在发送时“A”可能偶尔会脱机它的消息。 (另请注意,使用MSMQ要求在接收计算机上安装MSMQ Windows组件。)
答案 1 :(得分:0)
听起来选项A是不可变的,因此你无法改变它。 ( “关闭”)
应用程序M应该是一个Windows服务,正如Lars所描述的那样。但是,除非您希望稍后删除代码并将其替换为轮询机制,否则不要使用文件系统观察程序。最好的办法是启动一个线程来轮询应用程序A,另一个线程来轮询文件系统。
投票没有错。使用Thread.Sleep(10),你会没事的。 FileSystemWatcher通常会为您提供一个已经“更改”但尚未完成写入的文件。这会导致您获得截断文件。
除非你绝对需要,否则不要打扰MSMQ。这只是维护的另一部分,无法处理复杂的检索操作。