Sunday, September 21, 2008

IBM Websphere MQ process message immediate with C#

ในการใช้งาน IBM Websphere MQ นั้นบ่อยครั้งที่จำเป็นจะต้องประมวลผล message ที่เข้ามาใน Queue ทันที
การ polling เพื่อตรวจสอบว่ามี message เข้ามาใน Queue แล้วหรือไม่นั้นคงไม่ใช้ทางออกที่ดีอย่างแน่นอน
การทำงานแบบ event-driven น่าจะเหมาะสมกว่าสำหรับงานแบบนี้

IBM Webphere MQ เองได้มี Trigger ไว้รองรับการทำงานแบบนี้ แต่ในความเป็นจริงแล้วการใช้งาน Trigger
นั้นค่อนข้างยุ่งยาก และไม่สะดวกในนำไปใช้งาน เพราะเราจำเป็นที่จะต้องสร้าง Initial Queue และ Process
และกำหนดค่าต่างๆอีกมากมายให้กับ Queue ที่เราต้องการจะใช้งาน Trigger อีกทั้ง Trigger จะไม่ทำงานได้จนกว่า
เราจะรันคำสั่ง runmqtrm เพื่อ monitor mq's trigger ที่เราต้องการ

ทางเลือกง่ายๆอีกอย่างทางที่สามารถทำได้คือเขียนโปรแกรมให้ application ของเราหยุดจนกว่าจะมี message เข้ามาใน queue
แล้วจึงทำงานต่อไป



public class MQMessageListener
{

public static MQMessage Listen(string qmName, string queueName)
{
/** MQOO_INPUT_AS_Q_DEF -- open queue to get message using queue-define default.
* MQOO_FAIL_IF_QUIESCING -- access fail if queue manange is quiescing. **/
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING;
MQQueueManager mqManager = new MQQueueManager(qmName);
MQQueue queue = mqManager.AccessQueue(queueName,openOptions);

/** MQGMO_FAIL_IF_QUIESCING -- get message fail if queue manager is quiescing.
* MQGMO_WAIT -- waits for suitable message to arrive.
* MQWI_UNLIMITED -- unlimited wait interval. **/
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options = MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_WAIT;
gmo.WaitInterval = MQC.MQWI_UNLIMITED;
MQMessage message = new MQMessage();
//wait for message
queue.Get(message, gmo);
queue.Close();

//release resource.
mqManager = null;
queue = null;
gmo = null;
System.GC.Collect();

return message;
}

}





class Program
{
static void Main(string[] args)
{
Console.WriteLine("==START==");
String message = null;
do{
Console.WriteLine("Waiting...");
MQMessage mqMessage = MQMessageListener.Listen("QUEUE.MANAGER", "LOC.QUEUE");
message = mqMessage.ReadString(mqMessage.MessageLength);
Console.WriteLine("\tMessage: " + message);
}while(message != "BYE");
Console.WriteLine("==END==");
}
}



No comments: