#!/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); while(1) { print "".(localtime)." - Trying to open Queue Manager: $qmgr with Channel: $chnl ...\n"; # Open Queue Manager with defined settings if ( $qmgr_obj = MQSeries::QueueManager->new( QueueManager => $qmgr, ClientConn => { ChannelName => $chnl, TransportType => 'TCP', ConnectionName => "$ipad($port)", MaxMsgLength => 16 * 1024 * 1024 } ) ) { print "".(localtime)." - Queue Manager $qmgr has been opened succesfully.\n"; } else { print "".(localtime)." - Can't connect to the queue manager, quitting...\n"; } ;; ;; print "".(localtime)." - Trying to open Queue: $qnam...\n"; if ( # Open Queue with defined settings $queue = MQSeries::Queue->new( QueueManager => $qmgr_obj , Queue => $qnam , Mode => 'input' ) ) { print "".(localtime)." - Queue $qnam has been opened succesfully.\n"; } else { print "".(localtime)." - Can't connect to the queue, quitting...\n"; } ;; ;; my $c=1; while ( $c==1 ) { my $getmessage = MQSeries::Message->new(); my $dataFromMQ; $queue->Get( Message => $getmessage, # Get Queue's Message portion Sync => 0, # 0 removes message from queue, 1 keeps message in queue ); # or warn( # "".(localtime). # "Unable to get message\n" . # "CompCode = " . $queue->CompCode() . "\n" . # "Reason = " . $queue->Reason() . "\n"); if ( defined $getmessage->Data ) { print "".(localtime)." - got a message from MQ...\n"; ;; # Get current time as Array my @cTimeA = POSIX::strftime("%Y-%m-%dT%H:%M:%S", gmtime) =~ /(\d+)/g; ;; # Convert Current Time ----Second-----,---Minute---,------Hour------,-----Day------,----Month-----,----Year--- print "Current time GMT values; ".$cTimeA[3].":".$cTimeA[4].":".$cTimeA[5]." ".$cTimeA[2]."-".$cTimeA[1]."-".$cTimeA[0]."\n"; my $epoch = timelocal($cTimeA[5],$cTimeA[4],$cTimeA[3],$cTimeA[2],$cTimeA[1]-1,$cTimeA[0]); ;; # Put message time info into array(s) 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)$/; ;; # Get epoch time of message ---Second----,---Minute----,----Hour-----,-----Day-----,----Month----,----Year--- print "Message PutTime GMT values; ".$qTime[1].":".$qTime[2].":".$qTime[3]." ".$qDate[2]."-".$qDate[1]."-".$qDate[0]."\n"; my $qTimeE = timelocal($qTime[3],$qTime[2],$qTime[1],$qDate[2],$qDate[1]-1,$qDate[0]); print "".(localtime)." - epoch time is ".$epoch." and mq time is ".$qTimeE."\n"; ;; # Epoch Time minus 1 hour is => $epoch - 3600 ;; # If message time is older than 10 minutes ignore it unless ( $qTimeE <= ($epoch - 600) ) { ;; # Convert Message's Data to XML my $xmlData = XMLin($getmessage->Data); my @timeA; # Time Array = $xmlData->{STO}=~ /(\d+)/g; ;; # Check Time of Flights #if ($xmlData->{AnnouncementCode} eq "11") #{ @timeA = $xmlData->{ATO}=~ /(\d+)/g; } #else #{ @timeA = $xmlData->{STO}=~ /(\d+)/g; #} ;; ############ my $timeS = join "", @timeA; # Put TimeA Values into String #my $timeE = timelocal($timeA[5],$timeA[4],$timeA[3],$timeA[2],$timeA[1],$timeA[0]); 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); } else { print "".(localtime)." - message put time is older than 10 minutes...\n"; } } else { if ( $queue->{Reason} == 2033 ) { ;; # Reason 2033 means queue is empty print "".(localtime)." - Message Queue is empty, checking it again in 5 seconds...\n"; sleep 5; } elsif ( $queue->{Reason} == 2009 ) { print "".(localtime)." - Due to MQ Error 2009, connection will be restarted...\n"; sleep 10; } else { print "".(localtime)." - Unable to get message. Reason is ",$queue->{Reason},", Completion Code is ",$queue->{CompCode},", re-trying in 5 seconds...\n"; sleep 5; } #$c++; } ;; # End of Inner WHILE Loop } ;; # Wait 5 seconds before retrying... #sleep 5; ;; # End of Infinite WHILE Loop } my $EoF = "End of File";