;; # A comment preceded by two null statements ... why?
####
while (condition) {
...
unless (condition) {
long
block
of
code
}
else {
print "Error message\n";
}
}
####
while (condition) {
...
if (condition) {
print "Error message\n";
next;
}
long
block
of
code
}
####
if (condition) {
some code that
you do sometimes
return 1;
}
else {
code you do at other times
}
####
if (condition) {
some code that
you do sometimes
return 1;
}
# Now that we have the special cases out of the way...
code you do at other times
####
#!/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";
}