我编写了一个将消息添加到本地队列的控制台应用程序.但是,没有插入任何消息.
我将队列创建为事务性并插入如下:
string path = @"FormatName:DIRECT=OS:computername\private$\myqueue";
MessageQueue queue = new MessageQueue();
queue.Path = path;
foreach (string msg in messages)
{
queue.Send("inputMessage", msg);
}
Run Code Online (Sandbox Code Playgroud)
这有什么不对吗?
谢谢.
我有一个应用程序,显示MSMQ消息队列中的消息的内容.Windows 7上的MSMQ存在问题,而不是保留邮件正文中数据的真实对象类型.在这个例子中,我发送一个byte [],然后当我收到它时,它不再是一个字节数组,而是包装的XML容器文档.在Windows XP中,我从未遇到过此问题,并且Message.Body属性始终正确设置为byte [].
这是压缩代码:
public void SendWithCompression(string Message)
{
try
{
// Compress the message data in memory.
byte[] UncompressedData = Encoding.UTF8.GetBytes(Message);
byte[] CompressedData = null;
MemoryStream s = new MemoryStream();
using (GZipStream z = new GZipStream(s, CompressionMode.Compress))
{
z.Write(UncompressedData, 0, UncompressedData.Length);
}
CompressedData = s.ToArray();
if (_Transaction != null)
{
_Transaction.Begin();
base.Send(CompressedData, _Transaction);
_Transaction.Commit();
}
else
{
base.Send(CompressedData);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是测试消息的消息内容.它最终成为包装编码二进制数据的XML文档:
<?xml version="1.0"?>..<base64Binary>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ih63edMefTsvy2rv8V3+4/8ByygBlxMAAAA=</base64Binary>
以下是它使用的解压缩代码:
String Data;
//Get message and format …Run Code Online (Sandbox Code Playgroud) 我在执行工作流程时遇到了一个特殊问题.
我已经尝试了我能想到的一切,现在需要一些想法.
这是我的配置:
1.在IIS 7中托管的WF4工作流服务(xamlx),并使用net.msmq/netMsmqBinding进行传输(MSMQ是事务性的).
2.没有使用工作流持久性.
3.我使用控制台应用程序客户端向工作流发送消息(每条消息创建新的工作流).4.每个工作流程如下:等待START消息 - >等待END消息(我只发送START消息).
如果我发送500条消息 - 464正确处理,但超过该消息,所有消息都转到lock_*队列,然后移动到毒性队列.我检查过Debug,Analytic事件日志,以及消息和跟踪svclogs这是我得到的最详细的消息:
System.TimeoutException,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089操作未在分配的超时00:00:30内完成.分配给此操作的时间可能是较长超时的一部分.at System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)System.ServiceModel.Activities.Dispatcher.PersistenceProviderDirectory.LoadOrCreateAsyncResult.HandleReserveThrottle(IAsyncResult result)at System.Runtime.AsyncResult.AsyncCompletionWrapperCallback(IAsyncResult result)System.TimeoutException:The操作未在指定的超时00:00:30内完成.分配给此操作的时间可能是较长超时的一部分.at System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)位于System.Runtime.AsyncResult.AsyncCompletionWrapperCallback(IAsyncResult结果)的System.ServiceModel.Activities.Dispatcher.PersistenceProviderDirectory.LoadOrCreateAsyncResult.HandleReserveThrottle(IAsyncResult result)
那时请求http://localhost/MyWebService?wsdl也失败了404.
如果我重新启动IIS - 一切都恢复正常,直到发送464条消息.
我有一个mainform发送消息和随机数量的接收表单作为单独的应用程序运行(C#4.0).
每当随机数量的表单中的一个接收到消息,而不是接收消息而其他表单将不再接收消息.
我用UDP,TCP IP,MSMQ尝试了这个,但我似乎没有让它运行良好.发送方和接收方在同一系统上运行.
任何人都可以推荐我一种方式来广播一种消息,该消息保持在一种队列中,直到所有表单都收到它,或者它可以保留在队列中直到应用程序关闭,但是如何...?
在此先感谢大家!
亲切的问候韦斯利
我已经减少了一个问题,我需要以下示例代码:
var inQueue = ".\private$\testqueue";
using (var ts = new TransactionScope())
{
using (var q = new MessageQueue(inQueue, QueueAccessMode.Send))
{
for (var i = 0; i < 100000; ++i)
{
var msg = new Message(i);
q.Send(msg, MessageQueueTransactionType.Automatic);
}
}
ts.Complete();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它使用TransactionScope模式将100,000个整数写入(事务性,本地)队列.我的理解是这种类型的操作不会升级为DTC交易.
但是,如果我在运行时打开组件服务,我可以在本地DTC>事务列表中看到该事务.这意味着交易已经升级,对吧?
为什么会这样?我在另一个程序中因性能不佳而被提示,并且看起来使用DTC进行这样一个简单的事务可能是一个因素.无论如何,我只想了解原因.
任何帮助,将不胜感激.
我尝试将序列化数据发送到MSMQ,但得到"System.InvalidCastException:指定的强制转换无效".错误.我把我的发送方法和日志跟随.请建议我解决此错误.
// Here MyMessage is my class which contain some
// stuff which I want to pass to MSMQ.
public void Send(MyMessage myMessage)
{
XmlSerializer ser = new XmlSerializer(typeof(MyMessage));
StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter())
{
ser.Serialize(writer, myMessage);
Debug.WriteLine(writer.ToString());
}
Message _myMessage = new Message(myMessage, new BinaryMessageFormatter());
//_messageQueue is object of MSMQMessage
_messageQueue.Send(_myMessage);
}
Run Code Online (Sandbox Code Playgroud)
记录:
System.InvalidCastException:指定的强制转换无效."在MyClassName.Send(MyMessage myMessage)
建议:我认为这个错误是由于"typeof"而发生的,但我不确定在那方面.
我有一个处理私有本地消息队列(MSMQ)的Windows服务.当它启动时,它PeekCompleted在队列上注册一个事件处理程序,然后调用异步BeginPeek()以等待消息到达.
protected override void OnStart(string[] args)
{
if (String.IsNullOrWhiteSpace(args[0]))
return;
queue = new MessageQueue(args[0]);
queue.Formatter = new BinaryMessageFormatter();
queue.PeekCompleted += new PeekCompletedEventHandler(OnPeekCompleted);
queue.BeginPeek();
}
Run Code Online (Sandbox Code Playgroud)
一旦消息到达,我的目标是显然处理该消息.我的代码目前有一个queue.Receive()获取消息的方法,包含在一个事务中,以便在处理过程中出现错误时将消息放回队列.BeginPeek()再次调用以重新启动循环.
private static void OnPeekCompleted(Object source, PeekCompletedEventArgs asyncResult)
{
try
{
MessageQueue q = (MessageQueue)source;
using (MessageQueueTransaction trans = new MessageQueueTransaction())
{
trans.Begin();
Message msg = q.Receive(trans);
ProcessMessage(msg);
trans.Commit();
}
// Restart the asynchronous peek operation.
q.BeginPeek();
}
catch (MessageQueueException qEx)
{
// TODO: Walk it off.
} …Run Code Online (Sandbox Code Playgroud) 我尝试访问Windows消息队列的消息:
var activeQueue = new MessageQueue("\\myhost\\private$\\just.a.queue", QueueAccessMode.Receive);
foreach(message in _activeQueue.GetAllMessages().ToList()) {
Console.WriteLine(message.Body);
}
Run Code Online (Sandbox Code Playgroud)
我在尝试访问时收到InvalidOperationException message.Body(并且几乎除Id之外的所有其他属性 - 字段).
我必须在同一域中的两个服务器之间创建MSMQ消息传递机制,SenderServer(MS Server 2012)和ReceiverServer(MS Server 2008 R2).
我在ReceiverServer中 创建了一个私有的事务性队列.\private$\receiver,我向系统和管理员提供了接收(和查看)消息权限.
然后,我创建了一个客户端应用程序,使用以下代码创建消息并将消息转发到队列:
MessageQueue queue = new queue("FormatName:Direct=OS:ReceiverServer\private$\receiver");
Message message = new Message();
message.Body = "myMessage";
using (MessageQueueTransaction tx = new MessageQueueTransaction())
{
tx.Begin();
queue.Send(message, "myLabel", tx);
tx.Commit();
}
Run Code Online (Sandbox Code Playgroud)
在部署应用程序之前,我在我的机器(Windows 7)上测试了它,它Direct=OS:ReceiverServer\private$\receiver使用State:Connected和正确地创建了一个传出队列Connection History:Connection is ready to transfer messages.消息被正确发送到ReceiverServer并放入\private$\receiver队列中.在End2End log该的ReceiverServer为每封邮件记录两个事件:
ID CN=msmq, CN=[mymachinename], CN=Computers, DC=[domain], DC=[other]已被放入队列ReceiverServer\private$\receiver(EventId:1)然后我使用相同的代码在SenderServer中 …
我正在尝试创建一个MSMQ解决方案,并且对于某些消息,我希望它们仅在下午6点后处理,所以在MSMQ中有一种方法可以在Future中处理消息吗?