#!/usr/bin/perl # IBM Message Queue Reader use warnings; use strict; use Config::Simple; use MQSeries; use MQSeries::Queue; use MQSeries::QueueManager; use XML::Simple; use POSIX; use Time::Local; use Data::Dumper; # Read MQ Settings from config file my $conf = new Config::Simple("/customS/config.ini"); my $qmgr = $conf->param('MQConf.QueueManager'); my $chnl = $conf->param('MQConf.ChannelName'); my $ipad = $conf->param('MQConf.IPAddress'); my $port = $conf->param('MQConf.Port'); my $qnam = $conf->param('MQConf.Queue'); my $xDir = $conf->param('Folder.XMLunread'); my ($queue,$qmgr_obj); LOG("##### START #### Queue Manager: $qmgr Channel: $chnl"); while(1) { LOG("Processing queue"); if (!open_queue_manager() or !open_queue()) { sleep 10; next; } while (1) { my $getmessage = get_message(); last unless defined $getmessage; process_message($getmessage); } } sub process_message { my $message = shift; # Get current time (cTimeA) and message time (qDate, qTime) my @cTimeA = POSIX::strftime("%Y-%m-%dT%H:%M:%S", gmtime) =~ /(\d+)/g; my @qDate= $getmessage->{MsgDesc}->{PutDate}=~ /(\d{4})(\d\d)(\d\d)/; my @qTime= $getmessage->{MsgDesc}->{PutTime}=~ /(\d?)(\d\d)(\d\d)(\d\d)(\d\d)$/; print "Current time GMT values; " # --second--- ---minute--- ----hour--- . $cTimeA[3].":".$cTimeA[4].":".$cTimeA[5]." " # ----day---- ----month--- ----year--- . $cTimeA[2]."-".$cTimeA[1]."-".$cTimeA[0]."\n"; print "Message PutTime GMT values; " . $qTime[1]. ":".$qTime[2]. ":".$qTime[3]." " . $qDate[2]. "-".$qDate[1]. "-".$qDate[0]."\n"; # Epoch time is in seconds my $epoch = timelocal($cTimeA[5],$cTimeA[4],$cTimeA[3],$cTimeA[2],$cTimeA[1]-1,$cTimeA[0]); my $qTimeE = timelocal($qTime[3],$qTime[2],$qTime[1],$qDate[2],$qDate[1]-1,$qDate[0]); LOG("epoch time is ".$epoch." and mq time is ".$qTimeE);; if ( $qTimeE <= ($epoch - 10*60) ) { convert_to_XML_file($getmessage->Data); } else { LOG("message put time is older than 10 minutes.."); } } sub convert_to_XML_file { my $xmlData = XMLin($getmessage->Data); my @timeA; # Time Array = $xmlData->{STO}=~ /(\d+)/g; # Check Time of Flights @timeA = $xmlData->{STO}=~ /(\d+)/g; my $timeS = join "", @timeA; # Put TimeA Values into String my $filename = $xmlData->{UniqueID}.'_'.$xmlData->{AnnouncementCode}.'_'.$timeS.'.xml'; print "filename is ".$filename."\n"; open(FILE,'>',"$xDir/$filename") or die "Can't write file '$xDir\/$filename' [$!]\n"; print FILE $getmessage->Data; close(FILE); } sub get_message { my $getmessage = MQSeries::Message->new(); $queue->Get( Message => $getmessage, # Get Queue's Message portion Sync => 0, # 0 removes message from queue, 1 keeps message in queue ); if (! defined $getmessage->Data) { if ( $queue->{Reason} == 2033 ) { LOG("Message Queue is empty, checking it again in 5 seconds."); sleep 5; } elsif ( $queue->{Reason} == 2009 ) { LOG("Due to MQ Error 2009, connection will be restarted.."); sleep 10; } else { LOG("Unable to get message. Reason is $queue->{Reason}, " ."Completion Code is $queue->{CompCode}, " ."re-trying in 5 seconds.."); sleep 5; } return undef; } return $getmessage; } sub open_queue_manager { if ( $qmgr_obj = MQSeries::QueueManager->new( QueueManager => $qmgr, ClientConn => { ChannelName => $chnl, TransportType => 'TCP', ConnectionName => "$ipad($port)", MaxMsgLength => 16 * 1024 * 1024 } ) ) { return 1; } LOG("Can't connect to the queue manager, quitting.."); return 0; } sub open_queue { if ( $queue = MQSeries::Queue->new( QueueManager => $qmgr_obj , Queue => $qnam , Mode => 'input' ) ) { return 1; } LOG("Can't connect to the queue, quitting.."); return 0; } sub LOG { print (localtime) . " - " . $msg . ".\n"; }