in JSPUI the org.dspace.app.webui.servlet.FeedServlet :
*****
// how many days to keep a feed in cache before checking currency
private static int cacheAge = 0;
...
cacheAge = ConfigurationManager.getIntProperty("webui.feed.cache.age");
...
// Is the feed current?
boolean cacheFeedCurrent = false;
if (cFeed.timeStamp + (cacheAge * HOUR_MSECS) < System.currentTimeMillis())
{
cacheFeedCurrent = true;
}
// Not current, but have any items changed since feed was created/last
checked?
else if ( ! itemsChanged(context, dso, cFeed.timeStamp))
{
// no items have changed, re-stamp feed and use it
cFeed.timeStamp = System.currentTimeMillis();
cacheFeedCurrent = true;
}
...
*****
in my dspace.cfg webui.feed.cache.age = 2
=> cacheAge = 2 hours
1) When I started the server at 2013-08-20T08:00:00Z am and I checked
the rss feed at 2013-08-20T08:01:00Z, cFeed.timeStamp = 2013-08-20T08:01:00Z
If nobody click on the RSS link before 11am,
the line
"if (cFeed.timeStamp + (cacheAge * HOUR_MSECS) <
System.currentTimeMillis())"
is equivalent to
"if (2013-08-20T08:01:00Z + 2 hours < 2013-08-20T11:00:00Z)"
which is always true and the FeedServlet sends the feed that was cached
at 2013-08-20T08:01:00Z
I think the code should be :
****
if (cFeed.timeStamp + (cacheAge * HOUR_MSECS) >
System.currentTimeMillis()) {...}
****
2) If we assume that the first "if" (see above) gives false, the servlet
calls the function itemsChanged()
in function itemsChanged, we call
Harvest.harvest(context, dso, startDate, endDate,
0, 1, !includeAll, false, false,
includeAll).size() > 0)
where startDate and endDate are truncated date ( "startDate =
dcStartDate.toString().substring(0, 10)")
in this case, in my example, we call
Harvest.harvest(context, dso, 2013-08-20T00:00:00Z,
2013-08-20T00:00:00Z,
0, 1, !includeAll, false, false,
includeAll).size() > 0)
If new items are archived in the repository (e.g: archived at
2013-08-20T10:30:00Z) we don't see this items in the rss feed because
"itemsChanged(context, dso, cFeed.timeStamp)" return false and the
FeedServlet sends the feed that was cached at 2013-08-20T08:01:00Z
I think the code of the function "itemsChanged" should be :
****
private boolean itemsChanged(Context context, DSpaceObject dso,
long timeStamp)
throws SQLException
{
// construct start and end dates
DCDate dcStartDate = new DCDate( new Date(timeStamp) );
DCDate dcEndDate = new DCDate( new
Date(System.currentTimeMillis()) );
// // convert dates to ISO 8601, stripping the time
// String startDate = dcStartDate.toString().substring(0, 10);
// String endDate = dcEndDate.toString().substring(0, 10);
// this invocation should return a non-empty list if even 1
item has changed
try {
return (Harvest.harvest(context, dso,
dcStartDate.toString(), dcEndDate.toString(),
0, 1, !includeAll, false, false,
includeAll).size() > 0);
}
catch (ParseException pe)
{
// This should never get thrown as we have generated the
dates ourselves
return false;
}
}
****
Cheers
Fabian Smagghe
University of Liège
Belgium
http://orbi.ulg.ac.be
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and
AppDynamics. Performance Central is your source for news, insights,
analysis and resources for efficient Application Performance Management.
Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
DSpace-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dspace-tech
List Etiquette: https://wiki.duraspace.org/display/DSPACE/Mailing+List+Etiquette