-- Compare two msgIds and see if id1 > id2
local function compareMsgIds(id1, id2)
local isBigger = false
local id1List = id1:split("-")
local id2List = id2:split("-")
if id1List[1] > id2List[1] then
isBigger = true
elseif id1List[1] == id2List[1] then
if tonumber(id1List[2]) > tonumber(id2List[2]) then
isBigger = true
end
end
return isBigger
end
-- The main function is the first function called from Iguana.
function main()
-- 1) Define Queued Channel Name and Message Count
local CHANNEL_NAME = '01-File to Socket'
local QUEUED_COUNT = 32
local LOG_COUNT = 20 --Adjust QUERY COUNT if not all queued messages have been queried
-- 2) Query Queued and Ignored Data Msg Messages
local LogResults = net.http.post{
url = 'http://localhost:6543/api_query',
auth = {username = 'admin',password = 'password'},
parameters = {
source= CHANNEL_NAME,
limit = LOG_COUNT,
type="messages",
deleted = 'false',
reverse = true
}, live=true
}
local logXML = xml.parse{data=LogResults}.export
-- 3) Filter and validate only Queued Messages
local filteredLogMsgs = {}
for i= 1, logXML:childCount("message") do
if logXML:child("message", i).type:nodeValue() == "Message" then
table.insert(filteredLogMsgs, logXML:child("message", i))
end
end
-- 4) Get last Processed Message
LogResults = net.http.post{
url = 'http://localhost:6543/log_browse_get_dequeue_position',
auth = {username = 'admin',password = 'password'},
body = "Source="..CHANNEL_NAME,
live=true
}
logXML = json.parse{data=LogResults}
local processedMsg = logXML[CHANNEL_NAME]
local msgId = processedMsg.Date:gsub("/", "").."-"..processedMsg.Position
trace(msgId)
-- 5) Filter out processed Message
local queuedMsgs = {}
for i=1, #filteredLogMsgs do
if compareMsgIds(msgId, filteredLogMsgs[i].message_id:nodeValue()) == msgId then
break
else
table.insert(queuedMsgs,filteredLogMsgs[i].data)
end
end
-- 6) Validate queued messages
trace(queuedMsgs)
if #queuedMsgs ~= QUEUED_COUNT then
error("Not all queued messages have been queried, increase LOG_COUNT")
end
trace(queuedMsgs)
end |