Search in sources :

Example 1 with DistributionQueueItem

use of org.apache.sling.distribution.queue.DistributionQueueItem in project sling by apache.

the class SimpleDistributionQueue method getState.

@Nonnull
private DistributionQueueState getState() {
    DistributionQueueItem firstItem = queue.peek();
    DistributionQueueItemStatus firstItemStatus = firstItem != null ? statusMap.get(firstItem) : null;
    return DistributionQueueUtils.calculateState(firstItem, firstItemStatus);
}
Also used : DistributionQueueItemStatus(org.apache.sling.distribution.queue.DistributionQueueItemStatus) DistributionQueueItem(org.apache.sling.distribution.queue.DistributionQueueItem) Nonnull(javax.annotation.Nonnull)

Example 2 with DistributionQueueItem

use of org.apache.sling.distribution.queue.DistributionQueueItem in project sling by apache.

the class SimpleDistributionQueueCheckpoint method run.

@Override
public void run() {
    String fileName = queue.getName() + "-checkpoint";
    File checkpointFile = new File(checkpointDirectory, fileName + "-new");
    log.debug("started checkpointing");
    try {
        if (checkpointFile.exists()) {
            assert checkpointFile.delete();
        }
        assert checkpointFile.createNewFile();
        Collection<String> lines = new LinkedList<String>();
        FileOutputStream fileOutputStream = new FileOutputStream(checkpointFile);
        for (DistributionQueueEntry queueEntry : queue.getItems(0, -1)) {
            DistributionQueueItem item = queueEntry.getItem();
            String packageId = item.getPackageId();
            StringWriter w = new StringWriter();
            JsonGenerator jsonWriter = Json.createGenerator(w);
            jsonWriter.writeStartObject();
            for (Map.Entry<String, Object> entry : item.entrySet()) {
                Object value = entry.getValue();
                boolean isArray = value instanceof String[];
                if (isArray) {
                    jsonWriter.writeStartArray(entry.getKey());
                    for (String s : ((String[]) value)) {
                        jsonWriter.write(s);
                    }
                    jsonWriter.writeEnd();
                } else {
                    jsonWriter.write(entry.getKey(), (String) value);
                }
            }
            jsonWriter.writeEnd();
            jsonWriter.close();
            lines.add(packageId + " " + w.toString());
        }
        log.debug("parsed {} items", lines.size());
        IOUtils.writeLines(lines, Charset.defaultCharset().name(), fileOutputStream, Charset.defaultCharset());
        fileOutputStream.flush();
        fileOutputStream.close();
        boolean success = checkpointFile.renameTo(new File(checkpointDirectory, fileName));
        log.debug("checkpoint succeeded: {}", success);
    } catch (Exception e) {
        log.error("failed checkpointing for queue {}", queue.getName());
    }
}
Also used : DistributionQueueEntry(org.apache.sling.distribution.queue.DistributionQueueEntry) LinkedList(java.util.LinkedList) DistributionQueueItem(org.apache.sling.distribution.queue.DistributionQueueItem) StringWriter(java.io.StringWriter) FileOutputStream(java.io.FileOutputStream) JsonGenerator(javax.json.stream.JsonGenerator) File(java.io.File) Map(java.util.Map)

Example 3 with DistributionQueueItem

use of org.apache.sling.distribution.queue.DistributionQueueItem in project sling by apache.

the class SimpleDistributionQueueProvider method enableQueueProcessing.

