Frage

Ich erstelle eine Bibliothek, die einen Log4J appender besteht aus, die asynchron Ereignisse an einen Remote-Server sendet. Wenn eine Protokoll Aussage gemacht wird, wird die appender asynchron das Ereignis in eine lokale Warteschlange aufzuzeichnen, die einen Pool von Verbrauchern wird dann an die Fern abrufen und senden.

Die vollständig im Speicher Lösung wäre, eine Blocking zu schaffen, die die Gleichzeitigkeit Problem umgehen würden. Ich möchte jedoch für die Warteschlange so beibehalten wird, dass, wenn der Remote-Server nicht verfügbar ist, ich habe nicht die Warteschlange unbegrenzt wachsen oder zu verwerfen Nachrichten im Fall einer beschränkten Warteschlange starten.

Ich dachte an eine eingebettete H2-Datenbank unter Verwendung der Ereignisse lokal zu speichern und dann eine Polling-Mechanismus verwenden, um Ereignisse abzurufen und an die Fern senden. Ich würde viel lieber eine Blocking verwenden als eine Datenbanktabelle abzufragen.

Sie JMS die Antwort?

EDIT:

Wenn JMS ist die Antwort, und es scheint, wird auch so sein, hat jemand haben Empfehlungen auf einem leichten, integrierbare JMS-Lösung, die nur akzeptieren Nachrichten-Prozess konfiguriert werden kann? Mit anderen Worten, ich möchte nicht, und wird möglicherweise nicht erlaubt werden, eine TCP-Socket, auf dem sich öffnen zu hören.

EDIT:

Ich habe ActiveMQ jetzt eingebettet und es scheint zu funktionieren. Vielen Dank an Alle.

War es hilfreich?

Lösung

Sie können JMS asynchron Nachrichten an einem Remote-Rechner verwenden (vorausgesetzt, es kann sie natürlich erhalten), Log4j ein JMS Appender hat Sie dafür verwenden können.

Andere Tipps

Bob Lee Open Source eine sehr einfache Platte gesichert eine Warteschlange vor einiger Zeit, https://github.com/square/retrofit/blob/master/modules/android/src/retrofit/io/QueueFile.java - hilfreich sein kann, und ist sicherlich viel leichter einzuführen als JMS wenn Sie lokale Haltbarkeit akzeptieren kann.

Diese Klasse Standalone ist -. Kopiert werden kann und eingefügt

Sie können auf jeden Fall JMS für diesen Zweck verwenden. Soweit ich verstehe Sie den Log4J JMS appender verwenden. Diese Komponente sendet Nachrichten an Ziel JMS vorkonfiguriert (typischerweise queue). Sie können diese Warteschlange konfigurieren, um beibehalten werden. In diesem Fall werden alle in die Warteschlange eingefügten Nachrichten werden automatisch in einem gewissen persistenten Speicher gespeichert werden (in der Regel-Datenbank.). Leider ist diese Konfiguration herstellerspezifische (abhängig von dem JMS-Anbieter), aber in der Regel ist sehr einfach. Bitte beachten Sie die Dokumentation von Ihnen Provider JMS.

sehen, ob diese Werke

