2014-10-10 109 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

相關問題