Pregunta

Estoy creando una biblioteca que consiste en una appender Log4J que envía de forma asíncrona eventos a un servidor remoto. Cuando se hace una declaración de registro, el appender grabará de forma asíncrona el evento en una cola local que va a continuación, recuperar y enviar a la distancia un grupo de consumidores.

La solución completamente en memoria sería la creación de un BlockingQueue que manejar el tema de concurrencia. Sin embargo, me gustaría que la cola para ser persistido por lo que si el servidor remoto no está disponible no crezco la cola sin límites de o iniciar a los mensajes de descarte en el caso de una cola acotada.

Yo estaba pensando en usar una base de datos H2 incorporado para almacenar los eventos a nivel local y luego usar un mecanismo de sondeo para recuperar eventos y enviar a la distancia. Me gustaría mucho más que utilizar un BlockingQueue para sondear una tabla de base de datos.

es la respuesta JMS?

EDIT:

Si JMS es la respuesta, y parece que va a ser de esa manera, ¿alguien tiene recomendaciones sobre un peso ligero, solución JMS integrable que puede ser configurado para aceptar únicamente mensajes en proceso? En otras palabras, yo no quiero, y posiblemente no se le permitirá, abre un socket TCP en el que escuchar.

EDIT:

Tengo ActiveMQ incrustado ahora y parece estar funcionando. Gracias a todos.

¿Fue útil?

Solución

Se podría utilizar JMS a los mensajes de forma asíncrona enviar a un equipo remoto (suponiendo que puede recibirlas por supuesto), Log4j tiene una Appender de JMS puede utilizar para esto.

Otros consejos

Bob Lee código abierto un disco muy simple respaldado cola de una vuelta, mientras que, https://github.com/square/retrofit/blob/master/modules/android/src/retrofit/io/QueueFile.java - puede ser útil, y es sin duda mucho más fácil de introducir que JMS si se puede aceptar la durabilidad local.

Esta clase es independiente -. Que puede ser copiado y pegado

definitivamente puede utilizar JMS para este propósito. Por lo que yo entiendo que está utilizando el appender Log4J JMS. Este componente envía mensajes a preconfigurado destino JMS (típicamente cola). Puede configurar esta cola para ser persistente. En este caso todos los mensajes insertados en la cola se almacenan automáticamente en alguna tienda PERSISTED (típicamente base de datos.). Por desgracia, esta configuración es específica del proveedor (depende del proveedor JMS), pero por lo general es muy simple. Por favor, consulte la documentación de que el suministrador de JMS.

A ver si esto funciona

Este código debe trabajar para usted - su cola en la memoria de un bloqueo persistente - necesita un poco de sintonía archivo, pero debería funcionar

       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();
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top