You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/05/28 15:30:01 UTC
svn commit: r1598011 - in /jena/Experimental/jena-fuseki2: ./ docs/
src/main/java/org/apache/jena/fuseki/mgt/
Author: andy
Date: Wed May 28 13:30:00 2014
New Revision: 1598011
URL: http://svn.apache.org/r1598011
Log:
Background tasks set the Location: header with a server relative URL to the task created.
Added:
jena/Experimental/jena-fuseki2/D.trig
jena/Experimental/jena-fuseki2/backup (with props)
jena/Experimental/jena-fuseki2/dwim (with props)
Modified:
jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java
Added: jena/Experimental/jena-fuseki2/D.trig
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/D.trig?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/D.trig (added)
+++ jena/Experimental/jena-fuseki2/D.trig Wed May 28 13:30:00 2014
@@ -0,0 +1,3 @@
+prefix : <http://example/>
+
+:g { :s :p :o }
Added: jena/Experimental/jena-fuseki2/backup
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/backup?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/backup (added)
+++ jena/Experimental/jena-fuseki2/backup Wed May 28 13:30:00 2014
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+DB="ds"
+
+curl -v -XPOST 'http://localhost:3030/$/sleep?interval=10000'
+
+curl -v 'http://localhost:3030/$/tasks
\ No newline at end of file
Propchange: jena/Experimental/jena-fuseki2/backup
------------------------------------------------------------------------------
svn:executable = *
Modified: jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md (original)
+++ jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md Wed May 28 13:30:00 2014
@@ -43,6 +43,7 @@ Further operations may be added within t
| <tt>GET</tt> | `/$/stats/*{name}*` | |
||
| <tt>POST</tt> | `/$/backup/*{name}*` | |
+| <tt>POST</tt> | `/$/sleep` | |
||
| <tt>GET</tt> | `/$/tasks/` | |
| <tt>GET</tt> | `/$/tasks/*{name}*` | |
@@ -145,16 +146,51 @@ Pattern: `/$/backup/*{name}*`
This operation initiates a backup and returns a JSON object with the task Id in it.
-Backups are written to the sever local directory 'backups' as gzip-compressed N-Quads files.
+Backups are written to the server local directory 'backups' as gzip-compressed N-Quads files.
See [Tasks](#tasks) for how to monitor a backups progress.
-### Tasks
+## Tasks
+Some operations cause a backgrond task to be executed, backup is an example.
+The result of such operations includes a json object with teh task id and
+also a `Location:` header with the URL of the task created.
+
+The progress of the task can be monitored with HTTP GET operations:
+
Pattern: `/$/tasks` – All asynchronous tasks.<br/>
-Pattern: `/$/tasks/*{taskId}*` – All asynchronous tasks.
+Pattern: `/$/tasks/*{taskId}*` – A particular task.
-Background tasks, such as 'backup', can be monitored by polling. The URL `/$/tasks` returns a description of all running and recently tasks. A finished task can be indentified by having a "finishPoint" field.
+The URL `/$/tasks` returns a description of all running and recently tasks. A finished task can be identified by having a "finishPoint" field.
Each background task has an id. The URL `/$/tasks/*{taskId}*` gets a description about one single task.
-Details of the last few completed tasks are retained, up to a fixed number. The records will eventually be removed as laters taks complete, and the task URL will then return 404.
+Details of the last few completed tasks are retained, up to a fixed number. The records will eventually be removed as later tasks complete, and the task URL will then return 404.
+
+Pattern: `/$/tasks` ; example:
+```
+[ {
+ "finished" : "2014-05-28T12:52:51.860+01:00" ,
+ "started" : "2014-05-28T12:52:50.859+01:00" ,
+ "task" : "sleep" ,
+ "taskId" : "1"
+ } ,
+ {
+ "finished" : "2014-05-28T12:53:24.718+01:00" ,
+ "started" : "2014-05-28T12:53:14.717+01:00" ,
+ "task" : "sleep" ,
+ "taskId" : "2"
+ }
+]
+```
+Pattern: `/$/tasks/1` : example:
+```
+[ {
+ "finished" : "2014-05-28T13:54:13.608+01:00" ,
+ "started" : "2014-05-28T13:54:03.607+01:00" ,
+ "task" : "backup" ,
+ "taskId" : "1"
+ }
+]
+```
+This is inside an array to make the format returned the same as `/$/tasks`.
+
Added: jena/Experimental/jena-fuseki2/dwim
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/dwim?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/dwim (added)
+++ jena/Experimental/jena-fuseki2/dwim Wed May 28 13:30:00 2014
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+
+curl -XPOST --header "Content-type: text/trig" --data-binary @D.trig \
+ http://localhost:3030/ds/data
Propchange: jena/Experimental/jena-fuseki2/dwim
------------------------------------------------------------------------------
svn:executable = *
Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java Wed May 28 13:30:00 2014
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRes
import org.apache.jena.atlas.json.JsonValue ;
import org.apache.jena.atlas.lib.InternalErrorException ;
import org.apache.jena.fuseki.async.AsyncPool ;
+import org.apache.jena.fuseki.async.AsyncTask ;
import org.apache.jena.fuseki.servlets.HttpAction ;
import org.apache.jena.fuseki.servlets.ServletOps ;
@@ -55,7 +56,17 @@ public abstract class ActionAsyncTask ex
final
protected JsonValue execPostItem(HttpAction action) {
Runnable task = createRunnable(action) ;
- return Async.asyncTask(asyncPool, "backup", action.getDataService(), task) ;
+ AsyncTask aTask = Async.execASyncTask(action, AsyncPool.get(), "backup", task) ;
+ Async.setLocationHeader(action, aTask);
+ return Async.asJson(aTask) ;
+ }
+
+ public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable task) {
+ AsyncTask atask = Async.asyncTask(asyncPool, displayName, action.getDataService(), task) ;
+ Async.setLocationHeader(action, atask);
+ JsonValue v = Async.asJson(atask) ;
+ ServletOps.sendJsonReponse(action, v);
+ return atask ;
}
protected abstract Runnable createRunnable(HttpAction action) ;
Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java Wed May 28 13:30:00 2014
@@ -26,12 +26,13 @@ import javax.servlet.http.HttpServletRes
import org.apache.jena.atlas.json.JsonValue ;
import org.apache.jena.atlas.lib.Lib ;
import org.apache.jena.fuseki.async.AsyncPool ;
+import org.apache.jena.fuseki.async.AsyncTask ;
import org.apache.jena.fuseki.servlets.HttpAction ;
import org.apache.jena.fuseki.servlets.ServletOps ;
import org.slf4j.Logger ;
/** A task that kicks off a asynchornous operation that simply waits and exits. For testing. */
-public class ActionSleep extends ActionCtl
+public class ActionSleep extends ActionCtl /* Not ActionAsyncTask - that is a container */
{
public ActionSleep() { super() ; }
@@ -44,7 +45,9 @@ public class ActionSleep extends ActionC
@Override
protected void perform(HttpAction action) {
Runnable task = createRunnable(action) ;
- JsonValue v = Async.asyncTask(AsyncPool.get(), "sleep", null, task) ;
+ AsyncTask aTask = Async.execASyncTask(action, AsyncPool.get(), "sleep", task) ;
+ JsonValue v = Async.asJson(aTask) ;
+ Async.setLocationHeader(action, aTask);
ServletOps.sendJsonReponse(action, v);
}
Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java Wed May 28 13:30:00 2014
@@ -18,21 +18,51 @@
package org.apache.jena.fuseki.mgt;
+import org.apache.http.HttpHeaders ;
import org.apache.jena.atlas.json.JsonBuilder ;
import org.apache.jena.atlas.json.JsonValue ;
import org.apache.jena.fuseki.async.AsyncPool ;
import org.apache.jena.fuseki.async.AsyncTask ;
import org.apache.jena.fuseki.server.DataService ;
+import org.apache.jena.fuseki.servlets.HttpAction ;
public class Async
{
- public static JsonValue asyncTask(AsyncPool asyncPool, String displayName, DataService dataService, Runnable task) {
+ public static AsyncTask asyncTask(AsyncPool asyncPool, String displayName, DataService dataService, Runnable task) {
AsyncTask asyncTask = asyncPool.submit(task, displayName, dataService) ;
+ return asyncTask ;
+ }
+
+ public static JsonValue asJson(AsyncTask asyncTask) {
JsonBuilder builder = new JsonBuilder() ;
builder.startObject("outer") ;
builder.key(JsonConst.taskId).value(asyncTask.getTaskId()) ;
builder.finishObject("outer") ;
return builder.build() ;
}
+
+ public static void setLocationHeader(HttpAction action, AsyncTask asyncTask) {
+ String x = action.getRequest().getRequestURI() ;
+ if ( ! x.endsWith("/") )
+ x += "/" ;
+ x += asyncTask.getTaskId() ;
+ //String x = "/$/tasks/"+asyncTask.getTaskId() ;
+ action.getResponse().setHeader(HttpHeaders.LOCATION, x) ;
+ }
+
+ public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable runnable) {
+ AsyncTask atask = Async.asyncTask(asyncPool, "backup", action.getDataService(), runnable) ;
+ Async.setLocationHeader(action, atask);
+ return atask ;
+ }
+
+ // Combined does not work very well - e.g sleep does not set Location.
+// public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable task) {
+// AsyncTask atask = Async.asyncTask(asyncPool, displayName, action.getDataService(), task) ;
+// Async.setLocationHeader(action, atask);
+// JsonValue v = Async.asJson(atask) ;
+// ServletOps.sendJsonReponse(action, v);
+// return atask ;
+// }
}