public void enableQueueProcessing(@Nonnull DistributionQueueProcessor queueProcessor, String... queueNames) {
    if (checkpoint) {
        // recover from checkpoints
        log.debug("recovering from checkpoints if needed");
        for (final String queueName : queueNames) {
            log.debug("recovering for queue {}", queueName);
            DistributionQueue queue = getQueue(queueName);
            FilenameFilter filenameFilter = new FilenameFilter() {

                @Override
                public boolean accept(File file, String name) {
                    return name.equals(queueName + "-checkpoint");
                }
            };
            for (File qf : checkpointDirectory.listFiles(filenameFilter)) {
                log.info("recovering from checkpoint {}", qf);
                try {
                    LineIterator lineIterator = IOUtils.lineIterator(new FileReader(qf));
                    while (lineIterator.hasNext()) {
                        String s = lineIterator.nextLine();
                        String[] split = s.split(" ");
                        String id = split[0];
                        String infoString = split[1];
                        Map<String, Object> info = new HashMap<String, Object>();
                        JsonReader reader = Json.createReader(new StringReader(infoString));
                        JsonObject jsonObject = reader.readObject();
                        for (Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
                            if (entry.getValue().getValueType().equals(JsonValue.ValueType.ARRAY)) {
                                JsonArray value = jsonObject.getJsonArray(entry.getKey());
                                String[] a = new String[value.size()];
                                for (int i = 0; i < a.length; i++) {
                                    a[i] = value.getString(i);
                                }
                                info.put(entry.getKey(), a);
                            } else if (JsonValue.NULL.equals(entry.getValue())) {
                                info.put(entry.getKey(), null);
                            } else {
                                info.put(entry.getKey(), ((JsonString) entry.getValue()).getString());
                            }
                        }
                        queue.add(new DistributionQueueItem(id, info));
                    }
                    log.info("recovered {} items from queue {}", queue.getStatus().getItemsCount(), queueName);
                } catch (FileNotFoundException e) {
                    log.warn("could not read checkpoint file {}", qf.getAbsolutePath());
                } catch (JsonException e) {
                    log.warn("could not parse info from checkpoint file {}", qf.getAbsolutePath());
                }
            }
        }
        // enable checkpointing
        for (String queueName : queueNames) {
            ScheduleOptions options = scheduler.NOW(-1, 15).canRunConcurrently(false).name(getJobName(queueName + "-checkpoint"));
            scheduler.schedule(new SimpleDistributionQueueCheckpoint(getQueue(queueName), checkpointDirectory), options);
        }
    }
    // enable processing
    for (String queueName : queueNames) {
        ScheduleOptions options = scheduler.NOW(-1, 1).canRunConcurrently(false).name(getJobName(queueName));
        scheduler.schedule(new SimpleDistributionQueueProcessor(getQueue(queueName), queueProcessor), options);
    }
}
Also used : JsonException(javax.json.JsonException) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) FileNotFoundException(java.io.FileNotFoundException) JsonObject(javax.json.JsonObject) JsonString(javax.json.JsonString) LineIterator(org.apache.commons.io.LineIterator) FilenameFilter(java.io.FilenameFilter) StringReader(java.io.StringReader) JsonReader(javax.json.JsonReader) FileReader(java.io.FileReader) DistributionQueue(org.apache.sling.distribution.queue.DistributionQueue) JsonValue(javax.json.JsonValue) DistributionQueueItem(org.apache.sling.distribution.queue.DistributionQueueItem) JsonArray(javax.json.JsonArray) ScheduleOptions(org.apache.sling.commons.scheduler.ScheduleOptions) JsonObject(javax.json.JsonObject) JsonString(javax.json.JsonString) File(java.io.File) HashMap(java.util.HashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 4 with DistributionQueueItem

use of org.apache.sling.distribution.queue.DistributionQueueItem in project sling by apache.

the class SimpleDistributionQueueTest method testPackageAddition.

@Test
public void testPackageAddition() throws Exception {
    DistributionQueue queue = new SimpleDistributionQueue("agentName", "default");
    DistributionQueueItem pkg = mock(DistributionQueueItem.class);
    assertNotNull(queue.add(pkg));
    assertFalse(queue.getStatus().isEmpty());
}
Also used : DistributionQueue(org.apache.sling.distribution.queue.DistributionQueue) DistributionQueueItem(org.apache.sling.distribution.queue.DistributionQueueItem) Test(org.junit.Test)

Example 5 with DistributionQueueItem

use of org.apache.sling.distribution.queue.DistributionQueueItem in project sling by apache.

the class SimpleDistributionQueueTest method testPackageAdditionAndRemoval.

@Test
public void testPackageAdditionAndRemoval() throws Exception {
    DistributionQueue queue = new SimpleDistributionQueue("agentName", "default");
    DistributionQueueItem pkg = mock(DistributionQueueItem.class);
    when(pkg.getPackageId()).thenReturn("id");
    assertNotNull(queue.add(pkg));
    assertFalse(queue.getStatus().isEmpty());
    assertNotNull(queue.remove(pkg.getPackageId()));
    assertTrue(queue.getStatus().isEmpty());
    DistributionQueueEntry entry = queue.getItem(pkg.getPackageId());
    assertNull(entry);
}
Also used : DistributionQueue(org.apache.sling.distribution.queue.DistributionQueue) DistributionQueueEntry(org.apache.sling.distribution.queue.DistributionQueueEntry) DistributionQueueItem(org.apache.sling.distribution.queue.DistributionQueueItem) Test(org.junit.Test)

Aggregations

DistributionQueueItem (org.apache.sling.distribution.queue.DistributionQueueItem)30 DistributionQueue (org.apache.sling.distribution.queue.DistributionQueue)18 DistributionQueueEntry (org.apache.sling.distribution.queue.DistributionQueueEntry)18 DistributionQueueItemStatus (org.apache.sling.distribution.queue.DistributionQueueItemStatus)18 Test (org.junit.Test)15 DistributionPackageInfo (org.apache.sling.distribution.packaging.DistributionPackageInfo)7 HashMap (java.util.HashMap)5 DistributionPackage (org.apache.sling.distribution.packaging.DistributionPackage)5 File (java.io.File)4 ArrayList (java.util.ArrayList)4 LinkedList (java.util.LinkedList)4 Map (java.util.Map)4 DistributionException (org.apache.sling.distribution.common.DistributionException)4 Matchers.anyString (org.mockito.Matchers.anyString)4 SharedDistributionPackage (org.apache.sling.distribution.packaging.impl.SharedDistributionPackage)3 DistributionQueueProvider (org.apache.sling.distribution.queue.DistributionQueueProvider)3 CheckForNull (javax.annotation.CheckForNull)2 Nonnull (javax.annotation.Nonnull)2 ScheduleOptions (org.apache.sling.commons.scheduler.ScheduleOptions)2 DistributionAgent (org.apache.sling.distribution.agent.DistributionAgent)2