net.sf.jacclog.service.importer.internal.queue.LogFileQueueImporterObserver.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jacclog.service.importer.internal.queue.LogFileQueueImporterObserver.java

Source

/*******************************************************************************
 * Copyright 2011 Andr Roul
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package net.sf.jacclog.service.importer.internal.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import net.sf.jacclog.api.domain.ReadonlyLogEntry;
import net.sf.jacclog.service.importer.api.LogFile;
import net.sf.jacclog.service.importer.api.service.LogEntryImportService;
import net.sf.jacclog.util.observer.BlockingQueueObserver;

import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogFileQueueImporterObserver implements BlockingQueueObserver<LogFile> {

    public static class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

        private static final Logger LOG = LoggerFactory.getLogger(UncaughtExceptionHandler.class);

        @Override
        public void uncaughtException(final Thread thread, final Throwable throwable) {
            LOG.warn("An unexpected error has occurred in Thread '" + thread.getName() + "'.", throwable);
        }

    }

    private static final Logger LOG = LoggerFactory.getLogger(LogFileQueueImporterObserver.class);

    private final ExecutorService executor;

    /**
     * Import service for log entries
     */
    private final LogEntryImportService<ReadonlyLogEntry> service;

    public LogFileQueueImporterObserver(final LogEntryImportService<ReadonlyLogEntry> service) {
        if (service == null) {
            throw new IllegalArgumentException("Argument 'service' must be not null.");
        }

        this.service = service;

        final BasicThreadFactory factory = new BasicThreadFactory.Builder()
                // attributes
                .namingPattern("file-importer-%d").daemon(true).priority(Thread.MIN_PRIORITY)
                .uncaughtExceptionHandler(new UncaughtExceptionHandler()).build();
        executor = Executors.newSingleThreadExecutor(factory);
    }

    @Override
    public void added(final BlockingQueue<LogFile> queue, final LogFile file) {
        LOG.debug("Added file '" + file.getFile().getPath() + "' to queue.");

        executor.execute(new Runnable() {
            @Override
            public void run() {
                final LogFile file = queue.poll();
                service.importLogEntries(file);
            }
        });
    }

    @Override
    public void empty(final BlockingQueue<LogFile> queue) {
        LOG.info("Log file queue is is empty. (size: " + queue.size() + ")");
    }

    @Override
    public void removed(final BlockingQueue<LogFile> queue, final LogFile file) {
        LOG.debug("Removed file '" + file.getFile().getPath() + "' from queue.");
    }

}