2014-10-10 112 views
0

我正在编写一个使用WebSphere MQ进行消息传递的应用程序。对于我的单元测试(flowtests),我想验证是否在响应队列中放置了正确的消息。 我想弄清楚如何做到这一点。我的主要障碍是我认为在运行我的单元测试之前清除一个队列可能会很可怕,因为另一个应用程序可能会使用相同的队列。 我认为一个体面的解决方法是创建一个新的队列管理器并为我的unittest排队,并在使用它之后将其删除。在Websphere MQ中创建新的队列管理器和队列(使用C#)

所以我的问题是:是否有可能使用C#创建队列管理器和队列?

+0

创建队列管理器和队列是管理作业。使用用户定义的应用程序无法完成队列管理器的创建。您必须使用MQ提供的命令'crtmqm '来创建队列管理器。假设您的应用程序拥有排队队列,您计划使用哪种方法来验证响应队列中是否放置了正确的消息? – Shashi 2014-10-10 13:30:52

+0

基本上,在我的应用程序中,我不需要检查是否将正确的消息放在队列中。这完全是为了我的单位测试。 我的计划到目前为止是在单元测试之前清除队列,在测试之后从响应队列中取出所有消息,并使用MQQueue.Get()和MQMessage.ReadString(MQMessage)验证预期的消息是否在队列中。 MessageLength)并将其与预期值进行比较 – 2014-10-10 15:04:53

回答

1

为将来的参考和未来的人谁想要创建队列。我想出了如何使用PCF消息创建和删除IBM MQ队列(不是队列管理器)。这不是非常简单,但可以完成。

我们已经在库中实现了它,并正在使用它来分别在集成测试之前和之后创建和删除队列。下面的代码示例显示了此库中最重要的代码部分。只需添加对amqmdnet.dll的引用,下面的代码将创建一个队列并将其删除。

string queueManagerName = "QM_LOCAL"; 
string queueName = "DeleteMeQueue"; 

Hashtable options = new Hashtable(); 

// This is a connection to a local server. For a remote server use 'TRANSPORT_MQSERIES_CLIENT', 'TRANSPORT_MQSERIES_XACLIENT' or 'TRANSPORT_MQSERIES_MANAGED' 
options.Add(IBM.WMQ.MQC.TRANSPORT_PROPERTY, "TRANSPORT_MQSERIES_BINDINGS"); 

// For 'TRANSPORT_MQSERIES_CLIENT', 'TRANSPORT_MQSERIES_XACLIENT' or 'TRANSPORT_MQSERIES_MANAGED' uncomment the below 
// string hostName = "RemoteServerName"; 
// string channelName = "SYSTEM.ADMIN.SVRCONN"; 
// int portNumber = 1414; 
// options.Add(IBM.WMQ.MQC.HOST_NAME_PROPERTY, hostName); 
// options.Add(IBM.WMQ.MQC.CHANNEL_PROPERTY, channelName); 
// options.Add(IBM.WMQ.MQC.PORT_PROPERTY, portNumber); 
// options.Add(IBM.WMQ.MQC.CONNECT_OPTIONS_PROPERTY, IBM.WMQ.MQC.MQC.MQCNO_STANDARD_BINDING); 
IBM.WMQ.MQQueueManager queueManager = null; 
IBM.WMQ.PCF.PCFMessageAgent agent = null; 
try 
{ 
    // Initialize a connection to the (remote) queuemanager and a PCF message agent. 
    queueManager = new IBM.WMQ.MQQueueManager(queueManagerName, options); 
    agent = new IBM.WMQ.PCF.PCFMessageAgent(queueManager); 

    // Create queue 
    IBM.WMQ.PCF.PCFMessage createRequest = new IBM.WMQ.PCF.PCFMessage(IBM.WMQ.PCF.CMQCFC.MQCMD_CREATE_Q); 
    createRequest.AddParameter(IBM.WMQ.MQC.MQCA_Q_NAME, queueName); 
    createRequest.AddParameter(IBM.WMQ.MQC.MQIA_Q_TYPE, IBM.WMQ.MQC.MQQT_LOCAL); 
    createRequest.AddParameter(IBM.WMQ.MQC.MQIA_DEF_PERSISTENCE, IBM.WMQ.MQC.MQPER_PERSISTENT); 
    createRequest.AddParameter(IBM.WMQ.MQC.MQCA_Q_DESC, "Created by " + Environment.UserName + " on " + DateTime.UtcNow.ToString("o")); 
    IBM.WMQ.PCF.PCFMessage[] createResponses = agent.Send(createRequest); 

    // Delete queue 
    IBM.WMQ.PCF.PCFMessage deleteRequest = new IBM.WMQ.PCF.PCFMessage(IBM.WMQ.PCF.CMQCFC.MQCMD_DELETE_Q); 
    deleteRequest.AddParameter(IBM.WMQ.MQC.MQCA_Q_NAME, queueName); 
    IBM.WMQ.PCF.PCFMessage[] deleteResponses = agent.Send(deleteRequest); 
} 
finally 
{ 
    // Disconnect the agent and queuemanager. 
    if (agent != null) agent.Disconnect(); 
    if (queueManager != null && queueManager.IsConnected) queueManager.Disconnect(); 
} 
0

创建队列管理器和队列是管理作业。使用用户定义的应用程序无法完成队列管理器的创建。您必须使用MQ提供的命令crtmqm <qmname>来创建队列管理器。

我建议你让你的队列管理员管理员为你创建专用队列。只有您的单元测试使用此队列,并且不允许其他用户将消息放入/取得队列。

+0

嗯,我想我必须回答你的答案。我想下一个开发人员只需在单元测试应用程序之前手动创建队列。 我希望找到一个答案,让我能够在任何使用WebSphere MQ的机器上对我的应用程序进行单元测试。我会在代码中写评论。 – 2014-10-15 07:39:34

相关问题