我正在构建一个应用程序,我通过网络(在特定端口上)从打印机输入以及在本地或通过网络创建到文件夹中的其他文件.用户可以创建不同的线程以同时监视不同的文件夹,以及通过网络处理来自三台打印机的输入的线程.应用程序应根据其类型处理输入数据并输出.在应用程序的另一端,将有4个线程等待来自输入线程(可能是10或20个线程)的输入数据来处理和应用4个不同的任务.由于我们将同时运行许多线程,我以为我会使用MSMQ来管理这些线程.在这种情况下使用MSMQ还是应该使用其他技术?在调度,优先级等方面管理这些线程.
(PS:我正在考虑建立我自己的ThreadEngine类来处理所有这些事情,直到我听说MSMQ,我仍然不确定它是否正确使用)
我目前使用System.IO.FileSystemWatcher作为"滚动你自己的"消息队列系统的一部分(使用SOAP Web服务在服务器之间传递XML"消息",将"消息"写入运行Windows服务的磁盘上的特定文件夹一个FileSystemWatcher在它们到达时突然发出新的"消息"并用它们做一些有效的事情).我在.NET 1.0或1.1(我忘记了)的时代写了这篇文章,作为使用COM-interop替代MSMQ SDK的替代方案.以所有这些为背景,我正在考虑用"真正的"消息队列实现替换这个ad hoc消息队列方案.问题是,似乎没有与FileSystemWatcher等效的MSMQ在队列到达时自动从队列中选择新消息.它是埋藏在.NET框架中的某个地方还是我将不得不使用轮询或者保留他们现在的方式?
使用MessageQueue(string queuePath)构造函数创建System.Messaging.MessageQueue后,尝试使用MessageQueue.Send(obj)导致"无法生成临时类(result = 1)"异常,并附加文本:'error CS0122:'System .__ ComObject'由于其保护级别而无法访问'.
队列本身具有给予每个人的完全控制权.当查询MessageQueue对象的读写权限时,它返回SendAndReceive.导致此错误的原因是什么?如何解决?
Windows 7 32位,.NET4.具体来说,当我这样做时:
_queue.Send(mqMessage);
return mqMessage.LookupId;
Run Code Online (Sandbox Code Playgroud)
我在LookupId的访问上得到一个InvalidOperationException.异常消息是:
未为此消息定义查找标识符.该消息不是通过调用Receive方法创建的,或者查找标识符未添加到要检索的属性中.
对我来说这听起来好像消息没有成功发送到MSMQ.我在"控制面板"\"所有控制面板项目\程序和功能"中的"打开或关闭Windows功能"选项中安装了所有与MSMQ相关的功能.
如果我查看本地Windows服务,我会看到"消息队列"和"消息队列触发器"已启动并正在运行.
知道这里发生了什么吗?
我们有一个使用MsmqBinding和WAS的WCF日志服务.问题是我尝试从远程计算机使用它,并且该消息似乎永远不会到达目标队列.以下是事实:
而且价值是:
var queue = new MessageQueue(@"FormatName:DIRECT=OS:logserver.domain.ext\private$\logservice.svc");
queue.Send("hello");
Run Code Online (Sandbox Code Playgroud)
工作!
我有一个saga,如果从调用返回的状态成功,saga结束,则每隔30秒检查一次API调用的状态,如果不是saga等待30秒并再次尝试.如果API调用未在60分钟内返回成功响应,则传奇超时并结束.
我在解除60分钟超时时遇到问题.我的代码是
public class MonitorSubmissionFeedSagaData: IContainSagaData
{
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }
public bool TimeoutSet { get; set; }
[Unique]
public string JobId { get; set; }
}
public class MonitorSubmissionFeedSaga : Saga<MonitorSubmissionFeedSagaData>,
IAmStartedByMessages<MonitorFeedSubmissonCommand>,
IHandleMessages<StartCheckSubmissionCommand>,
IHandleTimeouts<MonitorSubmissionFeedSagaTimeout>
{
public const int SagaTimeoutInMinutes = 60;
public IEmpathyBrokerClientApi PostFileService { get; set; }
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MonitorSubmissionFeedSagaData> mapper)
{
mapper.ConfigureMapping<MonitorFeedSubmissonCommand>(x => x.JobId).ToSaga(saga => saga.JobId);
}
public void …Run Code Online (Sandbox Code Playgroud) 我有打电话的问题Close()或Dispose()上MessageQueue。我有一个应该能够管理这些消息队列的应用程序。打开和关闭它们。
但是当我打电话时Close()还是Dispose()什么也没有发生。队列仍然存在于机器上。我使用该MessageQueue.GetPrivateQueuesByMachine()方法获取MessageQueue's的数组,并且在调用Close()or后它仍然在那里Dispose()。经过一番阅读后,似乎Dipose()应该是我使用的那个,但仍然如此。
这是我用来尝试关闭队列的代码
public String CloseQueue(String path)
{
if (GetQueueArray().Length == 0)
{
return "The Queue Array is Empty!";
}
foreach (MessageQueue m in GetQueueArray())
{
if (m.Path.Equals(path))
{
try
{
path = m.QueueName;
m.Close();
break;
}
catch (Exception e)
{
return e.Message;
}
}
}
return "Successfully Closed Queue at path: " + path;
}
Run Code Online (Sandbox Code Playgroud)
该方法GetQueueArray()定义为(在同一类中):
public …Run Code Online (Sandbox Code Playgroud) 我什么时候应该使用消息队列(MSMQ)或工作流基金(WF)?这两种产品有什么特别之处?你怎么定义它们?他们的财产是什么?它们的用途是什么?