OB_14.1.1-19 baseline
Former-commit-id:3508e488f5
[formerly779553142c
] [formerlycfa4997978
] [formerly3508e488f5
[formerly779553142c
] [formerlycfa4997978
] [formerly10b723647b
[formerlycfa4997978
[formerly db2a591456383d8f980d33757e8c161bdcc01d3a]]]] Former-commit-id:10b723647b
Former-commit-id:5a11fbbfdb
[formerlyc41dd22ff2
] [formerly f52dfb462cf92e04bf51f942fd80bfc621074563 [formerly64044e7ce5
]] Former-commit-id: 8cf9beeb99ea9f03c45e09f6c11fba57ddab3585 [formerly1b359c2564
] Former-commit-id:f86f9f8918
This commit is contained in:
parent
fc21d2dee4
commit
de9e6553a9
145 changed files with 1766 additions and 1687 deletions
|
@ -11,6 +11,7 @@
|
|||
# Apr 03,2012 436 randerso Converted to Python procedure to allow some
|
||||
# level of site customization
|
||||
# Apr 09,2012 436 randerso Merged RNK's MakeHazards_Elevation procedure
|
||||
# Feb 12,2014 17058 ryu Extend converter for Collections$EmptyList objects.
|
||||
#
|
||||
# Author: randerso
|
||||
# ----------------------------------------------------------------------------
|
||||
|
@ -307,6 +308,8 @@ def converter(obj):
|
|||
objtype = obj.jclassname
|
||||
if objtype == "java.util.Date":
|
||||
retVal = AbsTime.AbsTime(obj)
|
||||
elif objtype == "java.util.Collections$EmptyList":
|
||||
retVal = []
|
||||
elif objtype == "com.raytheon.uf.common.time.TimeRange":
|
||||
retVal = TimeRange.TimeRange(obj)
|
||||
return retVal
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
##
|
||||
# This software was developed and / or modified by Raytheon Company,
|
||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
#
|
||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
#
|
||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
# This software product contains export-restricted data whose
|
||||
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
# to non-U.S. persons whether in the United States or abroad requires
|
||||
# an export license or other authorization.
|
||||
#
|
||||
# Contractor Name: Raytheon Company
|
||||
# Contractor Address: 6825 Pine Street, Suite 340
|
||||
# Mail Stop B8
|
||||
# Omaha, NE 68106
|
||||
# 402.291.0100
|
||||
#
|
||||
#
|
||||
# Contractor Name: Raytheon Company
|
||||
# Contractor Address: 6825 Pine Street, Suite 340
|
||||
# Mail Stop B8
|
||||
# Omaha, NE 68106
|
||||
# 402.291.0100
|
||||
#
|
||||
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
# further licensing information.
|
||||
##
|
||||
|
@ -27,16 +27,25 @@
|
|||
#
|
||||
# Author: hansen
|
||||
# ----------------------------------------------------------------------------
|
||||
#
|
||||
# SOFTWARE HISTORY
|
||||
#
|
||||
# Date Ticket# Engineer Description
|
||||
# ------------ ---------- ----------- --------------------------
|
||||
# 02/12/2014 #2591 randerso Added retry when loading combinations fails
|
||||
|
||||
import string, getopt, sys, time, os, types, math
|
||||
import ModuleAccessor
|
||||
import Utility, logging, traceback
|
||||
import AbsTime
|
||||
from java.lang import ThreadDeath
|
||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceID, ReferenceData
|
||||
|
||||
GridLoc = None
|
||||
LatLonIds = []
|
||||
|
||||
MAX_TRIES = 2
|
||||
|
||||
# If someone imports TextFormatter and needs this instance
|
||||
# they should either be fixed to use the IFPImporter module
|
||||
# or turn this line on (which is a kludge but should make
|
||||
|
@ -44,19 +53,19 @@ LatLonIds = []
|
|||
#IFPImporter = IFPImporter.IFPImporter
|
||||
|
||||
class TextFormatter:
|
||||
def __init__(self, dataManager):
|
||||
def __init__(self, dataManager):
|
||||
# Variable for unique combinations
|
||||
self.__comboNumber = -1
|
||||
self.dataMgr = dataManager
|
||||
self.log = logging.getLogger("FormatterRunner.TextFormatter.TextFormatter")
|
||||
pass
|
||||
|
||||
|
||||
# def __del__(self):
|
||||
# for i in LatLonIds:
|
||||
# self.dataMgr.getRefManager().deleteRefSet(i, False)
|
||||
|
||||
def getForecast(self, fcstName, argDict):
|
||||
" Create the forecast "
|
||||
" Create the forecast "
|
||||
|
||||
ForecastNarrative = argDict["ForecastNarrative"]
|
||||
ForecastTable = argDict["ForecastTable"]
|
||||
|
@ -71,7 +80,7 @@ class TextFormatter:
|
|||
argDict["getForecast"] = self.getForecast
|
||||
argDict["getFcstDef"] = self.getFcstDef
|
||||
argDict["dataMgr"] = self.dataMgr
|
||||
self.__ut = argDict["utility"]
|
||||
self.__ut = argDict["utility"]
|
||||
|
||||
# Get the Forecast Definition and type from the server
|
||||
#print "finding", fcstName
|
||||
|
@ -79,11 +88,11 @@ class TextFormatter:
|
|||
#print "found ", found
|
||||
if found == 0:
|
||||
text = "Text Product Definition Not Found: " + fcstName + " " + \
|
||||
traceback.format_exc()
|
||||
traceback.format_exc()
|
||||
self.log.error("Text Product Definition Not Found: Caught Exception: " + fcstName, exc_info=True)
|
||||
raise Exception, text
|
||||
forecastDef = argDict["forecastDef"]
|
||||
fcstType = self.__ut.set(forecastDef,"type",None)
|
||||
fcstType = self.__ut.set(forecastDef, "type", None)
|
||||
argDict["fcstType"] = fcstType
|
||||
if fcstType is None:
|
||||
text = "Text Product Type Not Found: " + fcstName + " " + \
|
||||
|
@ -101,16 +110,16 @@ class TextFormatter:
|
|||
# Must have at least one edit area and time range specified
|
||||
if fcstType != "smart" and fcstType != "component":
|
||||
if argDict["editAreas"] == []:
|
||||
text= "No Edit Areas Specified over which to generate product."
|
||||
text=text+'\nTry setting "defaultEditAreas" in the product Definition'
|
||||
text=text+'\nOr, if running from the command line, add a -r flag.'
|
||||
text = "No Edit Areas Specified over which to generate product."
|
||||
text = text + '\nTry setting "defaultEditAreas" in the product Definition'
|
||||
text = text + '\nOr, if running from the command line, add a -r flag.'
|
||||
text = text + '\n' + string.join(traceback.format_exc())
|
||||
self.log.error("Caught Exception: " + text)
|
||||
raise Exception, text
|
||||
if argDict["rawRanges"] == []:
|
||||
text= "No Time Ranges Specified over which to generate product."
|
||||
text=text+'\nTry setting "defaultRanges" in the product Definition'
|
||||
text=text+'\nOr, if running from the command line, add a -w flag.'
|
||||
text = "No Time Ranges Specified over which to generate product."
|
||||
text = text + '\nTry setting "defaultRanges" in the product Definition'
|
||||
text = text + '\nOr, if running from the command line, add a -w flag.'
|
||||
text = text + '\n' + string.join(traceback.format_exc())
|
||||
self.log.error("Caught Exception: " + text)
|
||||
raise Exception, text
|
||||
|
@ -153,7 +162,7 @@ class TextFormatter:
|
|||
argDict["module"] = module
|
||||
product.setUp("T", argDict)
|
||||
product._argDict = argDict
|
||||
|
||||
|
||||
try:
|
||||
text = product.generateForecast(argDict)
|
||||
except RuntimeError, e:
|
||||
|
@ -166,11 +175,11 @@ class TextFormatter:
|
|||
|
||||
# requirement for TEST phrasing for TEST products
|
||||
if argDict.get('testMode', 0):
|
||||
testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" +\
|
||||
testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" + \
|
||||
" BASED ON THIS TEST\nMESSAGE.\n"
|
||||
#split by "$$"
|
||||
segs = text.split('\n$$')
|
||||
for i in xrange(len(segs)-1): #never the last one
|
||||
for i in xrange(len(segs) - 1): #never the last one
|
||||
if text.find(testMsg) == -1: #not found, add it in
|
||||
segs[i] = segs[i] + testMsg
|
||||
text = '\n$$'.join(segs) #put text back together again
|
||||
|
@ -185,7 +194,7 @@ class TextFormatter:
|
|||
if not forecastDef.get('lowerCase', 0):
|
||||
text = text.upper()
|
||||
else:
|
||||
text="Text Product Type Invalid "+\
|
||||
text = "Text Product Type Invalid " + \
|
||||
"(must be 'table', 'component' or 'narrative'): ", fcstName, type
|
||||
text = text + '\n' + string.join(traceback.format_exc())
|
||||
self.log.error("Caught Exception: " + text)
|
||||
|
@ -196,18 +205,18 @@ class TextFormatter:
|
|||
def __createNarrativeDef(self, fcstName, timeRange):
|
||||
return {
|
||||
"methodList": [self.assembleChildWords],
|
||||
"narrativeDef": [(fcstName, timeRange.duration()/3600)],
|
||||
"narrativeDef": [(fcstName, timeRange.duration() / 3600)],
|
||||
}
|
||||
|
||||
def __loop(self, argDict, forecast, forecastDef):
|
||||
# Loop through product by edit areas and time ranges
|
||||
|
||||
begText = self.__ut.set(forecastDef,"beginningText","")
|
||||
endText = self.__ut.set(forecastDef,"endingText","")
|
||||
editAreaLoopBegText = self.__ut.set(forecastDef,"editAreaLoopBegText","")
|
||||
timeRangeLoopBegText = self.__ut.set(forecastDef,"timeRangeLoopBegText","")
|
||||
editAreaLoopEndText = self.__ut.set(forecastDef,"editAreaLoopEndText","")
|
||||
timeRangeLoopEndText = self.__ut.set(forecastDef,"timeRangeLoopEndText","")
|
||||
begText = self.__ut.set(forecastDef, "beginningText", "")
|
||||
endText = self.__ut.set(forecastDef, "endingText", "")
|
||||
editAreaLoopBegText = self.__ut.set(forecastDef, "editAreaLoopBegText", "")
|
||||
timeRangeLoopBegText = self.__ut.set(forecastDef, "timeRangeLoopBegText", "")
|
||||
editAreaLoopEndText = self.__ut.set(forecastDef, "editAreaLoopEndText", "")
|
||||
timeRangeLoopEndText = self.__ut.set(forecastDef, "timeRangeLoopEndText", "")
|
||||
outerLoop = self.__ut.set(forecastDef, "outerLoop", "EditArea")
|
||||
|
||||
editAreas = argDict["editAreas"]
|
||||
|
@ -274,10 +283,10 @@ class TextFormatter:
|
|||
#print "varDict", varDict
|
||||
|
||||
for item, default in [
|
||||
("language","english"),
|
||||
("appendFile",None),
|
||||
("lineLength",69), # no command line option
|
||||
("timePeriod",3),
|
||||
("language", "english"),
|
||||
("appendFile", None),
|
||||
("lineLength", 69), # no command line option
|
||||
("timePeriod", 3),
|
||||
]:
|
||||
try: # Try the varDict
|
||||
#print "trying varDict", item
|
||||
|
@ -362,19 +371,28 @@ class TextFormatter:
|
|||
# (["Zones37","Zones38"], "/37/38"),"/37/38"),
|
||||
# (["Zones57","Zones58","Zones59"],"57/58/59")
|
||||
# ]
|
||||
|
||||
# RWA-05/19/11: added this check here to force Combinations files
|
||||
# to be reloaded since we removed a similar check from ModuleAccessor
|
||||
# to preserve the magicCodeChanges. Perhaps we should be doing something
|
||||
# similar to magicCodeChanges for Combinations files as well.
|
||||
if sys.modules.has_key(dfEditAreas):
|
||||
del sys.modules[dfEditAreas]
|
||||
|
||||
accessor = ModuleAccessor.ModuleAccessor()
|
||||
dfEditAreas = accessor.variable(dfEditAreas, "Combinations")
|
||||
if dfEditAreas is None:
|
||||
return "COMBINATION FILE NOT FOUND: " + \
|
||||
self.__ut.set(forecastDef, "defaultEditAreas", [])
|
||||
|
||||
comboName = dfEditAreas
|
||||
for retryCount in xrange(MAX_TRIES):
|
||||
accessor = ModuleAccessor.ModuleAccessor()
|
||||
dfEditAreas = accessor.variable(comboName, "Combinations")
|
||||
if dfEditAreas is None:
|
||||
if sys.modules.has_key(comboName):
|
||||
comboMod = sys.modules[comboName]
|
||||
if comboMod.__file__.endswith(".pyo"):
|
||||
os.remove(comboMod.__file__)
|
||||
comboMod = None
|
||||
del sys.modules[comboName]
|
||||
|
||||
# if not last try, log and try again
|
||||
if retryCount < MAX_TRIES - 1:
|
||||
# log but don't pop up
|
||||
self.log.error("Error loading combinations file: %s, retrying", comboName)
|
||||
else:
|
||||
return "COMBINATION FILE NOT FOUND: " + \
|
||||
self.__ut.set(forecastDef, "defaultEditAreas", [])
|
||||
else:
|
||||
break
|
||||
|
||||
elif len(dfEditAreas) > 0:
|
||||
refDataList = []
|
||||
|
@ -411,7 +429,7 @@ class TextFormatter:
|
|||
filterMethod = product.filterMethod
|
||||
except:
|
||||
allowedHazards = None
|
||||
|
||||
|
||||
if allowedHazards is not None and allowedHazards != []:
|
||||
# Set up editAreas as a list of combinations
|
||||
# Cases:
|
||||
|
@ -440,7 +458,7 @@ class TextFormatter:
|
|||
"AreaDictionary")
|
||||
editAreas = self._separateByTimeZone(editAreas,
|
||||
areaDictName, argDict['creationTime'],
|
||||
effectiveTZ = separateByTZ)
|
||||
effectiveTZ=separateByTZ)
|
||||
|
||||
accurateCities = product.Definition.get('accurateCities', 0)
|
||||
cityRefData = []
|
||||
|
@ -464,7 +482,7 @@ class TextFormatter:
|
|||
"contain entry for edit area: "
|
||||
self.log.error(msg + `ean`)
|
||||
continue
|
||||
|
||||
|
||||
for city, llrec in citydict[ean].iteritems():
|
||||
# Create a referenceData given lat, lon, dim
|
||||
area = (llrec[0], llrec[1], 0)
|
||||
|
@ -490,8 +508,8 @@ class TextFormatter:
|
|||
filterMethod, argDict["databaseID"], stationID4,
|
||||
argDict["vtecActiveTable"], argDict["vtecMode"],
|
||||
sampleThreshold, creationTime=argDict["creationTime"], dataMgr=self.dataMgr,
|
||||
accurateCities=accurateCities,
|
||||
cityEditAreas=cityRefData)
|
||||
accurateCities=accurateCities,
|
||||
cityEditAreas=cityRefData)
|
||||
|
||||
# Store hazards object for later use
|
||||
argDict["hazards"] = hazards
|
||||
|
@ -540,7 +558,7 @@ class TextFormatter:
|
|||
except:
|
||||
trName = ""
|
||||
if tr is not None:
|
||||
rawRanges.append((tr,trName))
|
||||
rawRanges.append((tr, trName))
|
||||
elif len(dfRanges) == 0:
|
||||
pass
|
||||
else:
|
||||
|
@ -548,13 +566,13 @@ class TextFormatter:
|
|||
forecast = TimeRangeUtils.TimeRangeUtils()
|
||||
for rangeName in dfRanges:
|
||||
rawRange = forecast.getTimeRange(rangeName, argDict)
|
||||
rawRanges.append((rawRange,rangeName))
|
||||
rawRanges.append((rawRange, rangeName))
|
||||
argDict["rawRanges"] = rawRanges
|
||||
#print "rawRanges", rawRanges
|
||||
|
||||
# Row Label
|
||||
areaType = self.__ut.set(forecastDef,"areaType","")
|
||||
rowVariable = self.__ut.set(forecastDef,"rowVariable","EditArea")
|
||||
areaType = self.__ut.set(forecastDef, "areaType", "")
|
||||
rowVariable = self.__ut.set(forecastDef, "rowVariable", "EditArea")
|
||||
if rowVariable == "EditArea":
|
||||
rowLabel = areaType
|
||||
elif rowVariable == "WeatherElement":
|
||||
|
@ -566,7 +584,7 @@ class TextFormatter:
|
|||
def __pairAreaWithLabel(self, chosenAreas, defaultEditAreas):
|
||||
# Pair the chosen edit areas with associated labels from
|
||||
# default list and return new list
|
||||
dfEditAreas= []
|
||||
dfEditAreas = []
|
||||
for area in chosenAreas:
|
||||
for name, label in defaultEditAreas:
|
||||
if area == name:
|
||||
|
@ -620,8 +638,8 @@ class TextFormatter:
|
|||
def __getLatLonAreaName(self, latLonTuple):
|
||||
lat, lon, dim = latLonTuple
|
||||
name = "Ref" + '%s%s%s' % (lat, lon, dim)
|
||||
name = name.replace(".","")
|
||||
name = name.replace("-","")
|
||||
name = name.replace(".", "")
|
||||
name = name.replace("-", "")
|
||||
return name
|
||||
|
||||
def getCombinations(self, combinations, argDict):
|
||||
|
@ -635,7 +653,7 @@ class TextFormatter:
|
|||
newArea = self.getEditArea(editArea, argDict)
|
||||
if comboList.index(editArea) == 0:
|
||||
comboNumber = self.getComboNumber()
|
||||
label = "Combo"+`comboNumber`
|
||||
label = "Combo" + `comboNumber`
|
||||
refId = ReferenceID(label)
|
||||
#global GridLoc
|
||||
#GridLoc = newArea.getGloc()
|
||||
|
@ -680,7 +698,7 @@ class TextFormatter:
|
|||
|
||||
try:
|
||||
product = argDict["self"]
|
||||
exec "fcstDef = product."+fcstName+"()"
|
||||
exec "fcstDef = product." + fcstName + "()"
|
||||
module = argDict["module"]
|
||||
except:
|
||||
# See if fcstName is variable in imported modules e.g. MyTable = {}
|
||||
|
@ -699,7 +717,7 @@ class TextFormatter:
|
|||
try:
|
||||
# Look for fcstName = {}
|
||||
# This can be removed eventually
|
||||
exec "fcstDef = module."+fcstName
|
||||
exec "fcstDef = module." + fcstName
|
||||
except:
|
||||
try:
|
||||
# Try to instantiate smart text product class
|
||||
|
@ -750,7 +768,7 @@ class TextFormatter:
|
|||
|
||||
def getEditArea(self, editAreaName, argDict):
|
||||
# Returns an AFPS.ReferenceData object given an edit area name
|
||||
# as defined in the GFE
|
||||
# as defined in the GFE
|
||||
# Apply suffix if appropriate
|
||||
refID = ReferenceID(editAreaName)
|
||||
#print "Getting edit area"
|
||||
|
@ -779,7 +797,7 @@ class TextFormatter:
|
|||
return tmp
|
||||
|
||||
def _separateByTimeZone(self, editAreaGroups, areaDictName, creationTime,
|
||||
effectiveTZ = "effectiveTZ"):
|
||||
effectiveTZ="effectiveTZ"):
|
||||
#takes the list of areas, and based on the time zones breaks
|
||||
#them up to ensure that each grouping using the same time zone.
|
||||
#areaDictName is name of the area dictionary. creationTime is the
|
||||
|
@ -817,7 +835,7 @@ class TextFormatter:
|
|||
zoneTZ = localTZ
|
||||
tzid = localTZid
|
||||
#print "falling back to WFOtz: ", zoneTZ
|
||||
self.log.warning("WARNING: Entry " + area +
|
||||
self.log.warning("WARNING: Entry " + area +
|
||||
" missing from AreaDictionary. Using default time zone.")
|
||||
|
||||
zones = tzDir.get(zoneTZ, [])
|
||||
|
@ -835,7 +853,7 @@ class TextFormatter:
|
|||
elif effectiveTZ == "actualTZ":
|
||||
dict = tzDir
|
||||
else:
|
||||
self.log.error("Invalid effectiveTZ for separateByTZ() " +
|
||||
self.log.error("Invalid effectiveTZ for separateByTZ() " +
|
||||
effectiveTZ)
|
||||
return editAreaGroups
|
||||
keys = dict.keys()
|
||||
|
@ -850,39 +868,39 @@ class TextFormatter:
|
|||
#################################################################
|
||||
def makeSquare(lat, lon, km):
|
||||
" Make a list of square of given km around lat,lon"
|
||||
latinc = km/222.0
|
||||
loninc = math.cos(lat/57.17) * km / 222.0
|
||||
latinc = km / 222.0
|
||||
loninc = math.cos(lat / 57.17) * km / 222.0
|
||||
|
||||
latTop = lat + latinc
|
||||
latBottom =lat - latinc
|
||||
latBottom = lat - latinc
|
||||
lonLeft = lon - loninc
|
||||
lonRight = lon + loninc
|
||||
|
||||
points = []
|
||||
points.append(`latTop`+","+ `lonRight`)
|
||||
points.append(`latTop`+","+ `lonLeft`)
|
||||
points.append(`latBottom`+","+ `lonLeft`)
|
||||
points.append(`latBottom`+","+`lonRight`)
|
||||
points.append(`latTop` + "," + `lonRight`)
|
||||
points.append(`latTop` + "," + `lonLeft`)
|
||||
points.append(`latBottom` + "," + `lonLeft`)
|
||||
points.append(`latBottom` + "," + `lonRight`)
|
||||
return points
|
||||
|
||||
def makePoint(point):
|
||||
" Make a CartCoord2D from the point in format: x,y"
|
||||
from com.vividsolutions.jts.geom import Coordinate
|
||||
ind = string.find(point,",")
|
||||
latStr = point[0:ind-1]
|
||||
lonStr = point[ind+1:len(point)]
|
||||
ind = string.find(point, ",")
|
||||
latStr = point[0:ind - 1]
|
||||
lonStr = point[ind + 1:len(point)]
|
||||
lat = float(latStr)
|
||||
lon = float(lonStr)
|
||||
return Coordinate(lon,lat)
|
||||
lon = float(lonStr)
|
||||
return Coordinate(lon, lat)
|
||||
|
||||
def makeArea(gridLoc, pointList, refname=None):
|
||||
" Make a Reference Area with a unique ReferenceID"
|
||||
from com.vividsolutions.jts.geom import GeometryFactory, LinearRing, Coordinate, Polygon
|
||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType
|
||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType
|
||||
geomFactory = GeometryFactory()
|
||||
import jep
|
||||
size = len(pointList)
|
||||
if pointList[0] != pointList[size-1]: # closing the loop
|
||||
if pointList[0] != pointList[size - 1]: # closing the loop
|
||||
pointList.append(pointList[0])
|
||||
pointArray = jep.jarray(len(pointList), Coordinate)
|
||||
for i in range(len(pointList)):
|
||||
|
@ -893,7 +911,7 @@ def makeArea(gridLoc, pointList, refname=None):
|
|||
polyArray[0] = poly
|
||||
region = geomFactory.createMultiPolygon(polyArray)
|
||||
if refname is None:
|
||||
refname = "Ref" + getTime()
|
||||
refname = "Ref" + getTime()
|
||||
refId = ReferenceID(refname)
|
||||
refData = ReferenceData(gridLoc, refId, region, CoordinateType.LATLON)
|
||||
# randerso: I don't think this is necessary
|
||||
|
@ -913,8 +931,8 @@ def storeReferenceData(refSetMgr, refData, temp=True):
|
|||
|
||||
def getTime():
|
||||
"Return an ascii string for the current time without spaces or :'s"
|
||||
timeStr = `time.time()`
|
||||
timeStr = string.replace(timeStr,".","_")
|
||||
timeStr = `time.time()`
|
||||
timeStr = string.replace(timeStr, ".", "_")
|
||||
return timeStr
|
||||
|
||||
def getAbsTime(timeStr):
|
||||
|
@ -926,7 +944,7 @@ def getAbsTime(timeStr):
|
|||
hour = string.atoi(timeStr[9:11])
|
||||
minute = string.atoi(timeStr[11:13])
|
||||
|
||||
return AFPSSup.AbsTimeYMD(year,month,day,hour,minute)
|
||||
return AbsTime.absTimeYMD(year, month, day, hour, minute)
|
||||
|
||||
def usage():
|
||||
print """
|
||||
|
|
|
@ -294,7 +294,7 @@ function logExitStatus()
|
|||
hostPath="$basePath/$hostName/"
|
||||
mkdir -p $hostPath
|
||||
if [ -d "$hostPath" ]; then
|
||||
cp $coreFile $hostPath
|
||||
mv $coreFile $hostPath
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -70,7 +70,8 @@ import com.raytheon.uf.viz.core.notification.NotificationMessage;
|
|||
* 05/08/08 1127 randerso Initial Creation
|
||||
* 09/03/08 1448 chammack Refactored notification observer interface
|
||||
* 04/23/13 1939 randerso Add separate connect method to allow application
|
||||
* to complete initialization before connecting to JMS
|
||||
* to complete initialization before connecting to JMS.
|
||||
* 10/15/2013 2389 rjpeter Updated synchronization to remove session leaks.
|
||||
* </pre>
|
||||
*
|
||||
* @author randerso
|
||||
|
@ -107,9 +108,10 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result
|
||||
result = (prime * result)
|
||||
+ ((queryString == null) ? 0 : queryString.hashCode());
|
||||
result = prime * result + ((topic == null) ? 0 : topic.hashCode());
|
||||
result = (prime * result)
|
||||
+ ((topic == null) ? 0 : topic.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -156,11 +158,11 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
private static NotificationManagerJob instance;
|
||||
|
||||
/** The observer map of topic to listeners */
|
||||
protected Map<ListenerKey, NotificationListener> listeners;
|
||||
protected final Map<ListenerKey, NotificationListener> listeners;
|
||||
|
||||
private Connection connection;
|
||||
|
||||
private boolean connected = false;
|
||||
private volatile boolean connected = false;
|
||||
|
||||
/**
|
||||
* Get the active subscription manager job. If one does not exist, start an
|
||||
|
@ -191,18 +193,29 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
|
||||
protected void connect(boolean notifyError) {
|
||||
boolean successful = true;
|
||||
try {
|
||||
ConnectionFactory connectionFactory = JMSConnection.getInstance()
|
||||
.getFactory();
|
||||
disconnect(notifyError);
|
||||
synchronized (this) {
|
||||
try {
|
||||
ConnectionFactory connectionFactory = JMSConnection
|
||||
.getInstance().getFactory();
|
||||
disconnect(notifyError);
|
||||
|
||||
// Create a Connection
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.setExceptionListener(this);
|
||||
// connection.setClientID(VizApp.getWsId().toString());
|
||||
// Create a Connection
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.setExceptionListener(this);
|
||||
// connection.setClientID(VizApp.getWsId().toString());
|
||||
|
||||
connection.start();
|
||||
connected = true;
|
||||
connection.start();
|
||||
connected = true;
|
||||
} catch (JMSException e) {
|
||||
if (notifyError) {
|
||||
statusHandler.handle(Priority.SIGNIFICANT,
|
||||
"NotificationManager failed to connect.", e);
|
||||
}
|
||||
successful = false;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (listeners) {
|
||||
for (NotificationListener listener : listeners.values()) {
|
||||
try {
|
||||
listener.setupConnection(this);
|
||||
|
@ -216,12 +229,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
}
|
||||
}
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
if (notifyError) {
|
||||
statusHandler.handle(Priority.SIGNIFICANT,
|
||||
"NotificationManager failed to connect.", e);
|
||||
}
|
||||
successful = false;
|
||||
}
|
||||
|
||||
if (!successful) {
|
||||
|
@ -229,7 +236,22 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
}
|
||||
}
|
||||
|
||||
protected void disconnect(boolean notifyError) {
|
||||
/**
|
||||
* Creates a new AUTO_ACKNOWLEDGE session if connected to JMS, otherwise
|
||||
* returns null.
|
||||
*
|
||||
* @return
|
||||
* @throws JMSException
|
||||
*/
|
||||
protected synchronized Session createSession() throws JMSException {
|
||||
if (connected) {
|
||||
return connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected synchronized void disconnect(boolean notifyError) {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.stop();
|
||||
|
@ -271,9 +293,11 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
new Timer().schedule(task, 5 * 1000);
|
||||
}
|
||||
|
||||
// Reset connected bool
|
||||
for (NotificationListener listener : listeners.values()) {
|
||||
listener.connected = false;
|
||||
synchronized (listeners) {
|
||||
// disconnect listeners
|
||||
for (NotificationListener listener : listeners.values()) {
|
||||
listener.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
if (e != null) {
|
||||
|
@ -282,33 +306,38 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
}
|
||||
}
|
||||
|
||||
public static synchronized void addQueueObserver(String queue,
|
||||
INotificationObserver obs) {
|
||||
public static void addQueueObserver(String queue, INotificationObserver obs) {
|
||||
addQueueObserver(queue, obs, null);
|
||||
}
|
||||
|
||||
public static synchronized void addQueueObserver(String queue,
|
||||
public static void addQueueObserver(String queue,
|
||||
INotificationObserver obs, String queryString) {
|
||||
NotificationManagerJob notifMgr = getInstance();
|
||||
ListenerKey key = new ListenerKey(queue, queryString);
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null || listener.consumer == null) {
|
||||
try {
|
||||
listener = new NotificationListener(queue, queryString,
|
||||
Type.QUEUE);
|
||||
notifMgr.listeners.put(key, listener);
|
||||
listener.addObserver(obs);
|
||||
if (notifMgr.connected) {
|
||||
listener.setupConnection(notifMgr);
|
||||
|
||||
synchronized (notifMgr.listeners) {
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
try {
|
||||
listener = new NotificationListener(queue, queryString,
|
||||
Type.QUEUE);
|
||||
notifMgr.listeners.put(key, listener);
|
||||
listener.addObserver(obs);
|
||||
if (notifMgr.connected) {
|
||||
listener.setupConnection(notifMgr);
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
Status s = new Status(
|
||||
IStatus.ERROR,
|
||||
Activator.PLUGIN_ID,
|
||||
0,
|
||||
"NotificationManager failed to create queue consumer.",
|
||||
e);
|
||||
StatusManager.getManager().handle(s);
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
|
||||
"NotificationManager failed to create queue consumer.",
|
||||
e);
|
||||
StatusManager.getManager().handle(s);
|
||||
} else {
|
||||
listener.addObserver(obs);
|
||||
}
|
||||
} else {
|
||||
listener.addObserver(obs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -320,32 +349,35 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
* @param obs
|
||||
* the alert observer callback
|
||||
*/
|
||||
public static synchronized void addObserver(String topic,
|
||||
INotificationObserver obs) {
|
||||
public static void addObserver(String topic, INotificationObserver obs) {
|
||||
addObserver(topic, obs, null);
|
||||
}
|
||||
|
||||
public static synchronized void addObserver(String topic,
|
||||
INotificationObserver obs, String queryString) {
|
||||
public static void addObserver(String topic, INotificationObserver obs,
|
||||
String queryString) {
|
||||
NotificationManagerJob notifMgr = getInstance();
|
||||
ListenerKey key = new ListenerKey(topic, queryString);
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
try {
|
||||
listener = new NotificationListener(topic, queryString,
|
||||
Type.TOPIC);
|
||||
notifMgr.listeners.put(key, listener);
|
||||
listener.addObserver(obs);
|
||||
if (notifMgr.connected) {
|
||||
listener.setupConnection(notifMgr);
|
||||
|
||||
synchronized (notifMgr.listeners) {
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
try {
|
||||
listener = new NotificationListener(topic, queryString,
|
||||
Type.TOPIC);
|
||||
notifMgr.listeners.put(key, listener);
|
||||
listener.addObserver(obs);
|
||||
if (notifMgr.connected) {
|
||||
listener.setupConnection(notifMgr);
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
|
||||
0,
|
||||
"NotificationManager failed to create consumer.", e);
|
||||
StatusManager.getManager().handle(s);
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
|
||||
"NotificationManager failed to create consumer.", e);
|
||||
StatusManager.getManager().handle(s);
|
||||
} else {
|
||||
listener.addObserver(obs);
|
||||
}
|
||||
} else {
|
||||
listener.addObserver(obs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -358,8 +390,7 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
* @param obs
|
||||
* the observer to remove
|
||||
*/
|
||||
public static synchronized void removeObserver(String topic,
|
||||
INotificationObserver obs) {
|
||||
public static void removeObserver(String topic, INotificationObserver obs) {
|
||||
removeObserver(topic, obs, null);
|
||||
}
|
||||
|
||||
|
@ -373,18 +404,20 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
* the observer to remove
|
||||
* @param queryString
|
||||
*/
|
||||
public static synchronized void removeObserver(String topic,
|
||||
INotificationObserver obs, String queryString) {
|
||||
public static void removeObserver(String topic, INotificationObserver obs,
|
||||
String queryString) {
|
||||
NotificationManagerJob notifMgr = getInstance();
|
||||
ListenerKey key = new ListenerKey(topic, queryString);
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
listener.removeObserver(obs);
|
||||
if (listener.size() <= 0) {
|
||||
listener.disconnect();
|
||||
notifMgr.listeners.remove(key);
|
||||
synchronized (notifMgr.listeners) {
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
listener.removeObserver(obs);
|
||||
if (listener.size() <= 0) {
|
||||
listener.disconnect();
|
||||
notifMgr.listeners.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -397,18 +430,20 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
* @param obs
|
||||
* the observer to remove
|
||||
*/
|
||||
public static synchronized void removeQueueObserver(String queue,
|
||||
String queryString, INotificationObserver obs) {
|
||||
public static void removeQueueObserver(String queue, String queryString,
|
||||
INotificationObserver obs) {
|
||||
NotificationManagerJob notifMgr = getInstance();
|
||||
ListenerKey key = new ListenerKey(queue, queryString);
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
listener.removeObserver(obs);
|
||||
if (listener.size() <= 0) {
|
||||
listener.disconnect();
|
||||
notifMgr.listeners.remove(key);
|
||||
synchronized (notifMgr.listeners) {
|
||||
NotificationListener listener = notifMgr.listeners.get(key);
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
listener.removeObserver(obs);
|
||||
if (listener.size() <= 0) {
|
||||
listener.disconnect();
|
||||
notifMgr.listeners.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -428,24 +463,22 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
|
||||
private static class NotificationListener implements MessageListener {
|
||||
|
||||
private Type type;
|
||||
private final Type type;
|
||||
|
||||
private String id;
|
||||
private final String id;
|
||||
|
||||
private String queryString;
|
||||
private final String queryString;
|
||||
|
||||
/** The list of interested parties */
|
||||
protected List<INotificationObserver> observers;
|
||||
protected final List<INotificationObserver> observers;
|
||||
|
||||
/** The map of job threads from observers */
|
||||
protected Map<INotificationObserver, JobWrapper> jobWrappers;
|
||||
protected final Map<INotificationObserver, JobWrapper> jobWrappers;
|
||||
|
||||
protected MessageConsumer consumer;
|
||||
|
||||
protected Session session;
|
||||
|
||||
protected boolean connected = false;
|
||||
|
||||
public NotificationListener(String id, String queryString, Type type) {
|
||||
this.observers = new ArrayList<INotificationObserver>();
|
||||
this.jobWrappers = new HashMap<INotificationObserver, JobWrapper>();
|
||||
|
@ -466,40 +499,34 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
break;
|
||||
}
|
||||
}
|
||||
// If we made it here we are good
|
||||
connected = true;
|
||||
}
|
||||
|
||||
public void disconnect() {
|
||||
if (connected) {
|
||||
if (consumer != null) {
|
||||
try {
|
||||
consumer.close();
|
||||
} catch (JMSException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error closing consumer connection", e);
|
||||
}
|
||||
consumer = null;
|
||||
public synchronized void disconnect() {
|
||||
if (consumer != null) {
|
||||
try {
|
||||
consumer.close();
|
||||
} catch (JMSException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error closing consumer connection", e);
|
||||
}
|
||||
consumer = null;
|
||||
}
|
||||
|
||||
if (session != null) {
|
||||
try {
|
||||
session.close();
|
||||
} catch (JMSException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error closing session", e);
|
||||
}
|
||||
session = null;
|
||||
if (session != null) {
|
||||
try {
|
||||
session.close();
|
||||
} catch (JMSException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Error closing session", e);
|
||||
}
|
||||
connected = false;
|
||||
session = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void setupQueue(NotificationManagerJob manager)
|
||||
private synchronized void setupQueue(NotificationManagerJob manager)
|
||||
throws JMSException {
|
||||
disconnect();
|
||||
session = manager.connection.createSession(false,
|
||||
Session.AUTO_ACKNOWLEDGE);
|
||||
session = manager.createSession();
|
||||
if (session != null) {
|
||||
String queueName = id;
|
||||
Queue t = session.createQueue(queueName);
|
||||
|
@ -510,16 +537,14 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
consumer = session.createConsumer(t);
|
||||
}
|
||||
|
||||
setConsumer(consumer);
|
||||
consumer.setMessageListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void setupTopic(NotificationManagerJob manager)
|
||||
private synchronized void setupTopic(NotificationManagerJob manager)
|
||||
throws JMSException {
|
||||
disconnect();
|
||||
session = manager.connection.createSession(false,
|
||||
Session.AUTO_ACKNOWLEDGE);
|
||||
session = manager.createSession();
|
||||
if (session != null) {
|
||||
String topicName = id;
|
||||
Topic t = session.createTopic(topicName);
|
||||
|
@ -534,10 +559,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
}
|
||||
}
|
||||
|
||||
public void setConsumer(MessageConsumer consumer) {
|
||||
this.consumer = consumer;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
@ -545,48 +566,37 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
*/
|
||||
@Override
|
||||
public void onMessage(Message msg) {
|
||||
if (observers == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (INotificationObserver obs : observers) {
|
||||
sendToObserver(obs, msg);
|
||||
}
|
||||
|
||||
// Iterator<JobWrapper> iterator = jobWrappers.values().iterator();
|
||||
// while (iterator.hasNext()) {
|
||||
// JobWrapper wrapper = iterator.next();
|
||||
// if (!wrapper.isEmpty() && wrapper.getState() != Job.RUNNING) {
|
||||
// wrapper.schedule();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public synchronized void addObserver(INotificationObserver obs) {
|
||||
observers.add(obs);
|
||||
}
|
||||
|
||||
public synchronized void removeObserver(INotificationObserver obs) {
|
||||
observers.remove(obs);
|
||||
}
|
||||
|
||||
protected void sendToObserver(INotificationObserver observer,
|
||||
Message msg) {
|
||||
// Get the corresponding job, creating the
|
||||
// wrapper if necessary
|
||||
JobWrapper wrapper = null;
|
||||
synchronized (this) {
|
||||
wrapper = jobWrappers.get(observer);
|
||||
if (wrapper == null) {
|
||||
wrapper = new JobWrapper(observer);
|
||||
jobWrappers.put(observer, wrapper);
|
||||
synchronized (observers) {
|
||||
for (INotificationObserver obs : observers) {
|
||||
// Get the corresponding job, creating the
|
||||
// wrapper if necessary, really on observers lock for sync
|
||||
// purposes
|
||||
JobWrapper wrapper = jobWrappers.get(obs);
|
||||
if (wrapper == null) {
|
||||
wrapper = new JobWrapper(obs);
|
||||
jobWrappers.put(obs, wrapper);
|
||||
}
|
||||
wrapper.put(msg);
|
||||
}
|
||||
}
|
||||
wrapper.put(msg);
|
||||
}
|
||||
|
||||
public void addObserver(INotificationObserver obs) {
|
||||
synchronized (observers) {
|
||||
observers.add(obs);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeObserver(INotificationObserver obs) {
|
||||
synchronized (observers) {
|
||||
observers.remove(obs);
|
||||
}
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return observers.size();
|
||||
synchronized (observers) {
|
||||
return observers.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -669,7 +679,7 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
if (messageCount.incrementAndGet() > IN_MEM_MESSAGE_LIMIT) {
|
||||
messageCount.decrementAndGet();
|
||||
messages.remove();
|
||||
if (System.currentTimeMillis() - lastErrorPrintTime > 600000) {
|
||||
if ((System.currentTimeMillis() - lastErrorPrintTime) > 600000) {
|
||||
final Status s = new Status(
|
||||
Status.ERROR,
|
||||
Activator.PLUGIN_ID,
|
||||
|
@ -683,15 +693,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
this.schedule();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is empty.
|
||||
*
|
||||
* @return true, if is empty
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
return this.messages.isEmpty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -701,9 +702,12 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
|
|||
*/
|
||||
@Override
|
||||
public void dispose() {
|
||||
for (NotificationListener listener : listeners.values()) {
|
||||
listener.disconnect();
|
||||
synchronized (listeners) {
|
||||
for (NotificationListener listener : listeners.values()) {
|
||||
listener.disconnect();
|
||||
}
|
||||
listeners.clear();
|
||||
}
|
||||
listeners.clear();
|
||||
disconnect(true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -225,6 +225,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
|||
* 11/05/2012 15477 zhao Trim blank lines in text in Editor when check Syntax
|
||||
* 01/09/2013 15528 zhao Modified saveFile() and restoreFile()
|
||||
* 10/24/2013 16478 zhao add syntax check for extra '=' sign
|
||||
* 02/12/2014 17076 lvenable Mark guidance tabs as not current so they get refreshed
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -672,6 +673,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
|||
populateTafViewer();
|
||||
// Update the metar and mos guidance in the viewer tab.
|
||||
updateViewerTab(stationName);
|
||||
|
||||
// Mark the tabs as not current so they get updated.
|
||||
markTabsAsNotCurrent();
|
||||
|
||||
break;
|
||||
|
||||
case OPEN_RTN:
|
||||
|
@ -767,7 +772,19 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
/**
|
||||
* Mark the tabs as not current so they get refreshed.
|
||||
*/
|
||||
private void markTabsAsNotCurrent() {
|
||||
for (TabItem tbi : guidanceViewerFolder.getItems()) {
|
||||
if (tbi.getControl() instanceof ViewerTab) {
|
||||
((ViewerTab) tbi.getControl()).setDisplayCurrent(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearAll() {
|
||||
if (shell == null) {
|
||||
return;
|
||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Set;
|
|||
import java.util.TimeZone;
|
||||
|
||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.jface.resource.ImageRegistry;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.MenuAdapter;
|
||||
|
@ -97,6 +98,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
|||
* up warnings.
|
||||
* May 15, 2013 1842 dgilling Pass DataManager instance down to sub-
|
||||
* components.
|
||||
* Feb 12, 2014 2801 randerso Added prompting if formatter is run against non-normal database
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -106,6 +108,12 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
|||
|
||||
public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||
IProductTab {
|
||||
|
||||
// formatter data sources. Fcst must be first
|
||||
private static enum FormatterDataSource {
|
||||
Fcst, ISC, Official, Default,
|
||||
}
|
||||
|
||||
private final transient IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(FormatterLauncherDialog.class);
|
||||
|
||||
|
@ -161,24 +169,9 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
private Image failedImg;
|
||||
|
||||
/**
|
||||
* Fcst data source menu item.
|
||||
* data source menu items
|
||||
*/
|
||||
private MenuItem fcstMI = null;
|
||||
|
||||
/**
|
||||
* Official data source menu item.
|
||||
*/
|
||||
private MenuItem officialMI = null;
|
||||
|
||||
/**
|
||||
* ISC data source menu item.
|
||||
*/
|
||||
private MenuItem iscMI = null;
|
||||
|
||||
/**
|
||||
* Default data source menu item.
|
||||
*/
|
||||
private MenuItem defaultMI = null;
|
||||
private java.util.List<MenuItem> dataSourceMI;
|
||||
|
||||
/**
|
||||
* Products menu.
|
||||
|
@ -212,8 +205,6 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
|
||||
private DataManager dataMgr;
|
||||
|
||||
private String selectedDataSource = null;
|
||||
|
||||
private boolean doClose = false;
|
||||
|
||||
/**
|
||||
|
@ -338,59 +329,47 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
// Get the CAVE operating mode
|
||||
CAVEMode mode = dataMgr.getOpMode();
|
||||
|
||||
// Forecast menu item, set text based on operating mode
|
||||
fcstMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||
if (mode.equals(CAVEMode.OPERATIONAL)) {
|
||||
fcstMI.setText("Fcst");
|
||||
} else if (mode.equals(CAVEMode.PRACTICE)) {
|
||||
fcstMI.setText("Fcst_Prac");
|
||||
fcstMI.setSelection(true);
|
||||
} else {
|
||||
fcstMI.setText("Fcst_Test");
|
||||
fcstMI.setSelection(true);
|
||||
}
|
||||
fcstMI.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
selectedDataSource = dataMgr.getParmManager()
|
||||
.getMutableDatabase().toString();
|
||||
this.dataSourceMI = new ArrayList<MenuItem>();
|
||||
// create menu items
|
||||
for (FormatterDataSource source : FormatterDataSource.values()) {
|
||||
MenuItem item = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||
item.setData(source);
|
||||
this.dataSourceMI.add(item);
|
||||
String text = source.toString();
|
||||
if (source.equals(FormatterDataSource.Fcst)) {
|
||||
if (mode.equals(CAVEMode.PRACTICE)) {
|
||||
text += "_Prac";
|
||||
} else if (mode.equals(CAVEMode.TEST)) {
|
||||
text += "_Test";
|
||||
}
|
||||
}
|
||||
});
|
||||
item.setText(text);
|
||||
item.addSelectionListener(new SelectionAdapter() {
|
||||
|
||||
// Only show these menu items when in operational mode
|
||||
if (mode.equals(CAVEMode.OPERATIONAL)) {
|
||||
// ISC menu item
|
||||
iscMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||
iscMI.setText("ISC");
|
||||
iscMI.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
getIscDataSource();
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
MenuItem item = (MenuItem) e.getSource();
|
||||
if (item.getSelection()) {
|
||||
statusHandler.handle(
|
||||
Priority.EVENTB,
|
||||
"User selected formatter data source: "
|
||||
+ item.getText());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Official menu item
|
||||
officialMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||
officialMI.setText("Official");
|
||||
officialMI.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
selectedDataSource = getOfficialDataSource();
|
||||
}
|
||||
});
|
||||
if (!mode.equals(CAVEMode.OPERATIONAL)) {
|
||||
item.setSelection(true);
|
||||
statusHandler.handle(Priority.EVENTB,
|
||||
"Formatter default data source: " + item.getText());
|
||||
break;
|
||||
}
|
||||
|
||||
// Default menu item
|
||||
defaultMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||
defaultMI.setText("Default");
|
||||
defaultMI.setSelection(true);
|
||||
defaultMI.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
selectedDataSource = dataMgr.getParmManager().getMutableDatabase()
|
||||
.toString();
|
||||
if (source.equals(FormatterDataSource.Default)) {
|
||||
item.setSelection(true);
|
||||
statusHandler.handle(Priority.EVENTB,
|
||||
"Formatter default data source: " + item.getText());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -731,32 +710,108 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
* The name of the product
|
||||
* @return The data source
|
||||
*/
|
||||
public String getSelectedDataSource(String productName) {
|
||||
if (fcstMI.getSelection()) {
|
||||
selectedDataSource = getFcstDataSource();
|
||||
} else if (iscMI.getSelection()) {
|
||||
selectedDataSource = getIscDataSource();
|
||||
} else if (officialMI.getSelection()) {
|
||||
selectedDataSource = getOfficialDataSource();
|
||||
} else {
|
||||
// Default value
|
||||
ProductDefinition prodDef = textProductMgr
|
||||
.getProductDefinition(productName);
|
||||
String dataSource = (String) prodDef.get("database");
|
||||
if (dataSource == null) {
|
||||
dataSource = "Official";
|
||||
}
|
||||
|
||||
if (dataSource.equals("ISC")) {
|
||||
selectedDataSource = getIscDataSource();
|
||||
} else if (dataSource.equals("Official")) {
|
||||
selectedDataSource = getOfficialDataSource();
|
||||
} else {
|
||||
selectedDataSource = getFcstDataSource();
|
||||
public DatabaseID getSelectedDataSource(String productName) {
|
||||
FormatterDataSource menuDataSource = FormatterDataSource.Default;
|
||||
for (MenuItem item : dataSourceMI) {
|
||||
if (item.getSelection()) {
|
||||
menuDataSource = (FormatterDataSource) item.getData();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return selectedDataSource;
|
||||
// Default value
|
||||
ProductDefinition prodDef = textProductMgr
|
||||
.getProductDefinition(productName);
|
||||
String dbString = (String) prodDef.get("database");
|
||||
FormatterDataSource productDataSource;
|
||||
if (dbString == null) {
|
||||
productDataSource = FormatterDataSource.Default;
|
||||
} else {
|
||||
try {
|
||||
productDataSource = FormatterDataSource.valueOf(dbString);
|
||||
} catch (IllegalArgumentException e) {
|
||||
StringBuilder msg = new StringBuilder();
|
||||
msg.append("The ");
|
||||
msg.append(productName);
|
||||
msg.append(" product definition contains an invalid database selection: \"");
|
||||
msg.append(dbString);
|
||||
msg.append("\". Valid values are: [");
|
||||
for (FormatterDataSource src : FormatterDataSource.values()) {
|
||||
if (!src.equals(FormatterDataSource.Default)) {
|
||||
msg.append(src).append(", ");
|
||||
}
|
||||
}
|
||||
msg.delete(msg.length() - 2, msg.length());
|
||||
msg.append("]");
|
||||
statusHandler.error(msg.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
FormatterDataSource dataSource;
|
||||
if (menuDataSource.equals(FormatterDataSource.Default)) {
|
||||
if (productDataSource.equals(FormatterDataSource.Default)) {
|
||||
dataSource = FormatterDataSource.Official;
|
||||
} else {
|
||||
dataSource = productDataSource;
|
||||
}
|
||||
} else {
|
||||
dataSource = menuDataSource;
|
||||
}
|
||||
|
||||
if (!productDataSource.equals(FormatterDataSource.Default)) {
|
||||
if (!dataSource.equals(productDataSource)) {
|
||||
// A check should be made that a hazard formatter is actually
|
||||
// being run on the database specified in the Local or
|
||||
// Definition file (Definition["database"] entry). If the
|
||||
// database being run is different, provide a warning to the
|
||||
// forecaster that requires acknowledgment before running.
|
||||
MessageDialog dlg = new MessageDialog(getShell(),
|
||||
"Confirm Data Source", null,
|
||||
"The product definition indicates the " + productName
|
||||
+ " formatter should be run against the "
|
||||
+ productDataSource
|
||||
+ " database, but you have selected the "
|
||||
+ dataSource
|
||||
+ " database.\n\nDo you wish to continue?",
|
||||
MessageDialog.WARNING, new String[] { "Yes", "No" }, 1);
|
||||
int retVal = dlg.open();
|
||||
if (retVal != 0) {
|
||||
dataSource = null;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (dataSource.equals(FormatterDataSource.ISC)) {
|
||||
// If the database is not explicitly defined (default), provide
|
||||
// a a warning to the forecaster that requires acknowledgment
|
||||
// before running if the database being used is ISC
|
||||
MessageDialog dlg = new MessageDialog(
|
||||
getShell(),
|
||||
"Confirm Data Source",
|
||||
null,
|
||||
"You are about to run the "
|
||||
+ productName
|
||||
+ " formatter against the ISC database.\n\nDo you wish to continue?",
|
||||
MessageDialog.WARNING, new String[] { "Yes", "No" }, 1);
|
||||
int retVal = dlg.open();
|
||||
if (retVal != 0) {
|
||||
dataSource = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DatabaseID selectedDbId;
|
||||
if (dataSource == null) {
|
||||
selectedDbId = null;
|
||||
} else if (dataSource.equals(FormatterDataSource.ISC)) {
|
||||
selectedDbId = getIscDataSource();
|
||||
} else if (dataSource.equals(FormatterDataSource.Official)) {
|
||||
selectedDbId = getOfficialDataSource();
|
||||
} else {
|
||||
selectedDbId = getFcstDataSource();
|
||||
}
|
||||
|
||||
return selectedDbId;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1009,8 +1064,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
*
|
||||
* @return The FcstDataSource
|
||||
*/
|
||||
private String getFcstDataSource() {
|
||||
return dataMgr.getParmManager().getMutableDatabase().toString();
|
||||
private DatabaseID getFcstDataSource() {
|
||||
return dataMgr.getParmManager().getMutableDatabase();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1021,13 +1076,13 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
*
|
||||
* @return The ISC Data Source
|
||||
*/
|
||||
private String getIscDataSource() {
|
||||
private DatabaseID getIscDataSource() {
|
||||
java.util.List<DatabaseID> dbs = dataMgr.getParmManager()
|
||||
.getIscDatabases();
|
||||
|
||||
if (dbs.size() > 0) {
|
||||
// Always return the last one in the list
|
||||
return dbs.get(dbs.size() - 1).toString();
|
||||
return dbs.get(dbs.size() - 1);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -1038,12 +1093,12 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
|||
*
|
||||
* @return The Official Data source
|
||||
*/
|
||||
private String getOfficialDataSource() {
|
||||
String source = null;
|
||||
private DatabaseID getOfficialDataSource() {
|
||||
DatabaseID source = null;
|
||||
try {
|
||||
ServerResponse<java.util.List<DatabaseID>> sr = dataMgr.getClient()
|
||||
.getOfficialDBName();
|
||||
source = sr.getPayload().get(0).toString();
|
||||
source = sr.getPayload().get(0);
|
||||
} catch (GFEServerException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Unable to determine official db", e);
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.eclipse.swt.widgets.Label;
|
|||
import org.eclipse.swt.widgets.ProgressBar;
|
||||
import org.eclipse.swt.widgets.TabFolder;
|
||||
|
||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||
import com.raytheon.viz.gfe.Activator;
|
||||
import com.raytheon.viz.gfe.core.DataManager;
|
||||
import com.raytheon.viz.gfe.dialogs.FormatterLauncherDialog;
|
||||
|
@ -64,6 +65,8 @@ import com.raytheon.viz.gfe.textformatter.TextProductManager;
|
|||
* 05 SEP 2013 2329 randerso Added call to ZoneCombinerComp.applyZoneCombo when
|
||||
* when run formatter button is clicked.
|
||||
* 05 FEB 2014 2591 randerso Added dataManager to ZoneCombinerComp constructor
|
||||
* Passed dataMgr instance to FormatterUtil.runFormatterScript
|
||||
* 12 FEB 2014 2801 randerso Added prompting if formatter is run against non-normal database
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -365,36 +368,37 @@ public class ProductAreaComp extends Composite implements
|
|||
productEditorBtnSelected();
|
||||
|
||||
if (okToLoseText()) {
|
||||
productEditorComp.clearProductText();
|
||||
abortFormatterBtn.setEnabled(true);
|
||||
// closeTabBtn.setEnabled(false);
|
||||
runFormatterBtn.setEnabled(false);
|
||||
String vtecMode = "";
|
||||
if (formattingCbo.isVisible()) {
|
||||
vtecMode = formattingCbo.getText();
|
||||
} else {
|
||||
int hazIndex = productName.indexOf("Hazard_");
|
||||
if (hazIndex > -1) {
|
||||
String category = productName.substring(
|
||||
hazIndex + 7, hazIndex + 10);
|
||||
vtecMode = textProductMgr
|
||||
.getVtecMessageType(category);
|
||||
if (vtecMode == null) {
|
||||
vtecMode = "";
|
||||
DatabaseID dbId = ((FormatterLauncherDialog) productTabCB)
|
||||
.getSelectedDataSource(productName);
|
||||
|
||||
if (dbId != null) {
|
||||
productEditorComp.clearProductText();
|
||||
abortFormatterBtn.setEnabled(true);
|
||||
// closeTabBtn.setEnabled(false);
|
||||
runFormatterBtn.setEnabled(false);
|
||||
String vtecMode = "";
|
||||
if (formattingCbo.isVisible()) {
|
||||
vtecMode = formattingCbo.getText();
|
||||
} else {
|
||||
int hazIndex = productName.indexOf("Hazard_");
|
||||
if (hazIndex > -1) {
|
||||
String category = productName.substring(
|
||||
hazIndex + 7, hazIndex + 10);
|
||||
vtecMode = textProductMgr
|
||||
.getVtecMessageType(category);
|
||||
if (vtecMode == null) {
|
||||
vtecMode = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check the data source menus, if one is selected then
|
||||
// use
|
||||
// it, else use the default
|
||||
String dbId = null;
|
||||
zoneCombiner.applyZoneCombo();
|
||||
dbId = ((FormatterLauncherDialog) productTabCB)
|
||||
.getSelectedDataSource(productName);
|
||||
FormatterUtil.runFormatterScript(textProductMgr,
|
||||
productName, dbId, vtecMode,
|
||||
ProductAreaComp.this);
|
||||
// Get the source database
|
||||
zoneCombiner.applyZoneCombo();
|
||||
FormatterUtil.runFormatterScript(dataMgr,
|
||||
textProductMgr, productName,
|
||||
dbId.toString(), vtecMode,
|
||||
ProductAreaComp.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -22,6 +22,7 @@ package com.raytheon.viz.gfe.textformatter;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -219,12 +220,18 @@ public class CombinationsFileUtil {
|
|||
// retrieve combinations file if it's changed
|
||||
LocalizationFile lf = pm.getStaticLocalizationFile(FileUtil.join(
|
||||
COMBO_DIR_PATH, comboName + ".py"));
|
||||
File pyFile;
|
||||
try {
|
||||
pyFile = lf.getFile(true);
|
||||
} catch (LocalizationException e) {
|
||||
throw new GfeException("Error retrieving combinations file: "
|
||||
+ comboName, e);
|
||||
File pyFile = null;
|
||||
if (lf != null) {
|
||||
try {
|
||||
pyFile = lf.getFile(true);
|
||||
} catch (LocalizationException e) {
|
||||
throw new GfeException("Error retrieving combinations file: "
|
||||
+ comboName, e);
|
||||
}
|
||||
}
|
||||
|
||||
if (pyFile == null || !pyFile.exists()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
LocalizationContext baseContext = pm.getContext(
|
||||
|
|
|
@ -24,7 +24,6 @@ import java.util.TimeZone;
|
|||
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||
import com.raytheon.uf.common.time.SimulatedTime;
|
||||
import com.raytheon.uf.common.time.TimeRange;
|
||||
import com.raytheon.viz.core.mode.CAVEMode;
|
||||
|
@ -42,6 +41,8 @@ import com.raytheon.viz.gfe.tasks.TaskManager;
|
|||
* Sep 8, 2008 njensen Initial creation
|
||||
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
||||
* Sep 05, 2013 2329 randerso Removed save of combinations file
|
||||
* Feb 12, 2014 2591 randerso Passed dataMgr instance to FormatterUtil.runFormatterScript
|
||||
* Removed call to TextProductManager.reloadModule
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -59,6 +60,9 @@ public class FormatterUtil {
|
|||
/**
|
||||
* Runs a text formatter script for a given product
|
||||
*
|
||||
* @param dataMgr
|
||||
* the DataManager instance to use
|
||||
*
|
||||
* @param productMgr
|
||||
* the formatter instance to use
|
||||
* @param productName
|
||||
|
@ -70,22 +74,12 @@ public class FormatterUtil {
|
|||
* @param finish
|
||||
* listener to fire when formatter finishes generating product
|
||||
*/
|
||||
public static void runFormatterScript(TextProductManager productMgr,
|
||||
String productName, String dbId, String vtecMode,
|
||||
TextProductFinishListener finish) {
|
||||
try {
|
||||
String filename = productMgr.getCombinationsFileName(productName);
|
||||
boolean mapRequired = productMgr.mapRequired(productName);
|
||||
if (filename != null && mapRequired) {
|
||||
productMgr.reloadModule(filename);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Cannot generate combinations file", e);
|
||||
}
|
||||
public static void runFormatterScript(DataManager dataMgr,
|
||||
TextProductManager productMgr, String productName, String dbId,
|
||||
String vtecMode, TextProductFinishListener finish) {
|
||||
|
||||
int testMode = 0;
|
||||
if (DataManager.getCurrentInstance().getOpMode().equals(CAVEMode.TEST)) {
|
||||
if (dataMgr.getOpMode().equals(CAVEMode.TEST)) {
|
||||
testMode = 1;
|
||||
}
|
||||
|
||||
|
@ -106,8 +100,7 @@ public class FormatterUtil {
|
|||
}
|
||||
|
||||
String name = productMgr.getModuleName(productName);
|
||||
String varDict = productMgr.getVarDict(productName,
|
||||
DataManager.getCurrentInstance(), dbId);
|
||||
String varDict = productMgr.getVarDict(productName, dataMgr, dbId);
|
||||
|
||||
if (varDict != null) {
|
||||
// run the formatter with the normal active table
|
||||
|
|
|
@ -55,9 +55,10 @@ import com.raytheon.viz.gfe.core.DataManager;
|
|||
* SOFTWARE HISTORY
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* May 1, 2009 njensen Initial creation
|
||||
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
||||
* Apr 24, 2013 1936 dgilling Remove unused imports.
|
||||
* May 1, 2009 njensen Initial creation
|
||||
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
||||
* Apr 24, 2013 1936 dgilling Remove unused imports.
|
||||
* Feb 12, 2014 2591 randerso Removed reloadModule method
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -269,17 +270,6 @@ public class TextProductManager {
|
|||
return mapName;
|
||||
}
|
||||
|
||||
protected void reloadModule(String moduleName) {
|
||||
Map<String, Object> args = new HashMap<String, Object>(1);
|
||||
args.put("moduleName", moduleName);
|
||||
try {
|
||||
script.execute("reloadModule", args);
|
||||
} catch (JepException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
"Exception reloading module " + moduleName, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void setIssuedBy(String issuedBy) {
|
||||
if (LocalizationManager.getInstance().getCurrentSite().equals(issuedBy)) {
|
||||
this.issuedBy = "";
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
|
||||
<!-- general application log -->
|
||||
<appender name="console" class="org.apache.log4j.ConsoleAppender">
|
||||
<param name="Threshold" value="INFO" />
|
||||
<param name="Threshold" value="INFO" />
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%-5p %d [%t] %c{1}: %m%n"/>
|
||||
</layout>
|
||||
|
@ -169,7 +169,7 @@
|
|||
</appender>
|
||||
|
||||
<appender name="ThreadBasedLog" class="com.raytheon.uf.edex.log.ThreadBasedAppender">
|
||||
<param name="ThreadPatterns" value="RadarLog:radarThreadPool.*;SatelliteLog:satelliteThreadPool.*;ShefLog:shefThreadPool.*;TextLog:textThreadPool.*;SmartInitLog:smartInit.*;PurgeLog:Purge.*;ArchiveLog:Archive.*"/>
|
||||
<param name="ThreadPatterns" value="RadarLog:Ingest.Radar.*;SatelliteLog:Ingest.Satellite.*;ShefLog:Ingest.Shef.*;TextLog:Ingest.Text.*;SmartInitLog:smartInit.*;PurgeLog:Purge.*;ArchiveLog:Archive.*"/>
|
||||
<param name="DefaultAppender" value="asyncConsole"/>
|
||||
<appender-ref ref="asyncConsole"/>
|
||||
<appender-ref ref="RadarLog"/>
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
</appender>
|
||||
|
||||
<appender name="ThreadBasedLog" class="com.raytheon.uf.edex.log.ThreadBasedAppender">
|
||||
<param name="ThreadPatterns" value="HarvesterLog:harvesterThreadPool.*,crawlerThreadPool.*,Crawler.*"/>
|
||||
<param name="ThreadPatterns" value="HarvesterLog:harvester.*,crawlerThreadPool.*,Crawler.*"/>
|
||||
<param name="DefaultAppender" value="console"/>
|
||||
<appender-ref ref="console"/>
|
||||
<appender-ref ref="HarvesterLog"/>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
|
||||
<!-- general application log -->
|
||||
<appender name="console" class="org.apache.log4j.ConsoleAppender">
|
||||
<param name="Threshold" value="INFO" />
|
||||
<param name="Threshold" value="INFO" />
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%-5p %d [%t] %c{1}: %m%n"/>
|
||||
</layout>
|
||||
|
|
|
@ -120,10 +120,11 @@
|
|||
<include>shef-ingest.xml</include>
|
||||
<include>persist-ingest.xml</include>
|
||||
<include>obs-common.xml</include>
|
||||
<include>obs-ingest.xml</include>
|
||||
<include>metartohmdb-plugin.xml</include>
|
||||
<include>pointdata-common.xml</include>
|
||||
<include>obs-ingest.xml</include>
|
||||
<include>metartohmdb-plugin.xml</include>
|
||||
<include>pointdata-common.xml</include>
|
||||
<include>shef-common.xml</include>
|
||||
<include>ohd-common-database.xml</include>
|
||||
<include>ohd-common.xml</include>
|
||||
<include>alarmWhfs-spring.xml</include>
|
||||
<include>arealffgGenerator-spring.xml</include>
|
||||
|
@ -148,6 +149,7 @@
|
|||
<exclude>fssobs-common.xml</exclude>
|
||||
</mode>
|
||||
<mode name="requestHydro">
|
||||
<include>ohd-common-database.xml</include>
|
||||
<include>ohd-common.xml</include>
|
||||
<include>database-common.xml</include>
|
||||
<include>ohd-request.xml</include>
|
||||
|
@ -232,6 +234,7 @@
|
|||
<include>shef-common.xml</include>
|
||||
<include>satellite-common.xml</include>
|
||||
<include>satellite-dataplugin-common.xml</include>
|
||||
<include>ohd-common-database.xml</include>
|
||||
<include>ohd-common.xml</include>
|
||||
<include>management-common.xml</include>
|
||||
<include>auth-common.xml</include>
|
||||
|
|
|
@ -14,33 +14,30 @@
|
|||
<!-- specify the connection to the broker (qpid) -->
|
||||
<!-- MaxPrefetch set at 0, due to DataPool routers getting messages backed up behind long running tasks -->
|
||||
<bean id="amqConnectionFactory" class="org.apache.qpid.client.AMQConnectionFactory">
|
||||
<constructor-arg type="java.lang.String" value="amqp://guest:guest@/${JMS_VIRTUALHOST}?brokerlist='tcp://${BROKER_ADDR}?retries='9999'&connecttimeout='5000'&connectdelay='5000''&maxprefetch='0'&sync_publish='all'&sync_ack='true'"/>
|
||||
<constructor-arg type="java.lang.String" value="amqp://guest:guest@/${JMS_VIRTUALHOST}?brokerlist='tcp://${BROKER_ADDR}?retries='9999'&heartbeat='0'&connecttimeout='5000'&connectdelay='5000''&maxprefetch='0'&sync_publish='all'&sync_ack='true'"/>
|
||||
</bean>
|
||||
|
||||
<bean id="jmsPooledConnectionFactory" class="com.raytheon.uf.common.jms.JmsPooledConnectionFactory">
|
||||
<constructor-arg ref="amqConnectionFactory"/>
|
||||
<property name="provider" value="QPID"/>
|
||||
<property name="reconnectInterval" value="5000"/>
|
||||
<!-- After connection has been closed by thread keep it allocated for another 90 seconds in case thread needs it again -->
|
||||
<property name="connectionHoldTime" value="90000"/>
|
||||
<!-- Any resource that has been available in the pool for more than 1 minute will be closed -->
|
||||
<property name="resourceRetention" value="60000"/>
|
||||
<property name="maxSpareConnections" value="10"/>
|
||||
<!-- After resource has been closed by thread keep it allocated for another 2 minutes in case thread needs it again -->
|
||||
<property name="resourceRetention" value="120000"/>
|
||||
</bean>
|
||||
|
||||
<bean id="genericThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="${JMS_POOL_MIN}" />
|
||||
<property name="maxPoolSize" value="${JMS_POOL_MAX}" />
|
||||
<property name="corePoolSize" value="0" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
<property name="queueCapacity" value="0" />
|
||||
</bean>
|
||||
|
||||
<bean id="jms-generic" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<bean id="jms-generic" class="com.raytheon.uf.edex.esb.camel.jms.DedicatedThreadJmsComponent">
|
||||
<constructor-arg ref="jmsGenericConfig" />
|
||||
<property name="taskExecutor" ref="genericThreadPool" />
|
||||
</bean>
|
||||
|
||||
<bean id="jms-durable" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<bean id="jms-durable" class="com.raytheon.uf.edex.esb.camel.jms.DedicatedThreadJmsComponent">
|
||||
<constructor-arg ref="jmsDurableConfig" />
|
||||
<property name="taskExecutor" ref="genericThreadPool" />
|
||||
</bean>
|
||||
|
@ -66,13 +63,13 @@
|
|||
|
||||
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
||||
<property name="cacheLevelName" value="CACHE_NONE"/>
|
||||
<property name="recoveryInterval" value="1000"/>
|
||||
<property name="recoveryInterval" value="10000"/>
|
||||
<property name="requestTimeout" value="5000"/>
|
||||
|
||||
<!-- receiveTimeout is amount of time thread waits to receive a message before recycling -->
|
||||
<!-- receiveTimeout also affects how fast a JMSConsumer will shut down, because the
|
||||
thread may be stuck polling for the duration of receiveTimeout before shutting down -->
|
||||
<property name="receiveTimeout" value="10000"/>
|
||||
<property name="receiveTimeout" value="10000"/>
|
||||
<property name="transacted" value="false"/>
|
||||
|
||||
<!-- force maxMessagesPerTask so that the threads don't keep disconnecting and reconnecting.
|
||||
|
@ -83,6 +80,7 @@
|
|||
<property name="destinationResolver" ref="qpidNoDurableResolver" />
|
||||
<property name="disableReplyTo" value="true" />
|
||||
<property name="deliveryPersistent" value="false"/>
|
||||
|
||||
<!--
|
||||
<property name="transacted" value="true" />
|
||||
<property name="acknowledgementModeName" value="TRANSACTED"/>
|
||||
|
@ -253,7 +251,7 @@
|
|||
**
|
||||
** http://camel.apache.org/enterprise-integration-patterns.html
|
||||
-->
|
||||
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
|
||||
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
|
||||
|
||||
<!-- Route for edex to listen for utility updates -->
|
||||
<route id="edexUtilityNotify">
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<bean id="airepDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="airep" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.airep"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.airep"/>
|
||||
</bean>
|
||||
|
||||
<bean id="airepCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="binlightningDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="binlightning" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.binlightning" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.binlightning" />
|
||||
</bean>
|
||||
|
||||
<bean id="binlightningCamelRegistered" factory-bean="clusteredCamelContextMgr"
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<bean id="bufrmosDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="bufrmos" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrmos" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrmos" />
|
||||
</bean>
|
||||
|
||||
<bean id="bufrmosCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<bean id="bufruaDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufruaPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrua" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrua" />
|
||||
</bean>
|
||||
|
||||
<bean id="bufruaCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="ccfpDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ccfp" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ccfp" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ccfp" />
|
||||
</bean>
|
||||
|
||||
<bean id="ccfpCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
</route>
|
||||
|
||||
<route id="notifyGridParmManager">
|
||||
<from uri="jms-generic:topic:edex.alerts.gfe" />
|
||||
<from uri="jms-generic:topic:edex.alerts.gfe?threadName=gfeGridParmMgr-edex.alerts.gfe" />
|
||||
<doTry>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
<bean ref="gridParmManager" method="processNotification" />
|
||||
|
|
|
@ -460,17 +460,11 @@
|
|||
|
||||
<bean id="iscSendQueue" class="com.raytheon.edex.plugin.gfe.isc.IscSendQueue"
|
||||
factory-method="getInstance" />
|
||||
<bean id="jms-iscsend" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsIscSendConfig" />
|
||||
<property name="taskExecutor" ref="iscSendThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsIscSendConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="iscSendThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="2" />
|
||||
<property name="maxPoolSize" value="2" />
|
||||
</bean>
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
<bean id="iscSendSrvCfg" class="com.raytheon.edex.plugin.gfe.isc.SendIscSrvConfig">
|
||||
<property name="executor" ref="iscSendThreadPool"/>
|
||||
<!-- Threads should be 1 less than the size of the pool to account for the
|
||||
|
@ -486,17 +480,6 @@
|
|||
|
||||
<!-- ISC Receive Beans -->
|
||||
|
||||
<bean id="jms-iscrec" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsIscRecConfig" />
|
||||
<property name="taskExecutor" ref="iscReceiveThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsIscRecConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="iscReceiveThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="2" />
|
||||
<property name="maxPoolSize" value="2" />
|
||||
</bean>
|
||||
<bean id="IscReceiveSrv" class="com.raytheon.edex.plugin.gfe.isc.IscReceiveSrv">
|
||||
<constructor-arg ref="iscDataRecPythonThreadPool" />
|
||||
</bean>
|
||||
|
@ -584,7 +567,7 @@
|
|||
</route>
|
||||
|
||||
<route id="gfeSiteActivationNotification">
|
||||
<from uri="jms-generic:topic:edex.alerts.siteActivate" />
|
||||
<from uri="jms-generic:topic:edex.alerts.siteActivate?threadName=gfe-edex.alerts.siteActivate" />
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
<bean ref="sbLockMgr" method="handleSiteActivationNotification" />
|
||||
</route>
|
||||
|
@ -623,7 +606,7 @@
|
|||
|
||||
<!-- ISC Data Receive route -->
|
||||
<route id="iscReceiveRoute">
|
||||
<from uri="jms-iscrec:queue:gfeIscDataReceive?concurrentConsumers=2"/>
|
||||
<from uri="jms-durable:queue:gfeIscDataReceive?concurrentConsumers=2"/>
|
||||
<doTry>
|
||||
<pipeline>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
|
@ -643,7 +626,7 @@
|
|||
errorHandlerRef="errorHandler" autoStartup="false">
|
||||
|
||||
<route id="iscSendJobQueueAggr">
|
||||
<from uri="jms-iscsend:queue:iscSendNotification" />
|
||||
<from uri="jms-durable:queue:iscSendNotification" />
|
||||
<doTry>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
<bean ref="iscSendQueue" method="addSendJobs" />
|
||||
|
|
|
@ -4,16 +4,10 @@
|
|||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="smartInitQueue" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue"/>
|
||||
<bean id="jms-smartinit" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsSmartInitConfig" />
|
||||
<property name="taskExecutor" ref="smartInitThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsSmartInitConfig" class="org.apache.camel.component.jms.JmsConfiguration" factory-bean="jmsDurableConfig"
|
||||
factory-method="copy"/>
|
||||
<bean id="smartInitThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="${smartinit.threadpoolsize}" />
|
||||
<property name="maxPoolSize" value="${smartinit.threadpoolsize}" />
|
||||
<property name="corePoolSize" value="${smartinit.threads}" />
|
||||
<property name="maxPoolSize" value="${smartinit.threads}" />
|
||||
</bean>
|
||||
<bean id="smartInitSrvCfg" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitSrvConfig">
|
||||
<property name="executor" ref="smartInitThreadPool"/>
|
||||
|
@ -93,7 +87,7 @@
|
|||
<!-- Smart Init Routes -->
|
||||
<!-- main route now handled through the gfeIngestNotification -->
|
||||
<route id="manualSmartInit">
|
||||
<from uri="jms-smartinit:queue:manualSmartInit" />
|
||||
<from uri="jms-durable:queue:manualSmartInit?threadName=smartInitManual" />
|
||||
<doTry>
|
||||
<bean ref="smartInitQueue" method="addManualInit" />
|
||||
<doCatch>
|
||||
|
@ -104,7 +98,7 @@
|
|||
</route>
|
||||
|
||||
<route id="gfeVtecChangeNotification">
|
||||
<from uri="jms-generic:topic:edex.alerts.vtec"/>
|
||||
<from uri="jms-generic:topic:edex.alerts.vtec?threadName=gfe-edex.alerts.vtec"/>
|
||||
<doTry>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
<bean ref="vtecChangeListener" method="handleNotification" />
|
||||
|
@ -117,7 +111,7 @@
|
|||
|
||||
<!-- Convert the topic into a queue so only one consumer gets each message and we still have competing consumers. -->
|
||||
<route id="gfeDataURINotificationQueueRoute">
|
||||
<from uri="jms-generic:topic:edex.alerts" />
|
||||
<from uri="jms-generic:topic:edex.alerts?threadName=gfe-edex.alerts" />
|
||||
<doTry>
|
||||
<to uri="jms-durable:queue:gfeDataURINotification"/>
|
||||
<doCatch>
|
||||
|
|
|
@ -59,9 +59,10 @@ import com.raytheon.uf.edex.database.dao.DaoConfig;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Oct 20, 2011 dgilling Initial creation
|
||||
* May 08, 2012 #600 dgilling Re-work logic for handling PENDING
|
||||
* records.
|
||||
* Oct 20, 2011 dgilling Initial creation
|
||||
* May 08, 2012 600 dgilling Re-work logic for handling PENDING
|
||||
* records.
|
||||
* Feb 07, 2014 2357 rjpeter iscSendNotification uri.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -74,9 +75,9 @@ public class IscSendQueue {
|
|||
// how we'll organize the temporary queue
|
||||
private class JobSetQueueKey {
|
||||
|
||||
private ParmID pid;
|
||||
private final ParmID pid;
|
||||
|
||||
private IscSendState state;
|
||||
private final IscSendState state;
|
||||
|
||||
public JobSetQueueKey(ParmID pid, IscSendState state) {
|
||||
this.pid = pid;
|
||||
|
@ -92,8 +93,9 @@ public class IscSendQueue {
|
|||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((pid == null) ? 0 : pid.hashCode());
|
||||
result = prime * result + ((state == null) ? 0 : state.hashCode());
|
||||
result = (prime * result) + ((pid == null) ? 0 : pid.hashCode());
|
||||
result = (prime * result)
|
||||
+ ((state == null) ? 0 : state.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -148,7 +150,7 @@ public class IscSendQueue {
|
|||
|
||||
private int timeoutMillis = 60000;
|
||||
|
||||
private Map<JobSetQueueKey, List<IscSendRecord>> jobSet = new HashMap<JobSetQueueKey, List<IscSendRecord>>();
|
||||
private final Map<JobSetQueueKey, List<IscSendRecord>> jobSet = new HashMap<JobSetQueueKey, List<IscSendRecord>>();
|
||||
|
||||
private static final IscSendQueue instance = new IscSendQueue();
|
||||
|
||||
|
@ -168,7 +170,7 @@ public class IscSendQueue {
|
|||
try {
|
||||
byte[] messages = SerializationUtil.transformToThrift(sendJobs);
|
||||
EDEXUtil.getMessageProducer().sendAsyncUri(
|
||||
"jms-iscsend:queue:iscSendNotification", messages);
|
||||
"jms-durable:queue:iscSendNotification", messages);
|
||||
} catch (SerializationException e) {
|
||||
handler.error("Unable to serialize IscSendRecords.", e);
|
||||
} catch (EdexException e) {
|
||||
|
@ -238,7 +240,7 @@ public class IscSendQueue {
|
|||
|
||||
// Now combine time ranges if we can
|
||||
int i = 0;
|
||||
while (i <= pending.size() - 2) {
|
||||
while (i <= (pending.size() - 2)) {
|
||||
TimeRange time = pending.get(i).getTimeRange();
|
||||
TimeRange time1 = pending.get(i + 1).getTimeRange();
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<bean id="goessoundingDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="goessoundingPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.goessounding"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.goessounding"/>
|
||||
</bean>
|
||||
|
||||
<bean id="goessoundingCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -5,18 +5,6 @@
|
|||
|
||||
<bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" />
|
||||
|
||||
<bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsGribConfig" />
|
||||
<property name="taskExecutor" ref="gribThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsGribConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="gribThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="${grib-decode.count.threads}" />
|
||||
<property name="maxPoolSize" value="${grib-decode.count.threads}" />
|
||||
</bean>
|
||||
|
||||
<bean id="largeFileChecker" class="com.raytheon.edex.plugin.grib.GribLargeFileChecker" />
|
||||
|
||||
<bean id="gribSplitter" class="com.raytheon.edex.plugin.grib.GribSplitter">
|
||||
|
@ -58,7 +46,7 @@
|
|||
autoStartup="false">
|
||||
|
||||
<endpoint id="gribFileEndpoint" uri="file:${edex.home}/data/sbn/grib?noop=true&idempotent=false" />
|
||||
<endpoint id="gribJmsEndpoint" uri="ingest-grib:queue:Ingest.Grib?concurrentConsumers=${grib-decode.count.threads}"/>
|
||||
<endpoint id="gribJmsEndpoint" uri="jms-durable:queue:Ingest.Grib?concurrentConsumers=${grib-decode.count.threads}"/>
|
||||
|
||||
<route id="gribFileConsumerRoute">
|
||||
<from ref="gribFileEndpoint" />
|
||||
|
@ -67,7 +55,7 @@
|
|||
<setHeader headerName="pluginName">
|
||||
<constant>grid</constant>
|
||||
</setHeader>
|
||||
<to uri="ingest-grib:queue:Ingest.Grib" />
|
||||
<to uri="jms-durable:queue:Ingest.Grib" />
|
||||
</route>
|
||||
|
||||
<!-- Begin Grib Decode Route -->
|
||||
|
@ -108,7 +96,7 @@
|
|||
</doTry>
|
||||
</when>
|
||||
<otherwise>
|
||||
<to uri="ingest-grib:queue:Ingest.Grib" />
|
||||
<to uri="jms-durable:queue:Ingest.Grib" />
|
||||
</otherwise>
|
||||
</choice>
|
||||
</split>
|
||||
|
|
|
@ -5,18 +5,6 @@
|
|||
|
||||
<bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" />
|
||||
|
||||
<bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsGribConfig" />
|
||||
<property name="taskExecutor" ref="gribThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsGribConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="gribThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="${grib-decode.count.threads}" />
|
||||
<property name="maxPoolSize" value="${grib-decode.count.threads}" />
|
||||
</bean>
|
||||
|
||||
<bean id="largeFileChecker" class="com.raytheon.edex.plugin.grib.GribLargeFileChecker" />
|
||||
|
||||
<bean id="gribSplitter" class="com.raytheon.edex.plugin.grib.GribSplitter">
|
||||
|
@ -54,7 +42,7 @@
|
|||
autoStartup="false">
|
||||
|
||||
<endpoint id="gribFileEndpoint" uri="file:${edex.home}/data/sbn/grib?noop=true&idempotent=false" />
|
||||
<endpoint id="gribJmsEndpoint" uri="ingest-grib:queue:Ingest.Grib?concurrentConsumers=${grib-decode.count.threads}"/>
|
||||
<endpoint id="gribJmsEndpoint" uri="jms-durable:queue:Ingest.Grib?concurrentConsumers=${grib-decode.count.threads}"/>
|
||||
|
||||
<route id="gribFileConsumerRoute">
|
||||
<from ref="gribFileEndpoint" />
|
||||
|
@ -63,7 +51,7 @@
|
|||
<setHeader headerName="pluginName">
|
||||
<constant>grid</constant>
|
||||
</setHeader>
|
||||
<to uri="ingest-grib:queue:Ingest.Grib" />
|
||||
<to uri="jms-durable:queue:Ingest.Grib" />
|
||||
</route>
|
||||
|
||||
<!-- Begin Grib Decode Route -->
|
||||
|
@ -99,7 +87,7 @@
|
|||
</doTry>
|
||||
</when>
|
||||
<otherwise>
|
||||
<to uri="ingest-grib:queue:Ingest.Grib" />
|
||||
<to uri="jms-durable:queue:Ingest.Grib" />
|
||||
</otherwise>
|
||||
</choice>
|
||||
</split>
|
||||
|
|
|
@ -4,6 +4,6 @@
|
|||
<bean id="gribDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="grib" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Grib" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Grib" />
|
||||
</bean>
|
||||
</beans>
|
|
@ -8,7 +8,7 @@
|
|||
<bean id="ldadDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ldad" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ldad" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ldad" />
|
||||
</bean>
|
||||
|
||||
<camelContext id="ldad-camel"
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<bean id="ldadhydroDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ldadhydro" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ldadhydro" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ldadhydro" />
|
||||
</bean>
|
||||
|
||||
<bean id="ldadhydroPointData" class="com.raytheon.edex.plugin.ldadhydro.dao.LdadhydroPointDataTransform"/>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<bean id="ldadmanualDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ldadmanual" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ldadmanual"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ldadmanual"/>
|
||||
</bean>
|
||||
|
||||
<bean id="ldadmanualCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<bean id="ldadprofilerDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ldadprofiler" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ldadprofiler"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ldadprofiler"/>
|
||||
</bean>
|
||||
|
||||
<bean id="ldadprofilerCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<bean id="mdlsndgDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="modelsoundingPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.modelsounding"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.modelsounding"/>
|
||||
</bean>
|
||||
|
||||
<bean id="modelsoundingCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
<bean id="obsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
||||
<constructor-arg value="obs" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.obs" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.obs" />
|
||||
</bean>
|
||||
|
||||
<bean id="obsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<bean id="pirepDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="pirep" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.pirep" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.pirep" />
|
||||
</bean>
|
||||
|
||||
<bean id="pirepCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="poessoundingDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="poessoundingPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.poessounding"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.poessounding"/>
|
||||
</bean>
|
||||
|
||||
<bean id="poessoundingCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="profilerDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="profilerPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.profiler"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.profiler"/>
|
||||
</bean>
|
||||
|
||||
<bean id="profilerCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -5,28 +5,17 @@
|
|||
|
||||
<bean id="radarDecompressor" class="com.raytheon.edex.plugin.radar.RadarDecompressor"/>
|
||||
<bean id="radarDecoder" class="com.raytheon.edex.plugin.radar.RadarDecoder"/>
|
||||
<bean id="jms-radar" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsRadarConfig" />
|
||||
<property name="taskExecutor" ref="radarThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsRadarConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="radarThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="2" />
|
||||
<property name="maxPoolSize" value="2" />
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="radarDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="radar" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Radar" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Radar" />
|
||||
</bean>
|
||||
|
||||
<bean id="radarRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="radar" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.RadarRadarServer" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.RadarRadarServer" />
|
||||
</bean>
|
||||
|
||||
<bean id="radarCamelRegistered" factory-bean="contextManager"
|
||||
|
@ -47,13 +36,13 @@
|
|||
<setHeader headerName="pluginName">
|
||||
<constant>radar</constant>
|
||||
</setHeader>
|
||||
<to uri="jms-radar:queue:Ingest.Radar" />
|
||||
<to uri="jms-durable:queue:Ingest.Radar" />
|
||||
</route>
|
||||
-->
|
||||
|
||||
<!-- Begin Radar routes -->
|
||||
<route id="radarIngestRoute">
|
||||
<from uri="jms-radar:queue:Ingest.Radar"/>
|
||||
<from uri="jms-durable:queue:Ingest.Radar"/>
|
||||
<setHeader headerName="dataType">
|
||||
<constant>radar-sbn</constant>
|
||||
</setHeader>
|
||||
|
@ -61,7 +50,7 @@
|
|||
</route>
|
||||
|
||||
<route id="radarRadarServerIngestRoute">
|
||||
<from uri="jms-radar:queue:Ingest.RadarRadarServer"/>
|
||||
<from uri="jms-durable:queue:Ingest.RadarRadarServer"/>
|
||||
<setHeader headerName="dataType">
|
||||
<constant>radar-local</constant>
|
||||
</setHeader>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<bean id="reccoDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="reccoPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.recco" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.recco" />
|
||||
</bean>
|
||||
|
||||
<bean id="reccoCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="redbookDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="redbook" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.redbook"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.redbook"/>
|
||||
</bean>
|
||||
|
||||
<!--
|
||||
|
|
|
@ -3,18 +3,6 @@
|
|||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="jms-satellite" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsSatelliteConfig" />
|
||||
<property name="taskExecutor" ref="satelliteThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsSatelliteConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="satelliteThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
|
||||
<bean id="satelliteDecoder" class="com.raytheon.edex.plugin.satellite.SatelliteDecoder">
|
||||
<property name="dao" ref="satelliteDao" />
|
||||
</bean>
|
||||
|
@ -26,7 +14,7 @@
|
|||
<bean id="satDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="satellite" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Satellite" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Satellite" />
|
||||
</bean>
|
||||
|
||||
<bean id="satCamelRegistered" factory-bean="contextManager"
|
||||
|
@ -53,7 +41,7 @@
|
|||
|
||||
<!-- Begin Sat routes -->
|
||||
<route id="satIngestRoute">
|
||||
<from uri="jms-satellite:queue:Ingest.Satellite"/>
|
||||
<from uri="jms-durable:queue:Ingest.Satellite"/>
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>satellite</constant>
|
||||
</setHeader>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
<bean id="sfcobsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
||||
<constructor-arg value="sfcobs" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.sfcobs" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.sfcobs" />
|
||||
</bean>
|
||||
|
||||
<bean id="sfcobsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
||||
|
|
|
@ -3,18 +3,6 @@
|
|||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="jms-shef" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsShefConfig" />
|
||||
<property name="taskExecutor" ref="shefThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsShefConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="shefThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="3" />
|
||||
<property name="maxPoolSize" value="3" />
|
||||
</bean>
|
||||
|
||||
<bean id="shefDecoder" class="com.raytheon.edex.plugin.shef.ShefDecoder">
|
||||
<constructor-arg value="shef" />
|
||||
</bean>
|
||||
|
@ -47,13 +35,13 @@
|
|||
factory-method="register">
|
||||
<constructor-arg value="shef" />
|
||||
<constructor-arg
|
||||
value="jms-dist:queue:Ingest.Shef"/>
|
||||
value="jms-durable:queue:Ingest.Shef"/>
|
||||
</bean>
|
||||
|
||||
<bean id="shefHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="shef" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Shef"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Shef"/>
|
||||
</bean>
|
||||
|
||||
<bean id="shefCamelRegistered" factory-bean="contextManager"
|
||||
|
@ -92,7 +80,7 @@
|
|||
<!-- Begin shef routes -->
|
||||
<route id="shefIngestRoute">
|
||||
<from
|
||||
uri="jms-shef:queue:Ingest.Shef"/>
|
||||
uri="jms-durable:queue:Ingest.Shef"/>
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>shef</constant>
|
||||
</setHeader>
|
||||
|
@ -103,7 +91,7 @@
|
|||
</route>
|
||||
<route id="shefStagedRoute">
|
||||
<from
|
||||
uri="jms-shef:queue:Ingest.ShefStaged"/>
|
||||
uri="jms-durable:queue:Ingest.ShefStaged"/>
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>shef</constant>
|
||||
</setHeader>
|
||||
|
@ -155,7 +143,7 @@
|
|||
|
||||
<route id="shefManualIngestRoute">
|
||||
<from
|
||||
uri="jms-shef:queue:Ingest.ShefManual"/>
|
||||
uri="jms-durable:queue:Ingest.ShefManual"/>
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>shef</constant>
|
||||
</setHeader>
|
||||
|
|
|
@ -33,8 +33,6 @@ import org.apache.commons.logging.Log;
|
|||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
import com.raytheon.edex.textdb.dbapi.impl.TextDB;
|
||||
import com.raytheon.uf.common.dataplugin.text.request.WriteProductRequest;
|
||||
import com.raytheon.uf.common.ohd.AppsDefaults;
|
||||
import com.raytheon.uf.edex.core.EDEXUtil;
|
||||
|
||||
|
@ -45,12 +43,11 @@ import com.raytheon.uf.edex.core.EDEXUtil;
|
|||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* June 15, 2011 9377 jnjanga Initial creation
|
||||
* July 12, 2013 15711 wkwock Fix verbose, observe mode, etc
|
||||
*
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------- ---------- ----------- --------------------------
|
||||
* Jun 15, 2011 9377 jnjanga Initial creation.
|
||||
* Jul 12, 2013 15711 wkwock Fix verbose, observe mode, etc.
|
||||
* Feb 10, 2014 2781 rjpeter Removed dead method.
|
||||
* </pre>
|
||||
*
|
||||
* @author jnjanga
|
||||
|
@ -88,7 +85,7 @@ public class AlertalarmStdTextProductUtil {
|
|||
setCurrentReportfile();
|
||||
|
||||
reportAlarm();
|
||||
|
||||
|
||||
System.exit(reportWriter.getAlarmCount());
|
||||
}
|
||||
|
||||
|
@ -104,7 +101,7 @@ public class AlertalarmStdTextProductUtil {
|
|||
options.addOption(CmdlineOptionId.FILE_SUFFIX);
|
||||
options.addOption(CmdlineOptionId.FLAGS);
|
||||
options.addOption(CmdlineOptionId.PE);
|
||||
options.addOption(CmdlineOptionId.VERBOSE,false);
|
||||
options.addOption(CmdlineOptionId.VERBOSE, false);
|
||||
return options;
|
||||
}
|
||||
|
||||
|
@ -147,13 +144,14 @@ public class AlertalarmStdTextProductUtil {
|
|||
String optName = optId.toString();
|
||||
System.out.println("optName = " + optName);
|
||||
if (optName.equalsIgnoreCase("v")) {
|
||||
if (line.hasOption(optName)) {
|
||||
System.out.println(" optValue = true");
|
||||
} else {
|
||||
System.out.println(" optValue = false");
|
||||
}
|
||||
if (line.hasOption(optName)) {
|
||||
System.out.println(" optValue = true");
|
||||
} else {
|
||||
System.out.println(" optValue = false");
|
||||
}
|
||||
} else {
|
||||
System.out.println(" optValue = " + line.getOptionValue(optName));
|
||||
System.out.println(" optValue = "
|
||||
+ line.getOptionValue(optName));
|
||||
}
|
||||
|
||||
if (line.hasOption(optName)) {
|
||||
|
@ -177,9 +175,10 @@ public class AlertalarmStdTextProductUtil {
|
|||
ignoreMin.add(ReportMode.NEAREST);
|
||||
ignoreMin.add(ReportMode.LATEST_MAXFCST);
|
||||
if (rptOptions.isMinutesGiven()
|
||||
&& ignoreMin.contains(rptOptions.getMode()))
|
||||
&& ignoreMin.contains(rptOptions.getMode())) {
|
||||
System.out
|
||||
.println("Usage : -m<minutes> value ignored for this -r<report_mode>");
|
||||
}
|
||||
|
||||
reportOptions = rptOptions;
|
||||
|
||||
|
@ -191,9 +190,11 @@ public class AlertalarmStdTextProductUtil {
|
|||
private static boolean hasDuplicateOptions(CommandLine line) {
|
||||
Option[] userOptions = line.getOptions();
|
||||
Set<String> unique = new HashSet<String>();
|
||||
for (Option option : userOptions)
|
||||
if (!unique.add(option.getOpt()))
|
||||
for (Option option : userOptions) {
|
||||
if (!unique.add(option.getOpt())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -221,9 +222,9 @@ public class AlertalarmStdTextProductUtil {
|
|||
reportWriter.writeHeader();
|
||||
reportWriter.writeBody(aaRecord);
|
||||
if (reportOptions.getVerbose()) {
|
||||
reportWriter.writeVerboseTrailer();
|
||||
reportWriter.writeVerboseTrailer();
|
||||
} else {
|
||||
reportWriter.writeReportTrailer();
|
||||
reportWriter.writeReportTrailer();
|
||||
}
|
||||
|
||||
// save it to the text database if indeed
|
||||
|
@ -232,7 +233,7 @@ public class AlertalarmStdTextProductUtil {
|
|||
if (alarmCount > 0) {
|
||||
log.info(alarmCount + " alarms reported, report written to "
|
||||
+ reportWriter.getFilename());
|
||||
//saveReportTotextDb();
|
||||
// saveReportTotextDb();
|
||||
} else {
|
||||
log.info("No alarms reported, info sent to "
|
||||
+ reportWriter.getFilename());
|
||||
|
@ -241,37 +242,6 @@ public class AlertalarmStdTextProductUtil {
|
|||
|
||||
}
|
||||
|
||||
/*
|
||||
* saves the report contents to the text database.
|
||||
*/
|
||||
private static void saveReportTotextDb() {
|
||||
|
||||
setApplicationSpringContext(Constants.FXA_CONFIG);
|
||||
|
||||
WriteProductRequest request = new WriteProductRequest();
|
||||
request.setProductId(reportOptions.getProductId());
|
||||
request.setOperationalMode(true);
|
||||
request.setNotifyAlarmAlert(true);
|
||||
String rptData = reportWriter.getReportData();
|
||||
request.setReportData(rptData);
|
||||
|
||||
log.info("Sending " + reportWriter.getFilename() + " to textdb as id "
|
||||
+ request.getProductId());
|
||||
|
||||
TextDB textdb = new TextDB();
|
||||
long result = textdb.writeProduct(request.getProductId(),
|
||||
request.getReportData(), request.getOperationalMode(), null);
|
||||
|
||||
if (result != Long.MIN_VALUE) {
|
||||
log.info("Product " + request.getProductId()
|
||||
+ " successfully sent to textdb");
|
||||
} else {
|
||||
log.error("Error sending product " + request.getProductId()
|
||||
+ " to textdb. status=" + result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* verify whether necessary application tokens have been defined.
|
||||
*/
|
||||
|
@ -308,18 +278,20 @@ public class AlertalarmStdTextProductUtil {
|
|||
String pid = reportOptions.getProductId();
|
||||
String suffix = reportOptions.getFileSuffix();
|
||||
|
||||
if (suffix.length() > 0)
|
||||
currReport = new File(reportDir + File.separator + pid + "." + suffix);
|
||||
else
|
||||
if (suffix.length() > 0) {
|
||||
currReport = new File(reportDir + File.separator + pid + "."
|
||||
+ suffix);
|
||||
} else {
|
||||
currReport = new File(reportDir + File.separator + pid);
|
||||
}
|
||||
|
||||
try {
|
||||
currReport.createNewFile();
|
||||
} catch (Exception e) {
|
||||
log.fatal("Could not create report file "
|
||||
log.fatal("Could not create report file "
|
||||
+ String.valueOf(currReport));
|
||||
log.info("Exiting.");
|
||||
System.exit(0);
|
||||
log.info("Exiting.");
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,30 +23,41 @@ import java.text.SimpleDateFormat;
|
|||
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefConstants;
|
||||
|
||||
|
||||
/**
|
||||
* Constants for alert alarm.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 10, 2014 2781 rjpeter Initial history, update IHFS_CONFIG path.
|
||||
* </pre>
|
||||
*
|
||||
* @author jnjanga
|
||||
* @version 1.0
|
||||
*/
|
||||
class Constants {
|
||||
|
||||
|
||||
public static final SimpleDateFormat REPORT_TIME_PATTERN = new SimpleDateFormat(
|
||||
"HH:mm:ss z, yyyy.MM.dd ");
|
||||
"HH:mm:ss z, yyyy.MM.dd ");
|
||||
|
||||
public static final int MISSING_VALUE_INT = ShefConstants.SHEF_MISSING_INT;
|
||||
|
||||
|
||||
public static final double MISSING_VALUE_DOUBLE = -9999999.87654321;
|
||||
|
||||
public static final String NEWLINE = System.getProperty("line.separator");
|
||||
|
||||
|
||||
public final static String EOL = NEWLINE;
|
||||
|
||||
public static final String SPACE = " ";
|
||||
|
||||
|
||||
public static final String REPORT_ALARM_LOG = "report_alarm.log";
|
||||
|
||||
|
||||
public static final String WHFS_PRODUCT_DIR = "whfs_product_dir";
|
||||
|
||||
|
||||
public static final String WHFS_UTIL_LOG_DIR = "whfs_util_log_dir";
|
||||
|
||||
public static final String IHFS_CONFIG = "/res/spring/ohd-common.xml";
|
||||
|
||||
public static final String FXA_CONFIG = "/res/spring/alertalarm.xml";
|
||||
|
||||
|
||||
public static final String IHFS_CONFIG = "/res/spring/ohd-common-database.xml";
|
||||
}
|
|
@ -9,13 +9,13 @@
|
|||
<bean id="tafDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="taf" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.taf"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.taf"/>
|
||||
</bean>
|
||||
|
||||
<bean id="tafHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="taf" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.taf"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.taf"/>
|
||||
</bean>
|
||||
|
||||
<bean id="tafCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -86,6 +86,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
|||
* Oct 21, 2008 1515 jkorman Added 30 Hour capability changes.
|
||||
* Jun 28, 2012 #827 dgilling Annotate id field for
|
||||
* serialization.
|
||||
* Feb 10, 2014 2777 rferrel set the parentId when assinging sets.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -108,7 +109,6 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
@DynamicSerializeElement
|
||||
private int id;
|
||||
|
||||
/** A String containing the change group */
|
||||
|
@ -912,6 +912,11 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
public void setTurbulence_layers(Set<TurbulenceLayer> turbulence_layers) {
|
||||
this.turbulence_layers = turbulence_layers;
|
||||
if ((turbulence_layers != null) && (turbulence_layers.size() > 0)) {
|
||||
for (TurbulenceLayer turbulence_layer : turbulence_layers) {
|
||||
turbulence_layer.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<IcingLayer> getIcing_layers() {
|
||||
|
@ -920,6 +925,11 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
public void setIcing_layers(Set<IcingLayer> icing_layers) {
|
||||
this.icing_layers = icing_layers;
|
||||
if ((icing_layers != null) && (icing_layers.size() > 0)) {
|
||||
for (IcingLayer icing_layer : icing_layers) {
|
||||
icing_layer.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<TemperatureForecast> getTemp_forecasts() {
|
||||
|
@ -928,6 +938,11 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
public void setTemp_forecasts(Set<TemperatureForecast> temp_forecasts) {
|
||||
this.temp_forecasts = temp_forecasts;
|
||||
if ((temp_forecasts != null) && (temp_forecasts.size() > 0)) {
|
||||
for (TemperatureForecast temForecast : temp_forecasts) {
|
||||
temForecast.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<TafWeatherCondition> getWeather() {
|
||||
|
@ -936,6 +951,11 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
public void setWeather(Set<TafWeatherCondition> weather) {
|
||||
this.weather = weather;
|
||||
if ((weather != null) && (weather.size() > 0)) {
|
||||
for (TafWeatherCondition twc : weather) {
|
||||
twc.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<TafSkyCover> getSky_cover() {
|
||||
|
@ -944,6 +964,11 @@ public class ChangeGroup extends PersistableDataObject implements
|
|||
|
||||
public void setSky_cover(Set<TafSkyCover> sky_cover) {
|
||||
this.sky_cover = sky_cover;
|
||||
if ((sky_cover != null) && (sky_cover.size() > 0)) {
|
||||
for (TafSkyCover tsc : sky_cover) {
|
||||
tsc.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkGroupDataEnd(StringBuilder group) {
|
||||
|
|
|
@ -69,6 +69,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
|||
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
||||
* PluginDataObject.
|
||||
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
||||
* Feb 10, 2014 2777 rferrel Assign parent id when setting ChangeGroup.
|
||||
* Feb 11, 2014 2784 rferrel Remove override of setIdentifier.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -292,6 +294,11 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled {
|
|||
*/
|
||||
public void setChangeGroups(Set<ChangeGroup> changeGroups) {
|
||||
this.changeGroups = changeGroups;
|
||||
if ((changeGroups != null) && (changeGroups.size() > 0)) {
|
||||
for (ChangeGroup changeGroup : changeGroups) {
|
||||
changeGroup.setParentID(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -339,19 +346,6 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled {
|
|||
this.remarks = remarks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIdentifier(Object dataURI) {
|
||||
|
||||
this.identifier = dataURI;
|
||||
|
||||
if ((this.changeGroups != null) && (this.changeGroups.size() > 0)) {
|
||||
for (ChangeGroup group : this.changeGroups) {
|
||||
group.setParentID(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the IDecoderGettable reference for this record.
|
||||
*
|
||||
|
|
|
@ -11,13 +11,13 @@
|
|||
<bean id="textDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="text" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Text"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Text"/>
|
||||
</bean>
|
||||
|
||||
<bean id="textHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="text" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Text"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Text"/>
|
||||
</bean>
|
||||
|
||||
<!-- define the bean that handles automatic faxing of products. -->
|
||||
|
@ -27,18 +27,6 @@
|
|||
<!-- verify text product info for site, spawns in separate thread to not delay start up -->
|
||||
<bean id="textVersionPurge" class="com.raytheon.edex.plugin.text.TextVersionPurge" depends-on="textRegistered"/>
|
||||
|
||||
<bean id="jms-text" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsTextConfig" />
|
||||
<property name="taskExecutor" ref="textThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsTextConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="textThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="2" />
|
||||
<property name="maxPoolSize" value="2" />
|
||||
</bean>
|
||||
|
||||
<!-- Special handler for text plugin archives that bases filenames off
|
||||
creation time-->
|
||||
<bean id="textArchiveNamer" class="com.raytheon.edex.plugin.text.maintenance.archiver.TextArchiveFileNameFormatter" />
|
||||
|
@ -118,7 +106,7 @@
|
|||
</route>
|
||||
|
||||
<route id="textUndecodedIngestRoute">
|
||||
<from uri="jms-text:queue:Ingest.Text?concurrentConsumers=2" />
|
||||
<from uri="jms-durable:queue:Ingest.Text?concurrentConsumers=2" />
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>text</constant>
|
||||
</setHeader>
|
||||
|
@ -145,7 +133,7 @@
|
|||
<route id="textToWatchWarnRoute">
|
||||
<from uri="direct:textToWatchWarn" />
|
||||
<bean ref="textDecoder" method="transformToProductIds" />
|
||||
<to uri="jms-text:queue:watchwarn" />
|
||||
<to uri="jms-durable:queue:watchwarn" />
|
||||
</route>
|
||||
|
||||
<route id="textSerializationRoute">
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="textlightningDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="textlightning" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.textlightning"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.textlightning"/>
|
||||
</bean>
|
||||
|
||||
<bean id="textlightningCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
<bean id="warningDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="warning" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Warning"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Warning"/>
|
||||
</bean>
|
||||
|
||||
<bean id="warningHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="warning" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Warning"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Warning"/>
|
||||
</bean>
|
||||
|
||||
<bean id="warningCamelRegistered" factory-bean="contextManager"
|
||||
|
@ -22,18 +22,6 @@
|
|||
<constructor-arg ref="warning-camel"/>
|
||||
</bean>
|
||||
|
||||
<bean id="jms-warning" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsWarningConfig" />
|
||||
<property name="taskExecutor" ref="warningThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsWarningConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="warningThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
|
||||
<camelContext id="warning-camel"
|
||||
xmlns="http://camel.apache.org/schema/spring"
|
||||
errorHandlerRef="errorHandler"
|
||||
|
@ -56,7 +44,7 @@
|
|||
Warning routes
|
||||
-->
|
||||
<route id="warningIngestRoute">
|
||||
<from uri="jms-warning:queue:Ingest.Warning"/>
|
||||
<from uri="jms-durable:queue:Ingest.Warning"/>
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>warning</constant>
|
||||
</setHeader>
|
||||
|
@ -67,11 +55,11 @@
|
|||
<bean ref="index" method="index" />
|
||||
<multicast parallelProcessing="false">
|
||||
<to uri="direct-vm:warningIngestAlert" />
|
||||
<to uri="jms-warning:queue:edex.spcWatch" />
|
||||
<to uri="jms-warning:queue:edex.tpcWatch" />
|
||||
<to uri="jms-durable:queue:edex.spcWatch" />
|
||||
<to uri="jms-durable:queue:edex.tpcWatch" />
|
||||
<filter>
|
||||
<method bean="vtecFilter" method="hasVTEC" />
|
||||
<to uri="jms-warning:queue:activeTablePending"/>
|
||||
<to uri="jms-durable:queue:activeTablePending"/>
|
||||
</filter>
|
||||
</multicast>
|
||||
</pipeline>
|
||||
|
|
|
@ -41,12 +41,18 @@
|
|||
</bean>
|
||||
|
||||
<!-- JmsPooled* do not work... -->
|
||||
<bean id="jms-alt" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsAltConfig" />
|
||||
<property name="taskExecutor" ref="genericThreadPool" />
|
||||
<bean id="jms-mhs" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsMhsConfig" />
|
||||
<property name="taskExecutor" ref="mhsThreadPool" />
|
||||
</bean>
|
||||
|
||||
<bean id="jmsAltConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
||||
<bean id="mhsThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
|
||||
<bean id="jmsMhsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
||||
<property name="recoveryInterval" value="1000"/>
|
||||
<property name="connectionFactory" ref="amqConnectionFactory" />
|
||||
<property name="destinationResolver" ref="qpidNoDurableResolver"/>
|
||||
|
@ -64,7 +70,7 @@
|
|||
<!-- Convert from BeanInvocation if needed. -->
|
||||
<convertBodyTo type="com.raytheon.uf.common.dataplugin.text.request.RemoteRetrievalRequest" />
|
||||
<bean ref="serializationUtil" method="transformToThrift" />
|
||||
<to uri="jms-alt:queue:fxa.mhs.request?requestTimeout=122000" pattern="InOut" />
|
||||
<to uri="jms-mhs:queue:fxa.mhs.request?requestTimeout=122000" pattern="InOut" />
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
</route>
|
||||
</camelContext>
|
||||
|
|
|
@ -97,6 +97,7 @@ import com.raytheon.uf.common.time.util.TimeUtil;
|
|||
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
||||
* PluginDataObject.
|
||||
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
||||
* Feb 11, 2014 2784 rferrel Remove override of setIdentifier.
|
||||
* </pre>
|
||||
*
|
||||
* @author bphillip
|
||||
|
@ -984,6 +985,11 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
|||
*/
|
||||
public void setSkyCoverage(Set<SkyCover> skyCoverage) {
|
||||
this.skyCoverage = skyCoverage;
|
||||
if ((skyCoverage != null) && (skyCoverage.size() > 0)) {
|
||||
for (SkyCover cover : skyCoverage) {
|
||||
cover.setParentMetar(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addSkyCoverage(SkyCover cover) {
|
||||
|
@ -1019,6 +1025,11 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
|||
*/
|
||||
public void setWeatherCondition(List<WeatherCondition> weatherCondition) {
|
||||
this.weatherCondition = weatherCondition;
|
||||
if ((weatherCondition != null) && (weatherCondition.size() > 0)) {
|
||||
for (WeatherCondition cond : weatherCondition) {
|
||||
cond.setParentMetar(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addWeatherCondition(WeatherCondition condition) {
|
||||
|
@ -1116,30 +1127,6 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
|||
this.snowWater = snowWater;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override existing set method to modify any classes that use the dataURI
|
||||
* as a foreign key
|
||||
*/
|
||||
@Override
|
||||
public void setIdentifier(Object dataURI) {
|
||||
this.identifier = dataURI;
|
||||
// set the parentID to the dataURI for all values
|
||||
if ((this.getWeatherCondition() != null)
|
||||
&& (this.getWeatherCondition().size() > 0)) {
|
||||
for (WeatherCondition cond : this.getWeatherCondition()) {
|
||||
cond.setParentMetar(this);
|
||||
}
|
||||
}
|
||||
|
||||
// set the parentID to the dataURI for all values
|
||||
if ((this.getSkyCoverage() != null)
|
||||
&& (this.getSkyCoverage().size() > 0)) {
|
||||
for (SkyCover cover : this.getSkyCoverage()) {
|
||||
cover.setParentMetar(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getReportType() {
|
||||
return reportType;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlElement;
|
|||
|
||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||
|
||||
/**
|
||||
* This is the root class for any object being persisted in the database using
|
||||
|
@ -50,6 +49,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
|||
* 7/24/07 353 bphillip Initial Check in
|
||||
* 20080408 1039 jkorman Added traceId for tracing data.
|
||||
* Oct 10, 2012 1261 djohnson Add generic for identifier.
|
||||
* Feb 11, 2014 2784 rferrel Identifier no longer a DynamicSerializeElement.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -59,8 +59,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
|||
@XmlAccessorType(XmlAccessType.NONE)
|
||||
@DynamicSerialize
|
||||
public abstract class PersistableDataObject<IDENTIFIER_TYPE> implements
|
||||
IPersistableDataObject<IDENTIFIER_TYPE>,
|
||||
Serializable, ISerializableObject {
|
||||
IPersistableDataObject<IDENTIFIER_TYPE>, Serializable,
|
||||
ISerializableObject {
|
||||
|
||||
private static final long serialVersionUID = -6747395152869923909L;
|
||||
|
||||
|
@ -69,7 +69,6 @@ public abstract class PersistableDataObject<IDENTIFIER_TYPE> implements
|
|||
* key for the associated database table.
|
||||
*/
|
||||
@XmlElement
|
||||
@DynamicSerializeElement
|
||||
protected IDENTIFIER_TYPE identifier;
|
||||
|
||||
private String traceId = "";
|
||||
|
|
|
@ -5,6 +5,7 @@ Bundle-SymbolicName: com.raytheon.uf.common.jms
|
|||
Bundle-Version: 1.12.1174.qualifier
|
||||
Bundle-Vendor: Raytheon
|
||||
Require-Bundle: javax.jms,
|
||||
com.raytheon.uf.common.status
|
||||
com.raytheon.uf.common.status,
|
||||
org.apache.qpid
|
||||
Export-Package: com.raytheon.uf.common.jms
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
|
|
|
@ -39,7 +39,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* connection can be released to the pool. Any exception will close pooled
|
||||
* session instead of returning to the pool. The sessions are tracked in both
|
||||
* active and available states. An available session can be reused by the next
|
||||
* client.
|
||||
* client. The connection is pinned to Thread that creates the connection and
|
||||
* cannot be used/reused by any other thread.
|
||||
*
|
||||
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
||||
* happen in a downward direction. A manager has a synchronized lock can make a
|
||||
|
@ -52,9 +53,11 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 15, 2011 rjpeter Initial creation
|
||||
* Mar 08, 2012 194 njensen Improved safety of close()
|
||||
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario
|
||||
* Apr 15, 2011 rjpeter Initial creation.
|
||||
* Mar 08, 2012 194 njensen Improved safety of close().
|
||||
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario.
|
||||
* Feb 07, 2014 2357 rjpeter Track by Thread, close session is it has no
|
||||
* producers/consumers.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -86,7 +89,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
|
||||
private volatile AvailableJmsPooledObject<JmsPooledSession> availableSession = null;
|
||||
|
||||
private volatile String key = null;
|
||||
private final Thread thread;
|
||||
|
||||
private final String clientId;
|
||||
|
||||
|
@ -94,8 +97,10 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
|
||||
private volatile boolean exceptionOccurred = false;
|
||||
|
||||
public JmsPooledConnection(JmsPooledConnectionFactory connFactory) {
|
||||
public JmsPooledConnection(JmsPooledConnectionFactory connFactory,
|
||||
Thread thread) {
|
||||
this.connFactory = connFactory;
|
||||
this.thread = thread;
|
||||
this.clientId = null;
|
||||
getConnection();
|
||||
}
|
||||
|
@ -123,7 +128,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
if (availableSession != null) {
|
||||
JmsPooledSession availSess = availableSession.getPooledObject();
|
||||
synchronized (availSess.getStateLock()) {
|
||||
if (availSess.isValid()) {
|
||||
if (availSess.isValid()
|
||||
&& availSess.hasProducersOrConsumers()) {
|
||||
availSess.setState(State.InUse);
|
||||
session = availSess;
|
||||
} else {
|
||||
|
@ -185,6 +191,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
}
|
||||
|
||||
if (canClose) {
|
||||
statusHandler.info("Closing connection: " + this.toString());
|
||||
// njensen: I moved removing the connection from the pool to be
|
||||
// the first thing in this block instead of last thing so
|
||||
// there's no chance it could be closed and then retrieved from
|
||||
|
@ -283,6 +290,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
// safe since conn is volatile
|
||||
synchronized (stateLock) {
|
||||
if (conn == null) {
|
||||
statusHandler.info("Creating connection: "
|
||||
+ this.toString());
|
||||
long exceptionLastHandled = 0;
|
||||
boolean connected = false;
|
||||
while (!connected) {
|
||||
|
@ -298,7 +307,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
connectionStartTime = System.currentTimeMillis();
|
||||
connected = true;
|
||||
} catch (Exception e) {
|
||||
if (exceptionLastHandled + ERROR_BROADCAST_INTERVAL < System
|
||||
if ((exceptionLastHandled + ERROR_BROADCAST_INTERVAL) < System
|
||||
.currentTimeMillis()) {
|
||||
exceptionLastHandled = System
|
||||
.currentTimeMillis();
|
||||
|
@ -502,12 +511,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
|||
}
|
||||
}
|
||||
|
||||
public void setKey(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
public Thread getThread() {
|
||||
return thread;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,23 +1,3 @@
|
|||
package com.raytheon.uf.common.jms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Deque;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
import javax.jms.Connection;
|
||||
import javax.jms.ConnectionFactory;
|
||||
import javax.jms.JMSException;
|
||||
|
||||
import com.raytheon.uf.common.jms.wrapper.JmsConnectionWrapper;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||
|
||||
/**
|
||||
* This software was developed and / or modified by Raytheon Company,
|
||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
|
@ -37,9 +17,37 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
* further licensing information.
|
||||
**/
|
||||
package com.raytheon.uf.common.jms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
import javax.jms.Connection;
|
||||
import javax.jms.ConnectionFactory;
|
||||
import javax.jms.JMSException;
|
||||
|
||||
import com.raytheon.uf.common.jms.wrapper.JmsConnectionWrapper;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||
|
||||
/**
|
||||
* TODO Add Description
|
||||
* Connection Factory that keep underlying JMS resources used by a thread open
|
||||
* for re-use by that same thread. This is to get around Spring's opening and
|
||||
* closing the full jms stack for each message. We cannot use Spring caching
|
||||
* mechanism since it requires one connection object to be used for all jms
|
||||
* sessions. In that scenario one error causes every jms resource to disconnect
|
||||
* and has been known to dead lock in the qpid code.
|
||||
*
|
||||
* The close action puts the resource into a pool for reuse. The jms resource
|
||||
* may only be reused by the same thread. This is in part since each thread
|
||||
* always connects to the same set of jms resources. Also on the QPID broker
|
||||
* transient data is only removed when the session itself is closed. So reusing
|
||||
* a resource on a different thread can cause transient topic resources with no
|
||||
* consumers.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
|
@ -48,7 +56,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 15, 2011 rjpeter Initial creation
|
||||
*
|
||||
* Oct 04, 2013 2357 rjpeter Removed pooling, keeps resources open for the
|
||||
* thread that created them for a configured amount of time.
|
||||
* Feb 07, 2014 2357 rjpeter Track by Thread object, periodly check that tracked Threads are still alive.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -63,26 +73,18 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
|
||||
private String provider = "QPID";
|
||||
|
||||
// connections in use, key is "threadId-threadName"
|
||||
private final Map<String, JmsPooledConnection> inUseConnections = new HashMap<String, JmsPooledConnection>();
|
||||
// connections in use
|
||||
private final Map<Thread, JmsPooledConnection> inUseConnections = new HashMap<Thread, JmsPooledConnection>();
|
||||
|
||||
// connections that were recently returned, key is "threadId-threadName"
|
||||
private final Map<String, AvailableJmsPooledObject<JmsPooledConnection>> pendingConnections = new HashMap<String, AvailableJmsPooledObject<JmsPooledConnection>>();
|
||||
|
||||
// connections that have been released from pendingConnections and are
|
||||
// awaiting being closed.
|
||||
private final Deque<AvailableJmsPooledObject<JmsPooledConnection>> availableConnections = new LinkedList<AvailableJmsPooledObject<JmsPooledConnection>>();
|
||||
// connections that were recently returned
|
||||
private final Map<Thread, AvailableJmsPooledObject<JmsPooledConnection>> pendingConnections = new HashMap<Thread, AvailableJmsPooledObject<JmsPooledConnection>>();
|
||||
|
||||
private final ConcurrentLinkedQueue<JmsPooledConnection> deadConnections = new ConcurrentLinkedQueue<JmsPooledConnection>();
|
||||
|
||||
private int reconnectInterval = 30000;
|
||||
|
||||
private int connectionHoldTime = 120000;
|
||||
|
||||
private int resourceRetention = 180000;
|
||||
|
||||
private int maxSpareConnections = 10;
|
||||
|
||||
public JmsPooledConnectionFactory(ConnectionFactory factory) {
|
||||
this.connFactory = factory;
|
||||
}
|
||||
|
@ -94,24 +96,23 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
*/
|
||||
@Override
|
||||
public Connection createConnection() throws JMSException {
|
||||
String threadKey = "" + Thread.currentThread().getId() + "-"
|
||||
+ Thread.currentThread().getName();
|
||||
Thread thread = Thread.currentThread();
|
||||
JmsPooledConnection conn = null;
|
||||
|
||||
synchronized (inUseConnections) {
|
||||
conn = inUseConnections.get(threadKey);
|
||||
conn = inUseConnections.get(thread);
|
||||
|
||||
if (conn != null) {
|
||||
JmsConnectionWrapper ref = conn.createReference();
|
||||
if (ref != null) {
|
||||
statusHandler
|
||||
.info(threadKey
|
||||
.info(thread.getName()
|
||||
+ " already has a connection in use, returning previous connection thread, references="
|
||||
+ conn.getReferenceCount());
|
||||
return ref;
|
||||
} else {
|
||||
deadConnections.add(conn);
|
||||
inUseConnections.remove(threadKey);
|
||||
inUseConnections.remove(thread);
|
||||
conn = null;
|
||||
}
|
||||
}
|
||||
|
@ -121,13 +122,14 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
|
||||
// check connections by Thread
|
||||
synchronized (pendingConnections) {
|
||||
wrapper = pendingConnections.remove(threadKey);
|
||||
wrapper = pendingConnections.remove(thread);
|
||||
}
|
||||
|
||||
// was retrieved connection valid
|
||||
if (wrapper != null) {
|
||||
conn = wrapper.getPooledObject();
|
||||
JmsConnectionWrapper ref = getConnectionWrapper(threadKey, conn);
|
||||
|
||||
JmsConnectionWrapper ref = getConnectionWrapper(conn);
|
||||
|
||||
if (ref != null) {
|
||||
return ref;
|
||||
|
@ -137,51 +139,22 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
}
|
||||
}
|
||||
|
||||
// check available connections
|
||||
boolean keepChecking = true;
|
||||
|
||||
while (keepChecking) {
|
||||
synchronized (availableConnections) {
|
||||
wrapper = availableConnections.poll();
|
||||
}
|
||||
|
||||
if (wrapper != null) {
|
||||
conn = wrapper.getPooledObject();
|
||||
} else {
|
||||
keepChecking = false;
|
||||
}
|
||||
|
||||
if (conn != null) {
|
||||
// was retrieved connection valid
|
||||
JmsConnectionWrapper ref = getConnectionWrapper(threadKey, conn);
|
||||
|
||||
if (ref != null) {
|
||||
return ref;
|
||||
} else {
|
||||
deadConnections.add(conn);
|
||||
conn = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// create new connection?
|
||||
if (conn == null) {
|
||||
conn = new JmsPooledConnection(this);
|
||||
conn = new JmsPooledConnection(this, thread);
|
||||
}
|
||||
|
||||
return getConnectionWrapper(threadKey, conn);
|
||||
return getConnectionWrapper(conn);
|
||||
}
|
||||
|
||||
private JmsConnectionWrapper getConnectionWrapper(String threadKey,
|
||||
JmsPooledConnection conn) {
|
||||
private JmsConnectionWrapper getConnectionWrapper(JmsPooledConnection conn) {
|
||||
synchronized (conn.getStateLock()) {
|
||||
if (conn.isValid()) {
|
||||
conn.setState(State.InUse);
|
||||
JmsConnectionWrapper ref = conn.createReference();
|
||||
if (ref != null) {
|
||||
conn.setKey(threadKey);
|
||||
synchronized (inUseConnections) {
|
||||
inUseConnections.put(threadKey, conn);
|
||||
inUseConnections.put(conn.getThread(), conn);
|
||||
}
|
||||
return ref;
|
||||
}
|
||||
|
@ -233,13 +206,13 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
}
|
||||
|
||||
public void removeConnectionFromPool(JmsPooledConnection conn) {
|
||||
String threadKey = conn.getKey();
|
||||
Thread thread = conn.getThread();
|
||||
boolean success = false;
|
||||
|
||||
// remove it from inUseConnections if it was in use, theoretically could
|
||||
// go by connection state, but may miss something due to threading
|
||||
synchronized (inUseConnections) {
|
||||
JmsPooledConnection inUse = inUseConnections.remove(threadKey);
|
||||
JmsPooledConnection inUse = inUseConnections.remove(thread);
|
||||
|
||||
// make sure the one we removed is indeed this connection, 99%
|
||||
// of time this is correct
|
||||
|
@ -254,7 +227,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
// really only here for bullet proofing code against bad
|
||||
// use of pool
|
||||
if (inUse != null) {
|
||||
inUseConnections.put(threadKey, inUse);
|
||||
inUseConnections.put(thread, inUse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -262,29 +235,24 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
// remove it from pendingConnections
|
||||
AvailableJmsPooledObject<JmsPooledConnection> pooledObj = null;
|
||||
synchronized (pendingConnections) {
|
||||
pooledObj = pendingConnections.remove(threadKey);
|
||||
pooledObj = pendingConnections.remove(thread);
|
||||
if (pooledObj != null) {
|
||||
if (pooledObj.getPooledObject() == conn) {
|
||||
// found conn, done
|
||||
return;
|
||||
} else {
|
||||
pendingConnections.put(threadKey, pooledObj);
|
||||
pendingConnections.put(thread, pooledObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remove it from availableConnections
|
||||
synchronized (availableConnections) {
|
||||
availableConnections.remove(conn);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean returnConnectionToPool(JmsPooledConnection conn) {
|
||||
boolean success = false;
|
||||
String threadKey = conn.getKey();
|
||||
Thread thread = conn.getThread();
|
||||
|
||||
synchronized (inUseConnections) {
|
||||
JmsPooledConnection inUse = inUseConnections.remove(threadKey);
|
||||
JmsPooledConnection inUse = inUseConnections.remove(thread);
|
||||
|
||||
// make sure the one we removed is indeed this connection, 99%
|
||||
// of time this is correct
|
||||
|
@ -296,7 +264,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
// really only here for bullet proofing code against bad
|
||||
// use of pool
|
||||
if (inUse != null) {
|
||||
inUseConnections.put(threadKey, inUse);
|
||||
inUseConnections.put(thread, inUse);
|
||||
statusHandler
|
||||
.handle(Priority.INFO,
|
||||
"Another connection already in use for this thread, not returning this connection to pool");
|
||||
|
@ -310,20 +278,17 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
AvailableJmsPooledObject<JmsPooledConnection> prev = null;
|
||||
synchronized (pendingConnections) {
|
||||
prev = pendingConnections
|
||||
.put(threadKey,
|
||||
.put(thread,
|
||||
new AvailableJmsPooledObject<JmsPooledConnection>(
|
||||
conn));
|
||||
}
|
||||
if (prev != null) {
|
||||
if ((prev != null) && (prev.getPooledObject() != conn)) {
|
||||
// there was a previous connection registered to
|
||||
// this thread, move it to available
|
||||
// this thread, close it
|
||||
statusHandler
|
||||
.handle(Priority.WARN,
|
||||
"Another connection already pooled for this thread, moving previous connection to available");
|
||||
prev.reset();
|
||||
synchronized (availableConnections) {
|
||||
availableConnections.add(prev);
|
||||
}
|
||||
"Another connection already pooled for this thread, closing previous connection");
|
||||
deadConnections.add(prev.getPooledObject());
|
||||
}
|
||||
} else {
|
||||
success = false;
|
||||
|
@ -333,11 +298,11 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
}
|
||||
|
||||
public void checkPooledResources() {
|
||||
long curTime = System.currentTimeMillis();
|
||||
List<AvailableJmsPooledObject<JmsPooledConnection>> connectionsToProcess = new LinkedList<AvailableJmsPooledObject<JmsPooledConnection>>();
|
||||
int connectionsClosed = 0;
|
||||
|
||||
// grab connections to move from pending to available
|
||||
long curTime = System.currentTimeMillis();
|
||||
|
||||
// check for connections to close
|
||||
synchronized (pendingConnections) {
|
||||
Iterator<AvailableJmsPooledObject<JmsPooledConnection>> iter = pendingConnections
|
||||
.values().iterator();
|
||||
|
@ -346,44 +311,22 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
.next();
|
||||
if (wrapper.expired(curTime, resourceRetention)) {
|
||||
iter.remove();
|
||||
connectionsToProcess.add(wrapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (availableConnections) {
|
||||
for (AvailableJmsPooledObject<JmsPooledConnection> wrapper : connectionsToProcess) {
|
||||
wrapper.reset();
|
||||
|
||||
// putting to available pool
|
||||
JmsPooledConnection conn = wrapper.getPooledObject();
|
||||
conn.setKey(null);
|
||||
availableConnections.add(wrapper);
|
||||
}
|
||||
}
|
||||
|
||||
connectionsToProcess.clear();
|
||||
|
||||
synchronized (availableConnections) {
|
||||
Iterator<AvailableJmsPooledObject<JmsPooledConnection>> iter = availableConnections
|
||||
.iterator();
|
||||
while (iter.hasNext()) {
|
||||
AvailableJmsPooledObject<JmsPooledConnection> wrapper = iter
|
||||
.next();
|
||||
// available sessions added based on time, so oldest is front of
|
||||
// queue
|
||||
if (wrapper.expired(curTime, connectionHoldTime)
|
||||
|| (availableConnections.size() > maxSpareConnections)) {
|
||||
// not immediately closing connection so that we minimize
|
||||
// time in sync block
|
||||
deadConnections.add(wrapper.getPooledObject());
|
||||
iter.remove();
|
||||
} else {
|
||||
// connections ordered in reverse order
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check for dead threads
|
||||
synchronized (inUseConnections) {
|
||||
Iterator<Map.Entry<Thread, JmsPooledConnection>> iter = inUseConnections
|
||||
.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Map.Entry<Thread, JmsPooledConnection> entry = iter.next();
|
||||
if (!entry.getKey().isAlive()) {
|
||||
iter.remove();
|
||||
deadConnections.add(entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (!deadConnections.isEmpty()) {
|
||||
|
@ -394,29 +337,29 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
}
|
||||
}
|
||||
|
||||
List<JmsPooledConnection> connectionsToCheck = null;
|
||||
ArrayList<JmsPooledConnection> connectionsToCheck = null;
|
||||
synchronized (inUseConnections) {
|
||||
connectionsToCheck = new ArrayList<JmsPooledConnection>(
|
||||
inUseConnections.values());
|
||||
}
|
||||
|
||||
int resourcesClosed = 0;
|
||||
for (JmsPooledConnection conn : connectionsToCheck) {
|
||||
resourcesClosed += conn.closeOldPooledResources(resourceRetention);
|
||||
}
|
||||
connectionsToCheck.clear();
|
||||
|
||||
// close pooled resources on pending connections
|
||||
synchronized (pendingConnections) {
|
||||
connectionsToProcess = new ArrayList<AvailableJmsPooledObject<JmsPooledConnection>>(
|
||||
pendingConnections.values());
|
||||
connectionsToCheck.ensureCapacity(pendingConnections.size());
|
||||
for (AvailableJmsPooledObject<JmsPooledConnection> wrapper : pendingConnections
|
||||
.values()) {
|
||||
connectionsToCheck.add(wrapper.getPooledObject());
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (availableConnections) {
|
||||
connectionsToProcess.addAll(availableConnections);
|
||||
}
|
||||
|
||||
for (AvailableJmsPooledObject<JmsPooledConnection> wrapper : connectionsToProcess) {
|
||||
resourcesClosed += wrapper.getPooledObject()
|
||||
.closeOldPooledResources(resourceRetention);
|
||||
for (JmsPooledConnection conn : connectionsToCheck) {
|
||||
resourcesClosed += conn.closeOldPooledResources(resourceRetention);
|
||||
}
|
||||
|
||||
if ((connectionsClosed > 0) || (resourcesClosed > 0)) {
|
||||
|
@ -429,33 +372,4 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the connectionHoldTime
|
||||
*/
|
||||
public int getConnectionHoldTime() {
|
||||
return connectionHoldTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param connectionHoldTime
|
||||
* the connectionHoldTime to set
|
||||
*/
|
||||
public void setConnectionHoldTime(int connectionHoldTime) {
|
||||
this.connectionHoldTime = connectionHoldTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the maxSpareConnections
|
||||
*/
|
||||
public int getMaxSpareConnections() {
|
||||
return maxSpareConnections;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param maxSpareConnections
|
||||
* the maxSpareConnections to set
|
||||
*/
|
||||
public void setMaxSpareConnections(int maxSpareConnections) {
|
||||
this.maxSpareConnections = maxSpareConnections;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,8 @@ import javax.jms.Destination;
|
|||
import javax.jms.JMSException;
|
||||
import javax.jms.MessageConsumer;
|
||||
|
||||
import org.apache.qpid.client.BasicMessageConsumer;
|
||||
|
||||
import com.raytheon.uf.common.jms.wrapper.JmsConsumerWrapper;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
|
@ -47,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 18, 2011 rjpeter Initial creation
|
||||
* Mar 08, 2012 194 njensen Improved logging
|
||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization
|
||||
* Apr 18, 2011 rjpeter Initial creation.
|
||||
* Mar 08, 2012 194 njensen Improved logging.
|
||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization.
|
||||
* Feb 07, 2014 2357 rjpeter Updated logging.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -87,6 +90,14 @@ public class JmsPooledConsumer {
|
|||
this.destKey = destKey;
|
||||
consumer = sess.getSession().createConsumer(destination,
|
||||
messageSelector);
|
||||
|
||||
if (consumer instanceof BasicMessageConsumer) {
|
||||
statusHandler.info("Creating AMQ consumer "
|
||||
+ ((BasicMessageConsumer) consumer).getDestination()
|
||||
.getQueueName()); // njensen
|
||||
} else {
|
||||
statusHandler.info("Creating consumer " + destKey); // njensen
|
||||
}
|
||||
}
|
||||
|
||||
public String getDestKey() {
|
||||
|
@ -164,7 +175,13 @@ public class JmsPooledConsumer {
|
|||
|
||||
if (close) {
|
||||
try {
|
||||
statusHandler.info("Closing consumer " + destKey); // njensen
|
||||
if (consumer instanceof BasicMessageConsumer) {
|
||||
statusHandler.info("Closing AMQ consumer "
|
||||
+ ((BasicMessageConsumer) consumer)
|
||||
.getDestination().getQueueName()); // njensen
|
||||
} else {
|
||||
statusHandler.info("Closing consumer " + destKey); // njensen
|
||||
}
|
||||
consumer.close();
|
||||
} catch (Throwable e) {
|
||||
statusHandler.handle(Priority.WARN, "Failed to close consumer "
|
||||
|
|
|
@ -25,6 +25,9 @@ import java.util.List;
|
|||
import javax.jms.JMSException;
|
||||
import javax.jms.MessageProducer;
|
||||
|
||||
import org.apache.qpid.client.AMQDestination;
|
||||
import org.apache.qpid.client.BasicMessageProducer;
|
||||
|
||||
import com.raytheon.uf.common.jms.wrapper.JmsProducerWrapper;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
|
@ -46,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 18, 2011 rjpeter Initial creation
|
||||
* Mar 08, 2012 194 njensen Improved logging
|
||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization
|
||||
* Apr 18, 2011 rjpeter Initial creation.
|
||||
* Mar 08, 2012 194 njensen Improved logging.
|
||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization.
|
||||
* Feb 07, 2014 2357 rjpeter Updated logging.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -84,6 +88,19 @@ public class JmsPooledProducer {
|
|||
this.sess = sess;
|
||||
this.destKey = destKey;
|
||||
this.producer = producer;
|
||||
if (producer instanceof BasicMessageProducer) {
|
||||
try {
|
||||
statusHandler.info("Creating AMQ producer "
|
||||
+ ((AMQDestination) ((BasicMessageProducer) producer)
|
||||
.getDestination()).getQueueName());
|
||||
} catch (Exception e) {
|
||||
statusHandler
|
||||
.error("Could not get producer destination for key "
|
||||
+ destKey, e);
|
||||
}
|
||||
} else {
|
||||
statusHandler.info("Creating producer " + destKey); // njensen
|
||||
}
|
||||
}
|
||||
|
||||
public String getDestKey() {
|
||||
|
@ -161,7 +178,14 @@ public class JmsPooledProducer {
|
|||
|
||||
if (close) {
|
||||
try {
|
||||
statusHandler.info("Closing producer " + destKey); // njensen
|
||||
if (producer instanceof BasicMessageProducer) {
|
||||
statusHandler
|
||||
.info("Closing AMQ producer "
|
||||
+ ((AMQDestination) ((BasicMessageProducer) producer)
|
||||
.getDestination()).getQueueName()); // njensen
|
||||
} else {
|
||||
statusHandler.info("Closing producer " + destKey); // njensen
|
||||
}
|
||||
producer.close();
|
||||
} catch (Throwable e) {
|
||||
statusHandler.handle(Priority.WARN, "Failed to close producer",
|
||||
|
|
|
@ -44,7 +44,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* can be released to the pool. Any exception will close pooled session instead
|
||||
* of returning to the pool. The consumers/producers are tracked in both active
|
||||
* and available states. An available consumer/producer can be reused by the
|
||||
* next client.
|
||||
* next client. Once a consumer has been closed the entire session is closed at
|
||||
* next opportunity since QPID tracks consumers at the session level. Not doing
|
||||
* this can leave a topic with no consumers on the qpid broker.
|
||||
*
|
||||
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
||||
* happen in a downward direction. A manager has a synchronized lock can make a
|
||||
|
@ -60,6 +62,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* Apr 15, 2011 rjpeter Initial creation
|
||||
* Mar 08, 2012 194 njensen Improved logging
|
||||
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario
|
||||
* Jan 26, 2014 2357 rjpeter Close a session when it has no producers or consumers.
|
||||
* Feb 07, 2014 2357 rjpeter Close session at next return to pool after a
|
||||
* consumer has closed.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -77,7 +82,7 @@ public class JmsPooledSession {
|
|||
|
||||
// The thread this session was most recently used by for tracking a pending
|
||||
// session that is being reserved for a given thread.
|
||||
private String threadKey;
|
||||
private final Thread thread;
|
||||
|
||||
private volatile boolean exceptionOccurred = false;
|
||||
|
||||
|
@ -85,6 +90,10 @@ public class JmsPooledSession {
|
|||
|
||||
private volatile State state = State.InUse;
|
||||
|
||||
// flag to stat that session should be closed instead of returned to pool on
|
||||
// next iteration
|
||||
private volatile boolean shouldClose = false;
|
||||
|
||||
// keeps track of number of creates vs. closes to know when it can be
|
||||
// returned to the pool
|
||||
private final List<JmsSessionWrapper> references = new ArrayList<JmsSessionWrapper>(
|
||||
|
@ -101,6 +110,8 @@ public class JmsPooledSession {
|
|||
public JmsPooledSession(JmsPooledConnection conn, Session sess) {
|
||||
this.conn = conn;
|
||||
this.sess = sess;
|
||||
this.thread = conn.getThread();
|
||||
statusHandler.info("Opening session: " + this.toString());
|
||||
}
|
||||
|
||||
public long getCreateTime() {
|
||||
|
@ -120,12 +131,8 @@ public class JmsPooledSession {
|
|||
return conn;
|
||||
}
|
||||
|
||||
public String getThreadKey() {
|
||||
return threadKey;
|
||||
}
|
||||
|
||||
public void setThreadKey(String threadKey) {
|
||||
this.threadKey = threadKey;
|
||||
public Thread getThread() {
|
||||
return thread;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
|
@ -436,6 +443,9 @@ public class JmsPooledSession {
|
|||
String destKey = consumer.getDestKey();
|
||||
boolean removed = false;
|
||||
|
||||
// a consumer was closed, close the session at next opportunity
|
||||
shouldClose = true;
|
||||
|
||||
synchronized (inUseConsumers) {
|
||||
JmsPooledConsumer inUse = inUseConsumers.remove(destKey);
|
||||
removed = inUse == consumer;
|
||||
|
@ -462,6 +472,7 @@ public class JmsPooledSession {
|
|||
}
|
||||
|
||||
if (canClose) {
|
||||
statusHandler.info("Closing session: " + this.toString());
|
||||
closePooledConsumersProducers();
|
||||
|
||||
// need to close down all wrappers
|
||||
|
@ -627,7 +638,7 @@ public class JmsPooledSession {
|
|||
}
|
||||
}
|
||||
|
||||
boolean valid = isValid();
|
||||
boolean valid = isValid() && !shouldClose && hasProducersOrConsumers();
|
||||
if (valid && returnToPool) {
|
||||
valid = conn.returnSessionToPool(this);
|
||||
}
|
||||
|
@ -654,4 +665,10 @@ public class JmsPooledSession {
|
|||
public Object getStateLock() {
|
||||
return stateLock;
|
||||
}
|
||||
|
||||
public boolean hasProducersOrConsumers() {
|
||||
return !inUseConsumers.isEmpty() || !inUseProducers.isEmpty()
|
||||
|| !availableConsumers.isEmpty()
|
||||
|| !availableProducers.isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,8 +37,9 @@ import com.raytheon.uf.common.jms.JmsPooledConsumer;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 18, 2011 rjpeter Initial creation
|
||||
* Apr 18, 2011 rjpeter Initial creation.
|
||||
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
||||
* Feb 07, 2014 2357 rjpeter Set linked exception in exception handling.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -124,8 +125,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in getMessageListener");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -144,8 +148,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in getMessageSelector");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -164,8 +171,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in receive");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -184,8 +194,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in receive(timeout)");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -204,8 +217,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in receiveNoWait");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -226,8 +242,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
|||
} catch (Throwable e) {
|
||||
exceptionOccurred = true;
|
||||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled consumer");
|
||||
"Exception occurred on pooled consumer in setMessageLister");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,9 +37,10 @@ import com.raytheon.uf.common.jms.JmsPooledProducer;
|
|||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Dec fi8, 2011 rjpeter Initial creation
|
||||
* Dec 08, 2011 rjpeter Initial creation.
|
||||
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
||||
* Jun 07, 2013 DR 16316 rjpeter Fix memory leak
|
||||
* Jun 07, 2013 DR 16316 rjpeter Fix memory leak.
|
||||
* Feb 07, 2014 2357 rjpeter Set linked exception in exception handling.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -122,6 +123,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -142,6 +146,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -162,6 +169,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -182,6 +192,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -202,6 +215,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -222,6 +238,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -242,6 +261,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -264,6 +286,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -285,6 +310,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -309,6 +337,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -329,6 +360,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -349,6 +383,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -369,6 +406,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -389,6 +429,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
@ -409,6 +452,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
|||
JMSException exc = new JMSException(
|
||||
"Exception occurred on pooled producer");
|
||||
exc.initCause(e);
|
||||
if (e instanceof Exception) {
|
||||
exc.setLinkedException((Exception) e);
|
||||
}
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,17 +15,6 @@
|
|||
<constructor-arg value="com.raytheon.uf.common.activetable"/>
|
||||
<constructor-arg ref="activeTableDatabaseProperties"/>
|
||||
</bean>
|
||||
<bean id="jms-activetable" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsActiveTableConfig" />
|
||||
<property name="taskExecutor" ref="activeTableMergeThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsActiveTableConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsConfig" factory-method="copy" />
|
||||
<bean id="activeTableMergeThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="2" />
|
||||
<property name="maxPoolSize" value="2" />
|
||||
</bean>
|
||||
<bean id="timeOffsetDecoder" class="com.raytheon.uf.edex.python.decoder.TimeOffsetDecoder">
|
||||
<property name="pluginName" value="warning" />
|
||||
<property name="pluginFQN" value="com.raytheon.edex.plugin.warning" />
|
||||
|
@ -46,7 +35,7 @@
|
|||
<to uri="jms-generic:topic:edex.alerts.vtec?timeToLive=60000" />
|
||||
</route>
|
||||
<route id="practiceVtecRoute">
|
||||
<from uri="jms-activetable:queue:practiceActiveTable?concurrentConsumers=1" />
|
||||
<from uri="jms-generic:queue:practiceActiveTable" />
|
||||
<doTry>
|
||||
<bean ref="activeTable" method="dumpProductToTempFile" />
|
||||
<bean ref="practiceWarningDecoder" method="decode" />
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
<from uri="jms-generic:queue:practiceNotify" />
|
||||
<doTry>
|
||||
<multicast parallelProcessing="false">
|
||||
<to uri="jms-warning:queue:edex.spcWatch" />
|
||||
<to uri="jms-warning:queue:edex.tpcWatch" />
|
||||
<to uri="jms-durable:queue:edex.spcWatch" />
|
||||
<to uri="jms-durable:queue:edex.tpcWatch" />
|
||||
</multicast>
|
||||
<doCatch>
|
||||
<exception>java.lang.Throwable</exception>
|
||||
|
|
|
@ -77,6 +77,7 @@ import com.raytheon.uf.edex.database.processor.IDatabaseProcessor;
|
|||
* Dec 10, 2013 2555 rjpeter Initial creation.
|
||||
* Jan 23, 2014 2555 rjpeter Updated to be a row at a time using ScrollableResults.
|
||||
* Feb 04, 2014 2770 rferrel The dumpPdos now dumps all PluginDataObjects.
|
||||
* Feb 12, 2014 2784 rjpeter Update logging for dup elim scenarios.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -194,6 +195,7 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
if (entriesInMemory > 0) {
|
||||
try {
|
||||
savePdoMap(pdosByFile);
|
||||
pdosByFile.clear();
|
||||
int prev = recordsSaved;
|
||||
recordsSaved += entriesInMemory;
|
||||
statusHandler.info(pluginName + ": Processed rows " + prev
|
||||
|
@ -436,74 +438,93 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
}
|
||||
|
||||
List<PersistableDataObject<?>> pdosFromDisk = readDataFromDisk(dataFile);
|
||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
||||
statusHandler.debug(pluginName + ": Checking "
|
||||
+ pdosFromDisk.size() + " old records from file: "
|
||||
+ dataFile.getAbsolutePath());
|
||||
}
|
||||
Iterator<PersistableDataObject<?>> pdoIter = pdosFromDisk
|
||||
.iterator();
|
||||
boolean needsUpdate = false;
|
||||
int dupsRemoved = 0;
|
||||
int index = 0;
|
||||
while (pdoIter.hasNext() && (index < dupElimUntil)) {
|
||||
PersistableDataObject<?> pdo = pdoIter.next();
|
||||
|
||||
if (identifierSet.contains(pdo.getIdentifier())) {
|
||||
pdoIter.remove();
|
||||
needsUpdate = true;
|
||||
dupsRemoved++;
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)
|
||||
&& (dupsRemoved > 0)) {
|
||||
statusHandler.debug(pluginName + ": Removed " + dupsRemoved
|
||||
+ " old records from file: "
|
||||
+ dataFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
if (!fileIter.hasNext() && (pdosFromDisk.size() < fetchSize)) {
|
||||
// last file, add more data to it
|
||||
needsUpdate = true;
|
||||
|
||||
if (prevFileStatus == null) {
|
||||
prevFileStatus = new FileStatus();
|
||||
prevFileStatus.dupElimUntilIndex = pdosFromDisk.size();
|
||||
prevFileStatus.fileFull = pdos.size() >= fetchSize;
|
||||
filesCreatedThisSession.put(dataFile.getAbsolutePath(),
|
||||
prevFileStatus);
|
||||
}
|
||||
|
||||
int numToAdd = fetchSize - pdosFromDisk.size();
|
||||
numToAdd = Math.min(numToAdd, pdos.size());
|
||||
|
||||
if (pdosFromDisk.size() > 0) {
|
||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
||||
statusHandler.debug(pluginName + ": Adding " + numToAdd
|
||||
+ " records to file: "
|
||||
statusHandler.debug(pluginName + ": Checking "
|
||||
+ pdosFromDisk.size()
|
||||
+ " old records from file: "
|
||||
+ dataFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
pdosFromDisk.addAll(pdos.subList(0, numToAdd));
|
||||
if (numToAdd < pdos.size()) {
|
||||
pdos = pdos.subList(numToAdd, pdos.size());
|
||||
} else {
|
||||
pdos = Collections.emptyList();
|
||||
}
|
||||
}
|
||||
Iterator<PersistableDataObject<?>> pdoIter = pdosFromDisk
|
||||
.iterator();
|
||||
int dupsRemoved = 0;
|
||||
int index = 0;
|
||||
boolean needsUpdate = false;
|
||||
|
||||
if (needsUpdate) {
|
||||
if (!pdosFromDisk.isEmpty()) {
|
||||
writeDataToDisk(dataFile, pdosFromDisk);
|
||||
if (prevFileStatus != null) {
|
||||
prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize;
|
||||
while (pdoIter.hasNext() && (index < dupElimUntil)) {
|
||||
PersistableDataObject<?> pdo = pdoIter.next();
|
||||
|
||||
if (identifierSet.contains(pdo.getIdentifier())) {
|
||||
pdoIter.remove();
|
||||
needsUpdate = true;
|
||||
dupsRemoved++;
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
if (dupsRemoved > 0) {
|
||||
statusHandler.info(pluginName + ": Removed "
|
||||
+ dupsRemoved + " old records from file: "
|
||||
+ dataFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
if (!fileIter.hasNext()
|
||||
&& (pdosFromDisk.size() < fetchSize)) {
|
||||
// last file, add more data to it
|
||||
needsUpdate = true;
|
||||
|
||||
if (prevFileStatus == null) {
|
||||
prevFileStatus = new FileStatus();
|
||||
prevFileStatus.dupElimUntilIndex = pdosFromDisk
|
||||
.size();
|
||||
prevFileStatus.fileFull = pdos.size() >= fetchSize;
|
||||
filesCreatedThisSession.put(
|
||||
dataFile.getAbsolutePath(), prevFileStatus);
|
||||
}
|
||||
|
||||
int numToAdd = fetchSize - pdosFromDisk.size();
|
||||
numToAdd = Math.min(numToAdd, pdos.size());
|
||||
|
||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
||||
statusHandler.debug(pluginName + ": Adding "
|
||||
+ numToAdd + " records to file: "
|
||||
+ dataFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
pdosFromDisk.addAll(pdos.subList(0, numToAdd));
|
||||
if (numToAdd < pdos.size()) {
|
||||
pdos = pdos.subList(numToAdd, pdos.size());
|
||||
} else {
|
||||
pdos = Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
if (needsUpdate) {
|
||||
if (!pdosFromDisk.isEmpty()) {
|
||||
writeDataToDisk(dataFile, pdosFromDisk);
|
||||
if (prevFileStatus != null) {
|
||||
prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize;
|
||||
}
|
||||
} else {
|
||||
|
||||
dirsToCheckNumbering.add(dataFile.getParentFile());
|
||||
if (dataFile.exists() && !dataFile.delete()) {
|
||||
statusHandler
|
||||
.error(pluginName
|
||||
+ ": Failed to delete file ["
|
||||
+ dataFile.getAbsolutePath()
|
||||
+ "], all entries have been updated in later files.");
|
||||
if (!dataFile.renameTo(new File(dataFile
|
||||
.getAbsoluteFile() + ".bad"))) {
|
||||
statusHandler.error(pluginName + ": file ["
|
||||
+ dataFile.getAbsoluteFile()
|
||||
+ "] cannot be renamed to .bad");
|
||||
}
|
||||
}
|
||||
fileIter.remove();
|
||||
}
|
||||
} else {
|
||||
dirsToCheckNumbering.add(dataFile.getParentFile());
|
||||
dataFile.delete();
|
||||
fileIter.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -543,7 +564,13 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
} finally {
|
||||
if (!successful) {
|
||||
// couldn't read in file, move it to bad
|
||||
file.renameTo(new File(file.getAbsoluteFile() + ".bad"));
|
||||
if (file.exists()
|
||||
&& !file.renameTo(new File(file.getAbsoluteFile()
|
||||
+ ".bad"))) {
|
||||
statusHandler.error(pluginName + ": file ["
|
||||
+ file.getAbsoluteFile()
|
||||
+ "] cannot be renamed to .bad");
|
||||
}
|
||||
}
|
||||
if (is != null) {
|
||||
try {
|
||||
|
@ -668,8 +695,9 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
writer = new BufferedWriter(new FileWriter(dumpFile));
|
||||
|
||||
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
|
||||
statusHandler.info(String.format("%s: Dumping records to: %s",
|
||||
pluginName, dumpFile.getAbsolutePath()));
|
||||
statusHandler.info(String.format("%s: Dumping " + pdos.size()
|
||||
+ " records to: %s", pluginName,
|
||||
dumpFile.getAbsolutePath()));
|
||||
}
|
||||
|
||||
while (pdoIter.hasNext()) {
|
||||
|
@ -753,6 +781,8 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
} while (size > 0);
|
||||
|
||||
DecimalFormat format = new DecimalFormat(formatString.toString());
|
||||
statusHandler.info("Checking file numbering consistency for "
|
||||
+ dir.getAbsolutePath());
|
||||
|
||||
for (Map.Entry<Integer, File> entry : fileMap.entrySet()) {
|
||||
int fileNum = entry.getKey();
|
||||
|
@ -771,7 +801,15 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
|||
}
|
||||
|
||||
File newFile = new File(oldFile.getParent(), newFileName);
|
||||
oldFile.renameTo(newFile);
|
||||
if (!oldFile.renameTo(newFile)) {
|
||||
statusHandler
|
||||
.error("Failed rename file "
|
||||
+ oldFile.getAbsolutePath()
|
||||
+ " to "
|
||||
+ newFile.getAbsolutePath()
|
||||
+ ". Stopping file number consistency checking.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
nextFileCount++;
|
||||
|
|
|
@ -58,6 +58,7 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory;
|
|||
* Nov 05, 2013 2499 rjpeter Repackaged, removed config files, always compresses hdf5.
|
||||
* Nov 11, 2013 2478 rjpeter Updated data store copy to always copy hdf5.
|
||||
* Dec 13, 2013 2555 rjpeter Refactored logic into DatabaseArchiveProcessor.
|
||||
* Feb 12, 2014 2784 rjpeter Fixed clusterLock to not update the time by default.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
|
@ -145,14 +146,16 @@ public class DatabaseArchiver implements IPluginArchiver {
|
|||
|
||||
// cluster lock, grabbing time of last successful archive
|
||||
CurrentTimeClusterLockHandler lockHandler = new CurrentTimeClusterLockHandler(
|
||||
CLUSTER_LOCK_TIMEOUT, dateFormat.format(runTime.getTime()),
|
||||
false);
|
||||
CLUSTER_LOCK_TIMEOUT, false);
|
||||
ClusterTask ct = ClusterLockUtils.lock(TASK_NAME, pluginName,
|
||||
lockHandler, false);
|
||||
if (!LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// keep extra info the same until processing updates the time.
|
||||
lockHandler.setExtraInfo(ct.getExtraInfo());
|
||||
|
||||
Calendar startTime = null;
|
||||
long timimgStartMillis = System.currentTimeMillis();
|
||||
int recordCount = 0;
|
||||
|
@ -226,12 +229,6 @@ public class DatabaseArchiver implements IPluginArchiver {
|
|||
.info(pluginName + ": Found no records to archive");
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
// previous run time needs to be reset
|
||||
if (startTime != null) {
|
||||
lockHandler
|
||||
.setExtraInfo(dateFormat.format(startTime.getTime()));
|
||||
}
|
||||
|
||||
statusHandler.error(pluginName + ": Error occurred archiving data",
|
||||
e);
|
||||
} finally {
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
autoStartup="false">
|
||||
<!-- Need to reroute to a queue to allow for multiple jms consumers -->
|
||||
<route id="cpgsrvTopicToQueueRoute">
|
||||
<from uri="jms-generic:topic:edex.alerts"/>
|
||||
<from uri="jms-generic:topic:edex.alerts?threadName=cpgsrv-edex.alerts"/>
|
||||
<!-- technically with qpid should be able to make this a durable subscription and not need to forward to another queue -->
|
||||
<doTry>
|
||||
<multicast>
|
||||
|
|
|
@ -3,21 +3,6 @@
|
|||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="jmsIngestHarvesterConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsGenericConfig" factory-method="copy">
|
||||
</bean>
|
||||
|
||||
<bean id="jms-harvester" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsIngestHarvesterConfig" />
|
||||
<property name="taskExecutor" ref="harvesterThreadPool" />
|
||||
</bean>
|
||||
|
||||
<bean id="harvesterThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="${metadata-process.threads}" />
|
||||
<property name="maxPoolSize" value="${metadata-process.threads}" />
|
||||
</bean>
|
||||
|
||||
<bean id="crawlerCommunicationStrategy" class="com.raytheon.uf.edex.datadelivery.harvester.crawler.FileCommunicationStrategy" />
|
||||
|
||||
<bean id="MetaDataProcessor" class="com.raytheon.uf.edex.datadelivery.harvester.CrawlMetaDataHandler" depends-on="registryInit,registerDataDeliveryHandlers,registryManagerInstanceInitializer">
|
||||
|
@ -29,11 +14,11 @@
|
|||
errorHandlerRef="errorHandler">
|
||||
|
||||
<endpoint id="metaDataCron" uri="quartz://datadelivery/harvester/?cron=${metadata-process.cron}"/>
|
||||
<endpoint id="harvesterProcessWorkEndpoint" uri="jms-harvester:queue:metaDataProcessWork?concurrentConsumers=${metadata-process.threads}"/>
|
||||
<endpoint id="harvesterProcessWorkEndpoint" uri="jms-generic:queue:metaDataProcessWork?concurrentConsumers=${metadata-process.threads}&threadName=harvester"/>
|
||||
|
||||
<route id="metaDataProcess">
|
||||
<from uri="metaDataCron" />
|
||||
<to uri="jms-harvester:queue:metaDataProcessWork" />
|
||||
<to uri="jms-generic:queue:metaDataProcessWork" />
|
||||
</route>
|
||||
|
||||
<route id="metaDataProcessWork">
|
||||
|
|
|
@ -8,19 +8,6 @@
|
|||
<bean id="handleoupDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
||||
<bean id="radarserverDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
||||
|
||||
<bean id="jms-dist" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<!-- All initial distribution queues are durable -->
|
||||
<constructor-arg ref="jmsDistConfig" />
|
||||
<property name="taskExecutor" ref="distributionThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsDistConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="distributionThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="7" />
|
||||
<property name="maxPoolSize" value="7" />
|
||||
</bean>
|
||||
|
||||
<camelContext id="distro"
|
||||
xmlns="http://camel.apache.org/schema/spring"
|
||||
errorHandlerRef="errorHandler"
|
||||
|
@ -29,7 +16,7 @@
|
|||
<endpoint id="refreshDistributionCron" uri="quartz://refreshDist/refreshDistRoute/?cron=${distribution.cron}"/>
|
||||
|
||||
<route id="distribution">
|
||||
<from uri="jms-dist:queue:external.dropbox?concurrentConsumers=5&maxConcurrentConsumers=5"/>
|
||||
<from uri="jms-durable:queue:external.dropbox?concurrentConsumers=5&maxConcurrentConsumers=5"/>
|
||||
<doTry>
|
||||
<bean ref="distributionSrv" method="route" />
|
||||
<doCatch>
|
||||
|
@ -40,7 +27,7 @@
|
|||
</route>
|
||||
|
||||
<route id="handleoupDistribution">
|
||||
<from uri="jms-dist:queue:handleoup.dropbox"/>
|
||||
<from uri="jms-durable:queue:handleoup.dropbox"/>
|
||||
<doTry>
|
||||
<bean ref="handleoupDistributionSrv" method="route" />
|
||||
<doCatch>
|
||||
|
@ -51,7 +38,7 @@
|
|||
</route>
|
||||
|
||||
<route id="radarserverDistribution">
|
||||
<from uri="jms-dist:queue:radarserver.dropbox" />
|
||||
<from uri="jms-durable:queue:radarserver.dropbox" />
|
||||
<doTry>
|
||||
<bean ref="radarserverDistributionSrv" method="route" />
|
||||
<doCatch>
|
||||
|
|
|
@ -0,0 +1,101 @@
|
|||
/**
|
||||
* This software was developed and / or modified by Raytheon Company,
|
||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
*
|
||||
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
* This software product contains export-restricted data whose
|
||||
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
* to non-U.S. persons whether in the United States or abroad requires
|
||||
* an export license or other authorization.
|
||||
*
|
||||
* Contractor Name: Raytheon Company
|
||||
* Contractor Address: 6825 Pine Street, Suite 340
|
||||
* Mail Stop B8
|
||||
* Omaha, NE 68106
|
||||
* 402.291.0100
|
||||
*
|
||||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
* further licensing information.
|
||||
**/
|
||||
package com.raytheon.uf.edex.esb.camel.jms;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.camel.Endpoint;
|
||||
import org.apache.camel.component.jms.JmsComponent;
|
||||
import org.apache.camel.component.jms.JmsEndpoint;
|
||||
|
||||
import com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor;
|
||||
|
||||
/**
|
||||
* Custom JMS component that makes dedicated thread pools for each JmsEndpoint
|
||||
* based on the concurrent consumers needed. Each pool is named based on the JMS
|
||||
* endpoint. Each endpoint also overrides the message listener container factory
|
||||
* to monitor the created containers to see if they need to be restarted in a
|
||||
* disconnect scenario.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 07, 2014 2357 rjpeter Initial creation.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
* @version 1.0
|
||||
*/
|
||||
public class DedicatedThreadJmsComponent extends JmsComponent {
|
||||
|
||||
public DedicatedThreadJmsComponent(
|
||||
org.apache.camel.component.jms.JmsConfiguration jmsconfig) {
|
||||
super(jmsconfig);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.apache.camel.component.jms.JmsComponent#createEndpoint(java.lang.
|
||||
* String, java.lang.String, java.util.Map)
|
||||
*/
|
||||
@Override
|
||||
protected Endpoint createEndpoint(String uri, String remaining,
|
||||
Map<String, Object> parameters) throws Exception {
|
||||
String threadName = (String) parameters.remove("threadName");
|
||||
Endpoint e = super.createEndpoint(uri, remaining, parameters);
|
||||
if (e instanceof JmsEndpoint) {
|
||||
JmsEndpoint jmsE = (JmsEndpoint) e;
|
||||
if ((threadName != null) && (threadName.length() > 0)
|
||||
&& !threadName.endsWith("-")) {
|
||||
threadName += "-";
|
||||
} else {
|
||||
threadName = jmsE.getDestinationName() + "-";
|
||||
}
|
||||
/*
|
||||
* This is used for a SimpleMessageListenerContainer use case.
|
||||
*
|
||||
* JmsSimpleMessageListenerTaskExecutor executor = new
|
||||
* JmsSimpleMessageListenerTaskExecutor(
|
||||
* jmsE.getConcurrentConsumers(), threadName);
|
||||
*/
|
||||
// DefaultMessageListenerContainer use case
|
||||
JmsThreadPoolTaskExecutor executor = new JmsThreadPoolTaskExecutor();
|
||||
executor.setThreadNamePrefix(threadName);
|
||||
executor.setCorePoolSize(jmsE.getConcurrentConsumers());
|
||||
executor.setMaxPoolSize(Math.max(jmsE.getConcurrentConsumers(),
|
||||
jmsE.getMaxConcurrentConsumers()));
|
||||
executor.setQueueCapacity(0);
|
||||
executor.afterPropertiesSet();
|
||||
|
||||
jmsE.setTaskExecutor(executor);
|
||||
jmsE.setMessageListenerContainerFactory(MonitoredDefaultMessageListenerContainerFactory
|
||||
.getInstance());
|
||||
|
||||
return jmsE;
|
||||
}
|
||||
throw new Exception(
|
||||
"JmsComponent did not create a JmsEnpoint. Check Camel Jms Override");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
/**
|
||||
* This software was developed and / or modified by Raytheon Company,
|
||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
*
|
||||
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
* This software product contains export-restricted data whose
|
||||
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
* to non-U.S. persons whether in the United States or abroad requires
|
||||
* an export license or other authorization.
|
||||
*
|
||||
* Contractor Name: Raytheon Company
|
||||
* Contractor Address: 6825 Pine Street, Suite 340
|
||||
* Mail Stop B8
|
||||
* Omaha, NE 68106
|
||||
* 402.291.0100
|
||||
*
|
||||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
* further licensing information.
|
||||
**/
|
||||
package com.raytheon.uf.edex.esb.camel.jms;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.apache.camel.component.jms.DefaultJmsMessageListenerContainer;
|
||||
import org.apache.camel.component.jms.JmsEndpoint;
|
||||
import org.apache.camel.component.jms.MessageListenerContainerFactory;
|
||||
import org.springframework.jms.listener.AbstractMessageListenerContainer;
|
||||
import org.springframework.jms.listener.DefaultMessageListenerContainer;
|
||||
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||
import com.raytheon.uf.edex.core.EDEXUtil;
|
||||
|
||||
/**
|
||||
* Creates DefaultMessageListenerContainer instances that are then monitored
|
||||
* once a minute for paused tasks. If a paused task is found the container is
|
||||
* restarted. This is necessary in broker restart scenarios.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 8, 2014 2357 rjpeter Initial creation.
|
||||
* </pre>
|
||||
*
|
||||
* @author rjpeter
|
||||
* @version 1.0
|
||||
*/
|
||||
public class MonitoredDefaultMessageListenerContainerFactory implements
|
||||
MessageListenerContainerFactory {
|
||||
private static final AtomicInteger threadCount = new AtomicInteger(1);
|
||||
|
||||
private final Collection<DefaultJmsMessageListenerContainer> containers = new ConcurrentLinkedQueue<DefaultJmsMessageListenerContainer>();
|
||||
|
||||
private final IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(MonitoredDefaultMessageListenerContainerFactory.class);
|
||||
|
||||
private static final MonitoredDefaultMessageListenerContainerFactory instance = new MonitoredDefaultMessageListenerContainerFactory();
|
||||
|
||||
public static MonitoredDefaultMessageListenerContainerFactory getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private MonitoredDefaultMessageListenerContainerFactory() {
|
||||
Thread containerChecker = new Thread("MessageListenerContainerMonitor-"
|
||||
+ threadCount.getAndIncrement()) {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Thread#run()
|
||||
*/
|
||||
@Override
|
||||
public void run() {
|
||||
while (!EDEXUtil.isRunning()) {
|
||||
try {
|
||||
Thread.sleep(TimeUtil.MILLIS_PER_MINUTE);
|
||||
} catch (InterruptedException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
for (DefaultMessageListenerContainer container : containers) {
|
||||
if (container.getPausedTaskCount() > 0) {
|
||||
StringBuilder msg = new StringBuilder(160);
|
||||
msg.append("Container[")
|
||||
.append(container.getDestinationName())
|
||||
.append("] has paused tasks. Container is ");
|
||||
if (!container.isRunning()) {
|
||||
msg.append("not ");
|
||||
}
|
||||
msg.append("running. Container is ");
|
||||
if (container.isActive()) {
|
||||
msg.append("not ");
|
||||
}
|
||||
msg.append("active. Restarting container.");
|
||||
statusHandler.warn(msg.toString());
|
||||
container.start();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(TimeUtil.MILLIS_PER_MINUTE);
|
||||
} catch (InterruptedException e) {
|
||||
// ignore
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
statusHandler
|
||||
.error("Error occurred in checking message listener containers",
|
||||
e);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
containerChecker.start();
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.apache.camel.component.jms.MessageListenerContainerFactory#
|
||||
* createMessageListenerContainer
|
||||
* (org.apache.camel.component.jms.JmsEndpoint)
|
||||
*/
|
||||
@Override
|
||||
public AbstractMessageListenerContainer createMessageListenerContainer(
|
||||
JmsEndpoint endpoint) {
|
||||
// track the container for monitoring in the case of a provider
|
||||
// reconnect
|
||||
DefaultJmsMessageListenerContainer container = new DefaultJmsMessageListenerContainer(
|
||||
endpoint);
|
||||
containers.add(container);
|
||||
return container;
|
||||
}
|
||||
|
||||
}
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
<!-- Begin Grid Process Route -->
|
||||
<route id="gridTopoNotificationRoute">
|
||||
<from uri="jms-generic:topic:edex.alerts" />
|
||||
<from uri="jms-generic:topic:edex.alerts?threadName=staticTopo-edex.alerts" />
|
||||
<doTry>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
<bean ref="staticDataGenerator" method="processNotification"/>
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
<bean id="dpaDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="dpa" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.dpa"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.dpa"/>
|
||||
</bean>
|
||||
|
||||
<bean id="dpaRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="dpa" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.dpa"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.dpa"/>
|
||||
</bean>
|
||||
|
||||
<camelContext id="dpa-camel"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<bean id="arealffgDistRegistry" class="com.raytheon.uf.edex.distribution.DistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="arealffg" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.arealffg" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.arealffg" />
|
||||
</bean>
|
||||
|
||||
<camelContext id="arealffg-camel"
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
<bean id="dhrDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="dhr" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.dhr"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.dhr"/>
|
||||
</bean>
|
||||
|
||||
<bean id="dhrRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="dhr" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.dhr"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.dhr"/>
|
||||
</bean>
|
||||
|
||||
<camelContext id="nonClusteredDHRroutes" xmlns="http://camel.apache.org/schema/spring"
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||
|
||||
<!-- IHFS Database Configuration-->
|
||||
<bean id="ihfsDbSessionConfig" class="com.raytheon.uf.edex.database.DatabaseSessionConfiguration">
|
||||
<property name="includes">
|
||||
<list>
|
||||
<value>com.raytheon.edex.plugin.shef</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
<bean id="ihfsSessionFactory"
|
||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||
|
||||
<property name="configLocation">
|
||||
<value>file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml</value>
|
||||
</property>
|
||||
<property name="databaseSessionConfiguration" ref="ihfsDbSessionConfig"/>
|
||||
</bean>
|
||||
|
||||
<bean id="ihfsTxManager"
|
||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||
<property name="sessionFactory" ref="ihfsSessionFactory" />
|
||||
</bean>
|
||||
|
||||
<!-- Dam Catalog Database Configuration-->
|
||||
<bean id="damSessionFactory"
|
||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||
<!-- No hibernate annotations should be loaded -->
|
||||
<property name="configLocation">
|
||||
<value>file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="damTxManager"
|
||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||
<property name="sessionFactory" ref="damSessionFactory" />
|
||||
</bean>
|
||||
</beans>
|
|
@ -1,42 +1,6 @@
|
|||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||
|
||||
<!-- IHFS Database Configuration-->
|
||||
<bean id="ihfsDbSessionConfig" class="com.raytheon.uf.edex.database.DatabaseSessionConfiguration">
|
||||
<property name="includes">
|
||||
<list>
|
||||
<value>com.raytheon.edex.plugin.shef</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
<bean id="ihfsSessionFactory"
|
||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||
|
||||
<property name="configLocation">
|
||||
<value>file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml</value>
|
||||
</property>
|
||||
<property name="databaseSessionConfiguration" ref="ihfsDbSessionConfig"/>
|
||||
</bean>
|
||||
|
||||
<bean id="ihfsTxManager"
|
||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||
<property name="sessionFactory" ref="ihfsSessionFactory" />
|
||||
</bean>
|
||||
|
||||
<!-- Dam Catalog Database Configuration-->
|
||||
<bean id="damSessionFactory"
|
||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||
<!-- No hibernate annotations should be loaded -->
|
||||
<property name="configLocation">
|
||||
<value>file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="damTxManager"
|
||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||
<property name="sessionFactory" ref="damSessionFactory" />
|
||||
</bean>
|
||||
|
||||
<bean id="mpeFieldGenService" class="com.raytheon.uf.edex.ohd.pproc.MpeFieldGenSrv" />
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<bean id="q2DistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="q2" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.q2"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.q2"/>
|
||||
</bean>
|
||||
|
||||
<camelContext id="q2Proc-context"
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
errorHandlerRef="errorHandler"
|
||||
autoStartup="false">
|
||||
<route id="satPreIngestRoute">
|
||||
<from uri="jms-generic:topic:edex.alerts"/>
|
||||
<from uri="jms-generic:topic:edex.alerts?threadName=satPreFilter-edex.alerts"/>
|
||||
<doTry>
|
||||
<pipeline>
|
||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="acarsDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="acarsPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.acars"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.acars"/>
|
||||
</bean>
|
||||
|
||||
<bean id="acarsCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<bean id="bufrascatDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="bufrascat" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrascat" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrascat" />
|
||||
</bean>
|
||||
|
||||
<bean id="bufrascatCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="bufrhdwDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrhdwPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrhdw"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrhdw"/>
|
||||
</bean>
|
||||
|
||||
<bean id="bufrhdwCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="bufrmthdwDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrmthdwPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrmthdw"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrmthdw"/>
|
||||
</bean>
|
||||
|
||||
<bean id="bufrmthdwCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="bufrncwfDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrncwfPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrncwf"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrncwf"/>
|
||||
</bean>
|
||||
|
||||
<bean id="bufrncwfCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<bean id="bufrquikscatDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrquikscatPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrquikscat"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrquikscat"/>
|
||||
</bean>
|
||||
|
||||
<bean id="bufrquikscatCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<bean id="bufrsigwxDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrsigwxPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrsigwx" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrsigwx" />
|
||||
</bean>
|
||||
|
||||
<bean id="bufrsigwxCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<bean id="bufrssmiDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="bufrssmiPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.bufrssmi"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.bufrssmi"/>
|
||||
</bean>
|
||||
|
||||
<bean id="bufrssmiCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="cwaDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="cwaPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.cwa" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.cwa" />
|
||||
</bean>
|
||||
|
||||
<bean id="cwaCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<bean id="ldadmesonetDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="ldadmesonet" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.ldadmesonet"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.ldadmesonet"/>
|
||||
</bean>
|
||||
|
||||
<bean id="ldadmesonetPointData" class="com.raytheon.uf.common.dataplugin.ldadmesonet.LdadmesonetPointDataTransform"/>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<bean id="loctablesDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="loctablesPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.loctables" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.loctables" />
|
||||
</bean>
|
||||
|
||||
<camelContext id="loctables-camel"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="lsrDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="lclstrmrptPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.lsr" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.lsr" />
|
||||
</bean>
|
||||
|
||||
<bean id="lclstrmrptCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="crimssDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="crimssPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.crimss" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.crimss" />
|
||||
</bean>
|
||||
|
||||
<bean id="crimssCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<bean id="nucapsDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="nucapsPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.nucaps" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.nucaps" />
|
||||
</bean>
|
||||
|
||||
<bean id="nucapsCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -2,22 +2,12 @@
|
|||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="viirsThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
|
||||
<bean id="jms-viirs" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsViirsConfig" />
|
||||
<property name="taskExecutor" ref="viirsThreadPool" />
|
||||
</bean>
|
||||
<bean id="jmsViirsConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="viirsDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="viirsPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.VIIRS" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.VIIRS" />
|
||||
</bean>
|
||||
|
||||
<bean id="viirsCamelRegistered" factory-bean="contextManager"
|
||||
|
@ -40,7 +30,7 @@
|
|||
|
||||
<!-- Begin VIIRS routes -->
|
||||
<route id="viirsIngestRoute">
|
||||
<from uri="jms-viirs:queue:Ingest.VIIRS"/>
|
||||
<from uri="jms-durable:queue:Ingest.VIIRS"/>
|
||||
<doTry>
|
||||
<pipeline>
|
||||
<bean ref="stringToFile" />
|
||||
|
|
|
@ -3,26 +3,14 @@
|
|||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||
|
||||
<bean id="jms-satellite-mcidas" class="org.apache.camel.component.jms.JmsComponent">
|
||||
<constructor-arg ref="jmsSatelliteMcidasConfig" />
|
||||
<property name="taskExecutor" ref="satelliteMcidasThreadPool" />
|
||||
</bean>
|
||||
<bean id="satelliteMcidasThreadPool"
|
||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||
<property name="corePoolSize" value="1" />
|
||||
<property name="maxPoolSize" value="1" />
|
||||
</bean>
|
||||
<bean id="jmsSatelliteMcidasConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
||||
<bean id="satelliteMcidasDecoder" class="com.raytheon.uf.edex.plugin.satellite.mcidas.McidasSatelliteDecoder">
|
||||
</bean>
|
||||
|
||||
<bean id="satMcidasDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg value="satellite.mcidas" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.Satellite.Mcidas" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.Satellite.Mcidas" />
|
||||
</bean>
|
||||
|
||||
<bean id="satelliteMcidasDecoder" class="com.raytheon.uf.edex.plugin.satellite.mcidas.McidasSatelliteDecoder"/>
|
||||
|
||||
<bean id="satMcidasCamelRegistered" factory-bean="contextManager"
|
||||
factory-method="register" depends-on="persistCamelRegistered">
|
||||
<constructor-arg ref="sat-mcidas-camel"/>
|
||||
|
@ -35,7 +23,7 @@
|
|||
|
||||
<!-- Begin McIDAS Sat routes -->
|
||||
<route id="satMcidasIngestRoute">
|
||||
<from uri="jms-satellite-mcidas:queue:Ingest.Satellite.Mcidas" />
|
||||
<from uri="jms-durable:queue:Ingest.Satellite.Mcidas" />
|
||||
<setHeader headerName="pluginName">
|
||||
<constant>satellite-mcidas</constant>
|
||||
</setHeader>
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="svrwxDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="svrwxPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.svrwx" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.svrwx" />
|
||||
</bean>
|
||||
|
||||
<bean id="svrwxCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="tcgDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="tcgPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.tcg"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.tcg"/>
|
||||
</bean>
|
||||
|
||||
<bean id="tcgCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="tcsDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="tcsPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.tcs" />
|
||||
<constructor-arg value="jms-durable:queue:Ingest.tcs" />
|
||||
</bean>
|
||||
|
||||
<bean id="tcsCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<bean id="vaaDistRegistry" factory-bean="distributionSrv"
|
||||
factory-method="register">
|
||||
<constructor-arg ref="vaaPluginName" />
|
||||
<constructor-arg value="jms-dist:queue:Ingest.vaa"/>
|
||||
<constructor-arg value="jms-durable:queue:Ingest.vaa"/>
|
||||
</bean>
|
||||
|
||||
<bean id="vaaCamelRegistered" factory-bean="contextManager"
|
||||
|
|
|
@ -1,32 +1,3 @@
|
|||
/**
|
||||
* AirmetRecord
|
||||
*
|
||||
* This java class performs the mapping to the database table for AIRMET
|
||||
*
|
||||
* HISTORY
|
||||
*
|
||||
* Date Author Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 05/2009 L. Lin Initial creation
|
||||
*
|
||||
* This code has been developed by the SIB for use in the AWIPS2 system.
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 05/2009 39 L. Lin Initial coding
|
||||
* 07/2009 39 L. Lin Migration to TO11
|
||||
* 09/2011 Chin Chen changed to improve purge performance and
|
||||
* removed xml serialization as well
|
||||
* Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime
|
||||
* Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation.
|
||||
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
||||
* PluginDataObject.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* This code has been developed by the SIB for use in the AWIPS2 system.
|
||||
*/
|
||||
|
||||
package gov.noaa.nws.ncep.common.dataplugin.airmet;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
@ -53,6 +24,37 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI;
|
|||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||
|
||||
/**
|
||||
* AirmetRecord
|
||||
*
|
||||
* This java class performs the mapping to the database table for AIRMET
|
||||
*
|
||||
* <pre>
|
||||
* HISTORY
|
||||
*
|
||||
* Date Author Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 05/2009 L. Lin Initial creation
|
||||
*
|
||||
* This code has been developed by the SIB for use in the AWIPS2 system.
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 05/2009 39 L. Lin Initial coding
|
||||
* 07/2009 39 L. Lin Migration to TO11
|
||||
* 09/2011 Chin Chen changed to improve purge performance and
|
||||
* removed xml serialization as well
|
||||
* Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime
|
||||
* Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation.
|
||||
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
||||
* PluginDataObject.
|
||||
* Feb 11, 2014 2784 rferrel Remove override of setIdentifier.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* This code has been developed by the SIB for use in the AWIPS2 system.
|
||||
*/
|
||||
|
||||
@Entity
|
||||
@SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "airmetseq")
|
||||
@Table(name = "airmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) })
|
||||
|
@ -319,24 +321,6 @@ public class AirmetRecord extends PluginDataObject {
|
|||
*/
|
||||
public void addAirmetReport(AirmetReport curReport) {
|
||||
airmetReport.add(curReport);
|
||||
// curReport.setParentID(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override existing set method to modify any classes that use the dataURI
|
||||
* as a foreign key
|
||||
*/
|
||||
@Override
|
||||
public void setIdentifier(Object dataURI) {
|
||||
|
||||
this.identifier = dataURI;
|
||||
/*
|
||||
* if(this.getAirmetReport() != null && this.getAirmetReport().size() >
|
||||
* 0) { for (Iterator<AirmetReport> iter =
|
||||
* this.getAirmetReport().iterator(); iter.hasNext();) { AirmetReport cs
|
||||
* = iter.next(); cs.setParentID(this); } }
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue