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

时间:2014-10-10 13:19:26

标签: c# .net unit-testing queue ibm-mq

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

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