. Net环境下消息队列(MSMQ)对象的应用
2010-12-01 10:44
337 查看
关于消息对象(
MSMQ
)的一些基本概念可以从《
消息队列(
Message Queue
)简介及其使用
》查阅,这里归纳在
.Net
环境下应用消息队列(
MSMQ
)开发的一些基本对象和方法。
队列类型及其相应的路径格式:
Public:
[MachineName]/[QueueName]
Private:
[MachineName]/Private$/[QueueName]
Journal:
[MachineName]/[QueueName]/Journal$
Machine journal:
[MachineName]/Journal$
Machine dead-letter:
[MachineName]/DeadLetter$
Machine transactional dead-letter:
[MachineName]/XactDeadLetter$
The first portion of the path indicates a computer or domain name or uses a period (.) to indicate the current computer.
1.
创建消息队列
可以手动的方式通过
Windows
提供的工具创建,或者通过程序的方式创建:
if
(MessageQueue
.Exists
(".//Private$//MSMQDemo"))
queue
= new
MessageQueue
(".//Private$//MSMQDemo");
else
queue
= MessageQueue
.Create
(".//Private$//MSMQDemo");
2.
发送消息
缺省情况下,消息序列化
XML
格式,也可设置为
MessageQueue
对象的
Formatter
属性为
BinaryMessageFormatter
,以二进制格式序列化。
设置消息序列化格式:
if
(rdoXMLFormatter
.Checked
)
queue
.Formatter
= new
XmlMessageFormatter
();
else
queue
.Formatter
= new
BinaryMessageFormatter
();
发送简单的文本消息:
string
strMessage
= "Hello, I am Rickie.";
queue
.Send
(strMessage
, "Simple text message");
消息队列可以传送简单的文本消息,也可以传送对象消息,但需要满足如下条件:
(
1
)
class
必须有一个无参数的公共构造函数,
.Net
使用这个构造函数在接收端重建对象。
(
2
)
class
必须标示为
serializable
(序列化)。
(
3
)所有的
class
属性必须可读写,因为
.Net
在重建对象时不能够恢复只读属性的属性值,因此只读属性不能够序列化。
发送对象消息(
CustomerInfo class
需要满足上述条件):
CustomerInfo
theCustomer
= new
CustomerInfo
("0001", "Rickie Lee", "Rickieleemail@yahoo.com");
queue
.Send
(theCustomer
, "Object message");
3.
读
/
显示消息
当消息接受后,消息将从队列中删除。可以通过使用
MessageQueue.Peek
方法来检索消息队列中的第一个消息的复制,保留消息在队列中。不过,这样只能获取的相同的消息。更好的办法是通过
foreach
来读消息队列中的消息,但不删除队列中的消息。
foreach(System.Messaging.Message message in queue)
{
txtResults.Text += message.Label + Environment.NewLine;
}
4.
接收消息
一般而言,可以通过
Receive
方法来读取队列中的消息,对于非事务性的队列,优先读取高优先级的消息。如果队列中有多个相同优先级的消息,则以先进先去的方式进行读取消息。对于事务性的队列,则完全以先进先去的方式进行读取消息,忽略消息的优先级。
System
.Messaging
.Message
receivedMessage
;
receivedMessage
= queue
.Receive
(TimeSpan
.FromSeconds
(5));
上面采用同步调用,并且一直等到队列中有可用消息或超时过期。
Demo
界面(不在提供DEMO
程序)
:
其他相关事项:
关于消息的加密、路由等等特性,需要有配置
Active Directory
的消息队列服务器。
为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的
Recoverable
属性为
true
,在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为
false
。
消息发送方和消息接收方需采用相同的序列化格式,如
XML
或
Binary
。
建议每一个消息队列存放相同类型的消息对象,这样可以省掉获取消息对象后,进行类型判别的麻烦。
5.
消息队列在分布式系统中的应用
消息队列
MSMQ
和数据库不一样,消息队列缺乏足够的错误检查能力,并且
MSMQ
由于需要束缚在
windows
平台,这些是
MSMQ
的不足之处。另外
,
在
Production
环境中,需要编写大量的代码来进行错误检测和响应。还有大量的死信队列、响应队列和日记队列可能部分在企业不同的计算机上,使得跟踪这些问题或进行诊断变得比较困难。
但是,
MSMQ
作为组件内部连接比较有用。例如,你可以创建一个
XML Web Services
使用
MSMQ
来转发对另一个
Server
端组件的请求,这种设计巧妙回避了其他异步调用的方法,并且确保可扩展性和性能。
References:
1, Matthew MacDonald, Microsoft® .NET Distributed Applications: Integrating XML Web Services and .NET Remoting
2, Rickie, 消息队列(
Message Queue)简介及其使用
MSMQ
)的一些基本概念可以从《
消息队列(
Message Queue
)简介及其使用
》查阅,这里归纳在
.Net
环境下应用消息队列(
MSMQ
)开发的一些基本对象和方法。
队列类型及其相应的路径格式:
Public:
[MachineName]/[QueueName]
Private:
[MachineName]/Private$/[QueueName]
Journal:
[MachineName]/[QueueName]/Journal$
Machine journal:
[MachineName]/Journal$
Machine dead-letter:
[MachineName]/DeadLetter$
Machine transactional dead-letter:
[MachineName]/XactDeadLetter$
The first portion of the path indicates a computer or domain name or uses a period (.) to indicate the current computer.
1.
创建消息队列
可以手动的方式通过
Windows
提供的工具创建,或者通过程序的方式创建:
if
(MessageQueue
.Exists
(".//Private$//MSMQDemo"))
queue
= new
MessageQueue
(".//Private$//MSMQDemo");
else
queue
= MessageQueue
.Create
(".//Private$//MSMQDemo");
2.
发送消息
缺省情况下,消息序列化
XML
格式,也可设置为
MessageQueue
对象的
Formatter
属性为
BinaryMessageFormatter
,以二进制格式序列化。
设置消息序列化格式:
if
(rdoXMLFormatter
.Checked
)
queue
.Formatter
= new
XmlMessageFormatter
();
else
queue
.Formatter
= new
BinaryMessageFormatter
();
发送简单的文本消息:
string
strMessage
= "Hello, I am Rickie.";
queue
.Send
(strMessage
, "Simple text message");
消息队列可以传送简单的文本消息,也可以传送对象消息,但需要满足如下条件:
(
1
)
class
必须有一个无参数的公共构造函数,
.Net
使用这个构造函数在接收端重建对象。
(
2
)
class
必须标示为
serializable
(序列化)。
(
3
)所有的
class
属性必须可读写,因为
.Net
在重建对象时不能够恢复只读属性的属性值,因此只读属性不能够序列化。
发送对象消息(
CustomerInfo class
需要满足上述条件):
CustomerInfo
theCustomer
= new
CustomerInfo
("0001", "Rickie Lee", "Rickieleemail@yahoo.com");
queue
.Send
(theCustomer
, "Object message");
3.
读
/
显示消息
当消息接受后,消息将从队列中删除。可以通过使用
MessageQueue.Peek
方法来检索消息队列中的第一个消息的复制,保留消息在队列中。不过,这样只能获取的相同的消息。更好的办法是通过
foreach
来读消息队列中的消息,但不删除队列中的消息。
foreach(System.Messaging.Message message in queue)
{
txtResults.Text += message.Label + Environment.NewLine;
}
4.
接收消息
一般而言,可以通过
Receive
方法来读取队列中的消息,对于非事务性的队列,优先读取高优先级的消息。如果队列中有多个相同优先级的消息,则以先进先去的方式进行读取消息。对于事务性的队列,则完全以先进先去的方式进行读取消息,忽略消息的优先级。
System
.Messaging
.Message
receivedMessage
;
receivedMessage
= queue
.Receive
(TimeSpan
.FromSeconds
(5));
上面采用同步调用,并且一直等到队列中有可用消息或超时过期。
Demo
界面(不在提供DEMO
程序)
:
其他相关事项:
关于消息的加密、路由等等特性,需要有配置
Active Directory
的消息队列服务器。
为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的
Recoverable
属性为
true
,在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为
false
。
消息发送方和消息接收方需采用相同的序列化格式,如
XML
或
Binary
。
建议每一个消息队列存放相同类型的消息对象,这样可以省掉获取消息对象后,进行类型判别的麻烦。
5.
消息队列在分布式系统中的应用
消息队列
MSMQ
和数据库不一样,消息队列缺乏足够的错误检查能力,并且
MSMQ
由于需要束缚在
windows
平台,这些是
MSMQ
的不足之处。另外
,
在
Production
环境中,需要编写大量的代码来进行错误检测和响应。还有大量的死信队列、响应队列和日记队列可能部分在企业不同的计算机上,使得跟踪这些问题或进行诊断变得比较困难。
但是,
MSMQ
作为组件内部连接比较有用。例如,你可以创建一个
XML Web Services
使用
MSMQ
来转发对另一个
Server
端组件的请求,这种设计巧妙回避了其他异步调用的方法,并且确保可扩展性和性能。
References:
1, Matthew MacDonald, Microsoft® .NET Distributed Applications: Integrating XML Web Services and .NET Remoting
2, Rickie, 消息队列(
Message Queue)简介及其使用
相关文章推荐
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用[转]
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- . Net环境下消息队列(MSMQ)对象的应用
- Net环境下消息队列(MSMQ)对象的应用 [转]
- Net环境下消息队列(MSMQ)对象的应用
- UNIX环境下如何应用消息队列实现进程间通信
- beanstalkd消息队列在生产环境的应用
- 消息队列--MSMQ应用(一)
- beanstalkd消息队列在生产环境的应用
- beanstalkd消息队列在生产环境的应用