在Websphere MQ中创建新的队列管理器和队列(使用C#)

在Websphere MQ中创建新的队列管理器和队列(使用C#),c#,.net,unit-testing,queue,ibm-mq,C#,.net,Unit Testing,Queue,Ibm Mq,我正在编写一个使用WebSphereMQ进行消息传递的应用程序。对于我的单元测试(flowtests),我想验证我是否在响应队列中放置了正确的消息。 我在想怎么做。我的主要障碍是,我认为在运行unittest之前清除队列可能会很可怕,因为同一个队列可能会被另一个应用程序使用。 我认为一个不错的解决办法是为我的unittest创建一个新的队列管理器和队列,并在使用它之后将其删除 所以我的问题是:是否可以使用C#创建队列管理器和队列?创建队列管理器和队列是管理作业。无法使用用户定义的应用程序创建队列

我正在编写一个使用WebSphereMQ进行消息传递的应用程序。对于我的单元测试(flowtests),我想验证我是否在响应队列中放置了正确的消息。 我在想怎么做。我的主要障碍是,我认为在运行unittest之前清除队列可能会很可怕,因为同一个队列可能会被另一个应用程序使用。 我认为一个不错的解决办法是为我的unittest创建一个新的队列管理器和队列,并在使用它之后将其删除


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

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


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

供将来参考和希望创建队列的人员使用。我了解了如何使用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();
}

创建队列管理器和队列是管理作业。无法使用用户定义的应用程序创建队列管理器。您必须使用MQ提供的命令
crtmqm
来创建队列管理器。假设您的应用程序有一个独占队列,您计划使用什么方法来验证是否已将正确的消息放入响应队列?基本上,在我的应用程序中,我不需要检查是否已将正确的消息放入队列。这完全是为了我的单元测试。到目前为止,我的计划是在单元测试之前清除队列,在测试之后从响应队列中获取所有消息,并通过使用MQQueue.get()和MQMessage.ReadString(MQMessage.MessageLength)验证预期消息是否在队列中,并将其与预期值进行比较。好吧,我想我必须使用您的答案。我猜下一个开发人员只需在单元测试应用程序之前手动创建队列。我希望找到一个答案,使我能够在任何带有WebSphere MQ的机器上对我的应用程序进行单元测试。我将在代码中写注释。