Dieser Code sollte für Sie arbeiten - es ist eine im Speicher persistent Sperr Warteschlange - braucht einige Tuning-Datei, sollte aber funktionieren

       package test;

     import java.io.BufferedReader;
     import java.io.BufferedWriter;
     import java.io.File;
     import java.io.FileReader;
     import java.io.FileWriter;
     import java.io.IOException;
     import java.util.ArrayList;
     import java.util.Collections;
     import java.util.LinkedList;
     import java.util.List;

     public class BlockingQueue {

    //private static Long maxInMenorySize = 1L;
    private static Long minFlushSize = 3L;

    private static String baseDirectory = "/test/code/cache/";
    private static String fileNameFormat = "Table-";

    private static String  currentWriteFile = "";

    private static List<Object>  currentQueue = new LinkedList<Object>();
    private static List<Object>  lastQueue = new LinkedList<Object>();

    static{
        try {
            load();
        } catch (IOException e) {
            System.out.println("Unable To Load");
            e.printStackTrace();
        }
    }

    private static void load() throws IOException{
        File baseLocation = new File(baseDirectory);
        List<String> fileList = new ArrayList<String>();

        for(File entry : baseLocation.listFiles()){
            if(!entry.isDirectory() && entry.getName().contains(fileNameFormat)){
                fileList.add(entry.getAbsolutePath());
            }
        }

        Collections.sort(fileList);

        if(fileList.size()==0){
            //currentQueue = lastQueue = new ArrayList<Object>();
            currentWriteFile = baseDirectory + "Table-1";
            BufferedWriter writer = new BufferedWriter(new FileWriter(currentWriteFile));
            while (!lastQueue.isEmpty()){
                writer.write(lastQueue.get(0).toString()+ "\n");
                lastQueue.remove(0);
            }
            writer.close();
        }else{
            if(fileList.size()>0){
                    BufferedReader reader = new BufferedReader(new FileReader(fileList.get(0)));
                    String line=null;
                    while ((line=reader.readLine())!=null){
                        currentQueue.add(line);
                    }
                    reader.close();
                    File toDelete = new File(fileList.get(0));
                    toDelete.delete();
            }

            if(fileList.size()>0){
                BufferedReader reader = new BufferedReader(new FileReader(fileList.get(fileList.size()-1)));
                currentWriteFile = fileList.get(fileList.size()-1);
                String line=null;
                while ((line=reader.readLine())!=null){
                    lastQueue.add(line);
                }
                reader.close();
                //lastFileNameIndex=Long.parseLong(fileList.get(fileList.size()).substring(6, 9));
            }
        }

    }

    private void loadFirst() throws IOException{
        File baseLocation = new File(baseDirectory);
        List<String> fileList = new ArrayList<String>();

        for(File entry : baseLocation.listFiles()){
            if(!entry.isDirectory() && entry.getName().contains(fileNameFormat)){
                fileList.add(entry.getAbsolutePath());
            }
        }

        Collections.sort(fileList);

        if(fileList.size()>0){
                BufferedReader reader = new BufferedReader(new FileReader(fileList.get(0)));
                String line=null;
                while ((line=reader.readLine())!=null){
                    currentQueue.add(line);
                }
                reader.close();
                File toDelete = new File(fileList.get(0));
                toDelete.delete();
        }
    }

    public Object pop(){
        if(currentQueue.size()>0)
            return  currentQueue.remove(0);

        if(currentQueue.size()==0){
            try {
                loadFirst();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(currentQueue.size()>0)
            return  currentQueue.remove(0);
        else
            return null;
    }

    public synchronized Object waitTillPop() throws InterruptedException{
        if(currentQueue.size()==0){
            try {
                loadFirst();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(currentQueue.size()==0)
                wait();
        }
        return currentQueue.remove(0);
    }

    public synchronized void push(Object data) throws IOException{
        lastQueue.add(data);
        this.notifyAll();
        if(lastQueue.size()>=minFlushSize){
            BufferedWriter writer = new BufferedWriter(new FileWriter(currentWriteFile));
            while (!lastQueue.isEmpty()){
                writer.write(lastQueue.get(0).toString() + "\n");
                lastQueue.remove(0);
            }
            writer.close();

            currentWriteFile  = currentWriteFile.substring(0,currentWriteFile.indexOf("-")+1) + 
                    (Integer.parseInt(currentWriteFile.substring(currentWriteFile.indexOf("-")+1,currentWriteFile.length())) + 1);
        }
    }

    public static void main(String[] args) {
        try {
            BlockingQueue bq = new BlockingQueue();

            for(int i =0 ; i<=8 ; i++){
                bq.push(""+i);
            }

            System.out.println(bq.pop());
            System.out.println(bq.pop());
            System.out.println(bq.pop());

            System.out.println(bq.waitTillPop());
            System.out.println(bq.waitTillPop());
            System.out.println(bq.waitTillPop());
            System.out.println(bq.waitTillPop());



        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top