【问题标题】:Creating a new Queue Manager and Queue in Websphere MQ (using C#)在 Websphere MQ 中创建新的队列管理器和队列(使用 C#)
【发布时间】:2017-06-22 21:51:53
【问题描述】:

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

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

【问题讨论】:

  • 队列管理器和队列的创建是管理作业。无法使用用户定义的应用程序创建队列管理器。您必须使用 MQ 提供的命令crtmqm <qmname> 来创建队列管理器。假设您的应用程序有一个独占队列,您打算使用什么方法来验证是否已将正确的消息放入响应队列?
  • 基本上,在我的应用程序中,我不需要检查是否将正确的消息放入队列。它仅用于我的单元测试。到目前为止,我的计划是在单元测试之前清除队列,在测试之后从响应队列中取出所有消息,并使用 MQQueue.Get() 和 MQMessage.ReadString(MQMessage.MessageLength) 验证预期的消息是否在队列中并将其与预期值进行比较

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


【解决方案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();
}

【讨论】:

  • 太棒了!感谢这个代码示例,它对我帮助很大。 IBM doc 太痛苦了,很难弄清楚创建队列之类的基本功能......
【解决方案2】:

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

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

【讨论】:

  • 好吧,我想我不得不接受你的回答。我想下一个开发人员只需要在对应用程序进行单元测试之前手动创建队列。我希望找到一个答案,让我可以在任何带有 WebSphere MQ 的机器上对我的应用程序进行单元测试。我会在代码中写cmets。
猜你喜欢
  • 2014-08-08
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多