0

我想创建一个Receiver来收集和管理 JMSAppender 发送的日志。现在它只工作 30 秒(Thread.sleep(30000);),但我需要它等待来自系统的所有日志。pw.close();如果我需要关闭以查看文件中的所有日志,我该怎么做?从文件中,我将日志加载到日志查看器,我想实时查看它们。

public class Receiver implements MessageListener {

    PrintWriter pw = new PrintWriter("result.log");

    public Receiver() throws Exception {


        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = factory.createConnection();
        Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        conn.start();
        MessageConsumer consumer = sess.createConsumer(sess.createTopic("logTopic"));
        consumer.setMessageListener(this);

        Thread.sleep(30000);
        consumer.close();
        sess.close();
        conn.close();
        pw.close();
        System.exit(1);
    }

    public static void main(String[] args) throws Exception {
        new Receiver();

    }

    public void onMessage(Message message) {
        try {
            LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject();

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 
            String nowAsString = df.format(new Date(event.getTimeStamp())); 

            System.out.println("zapisujemy do pliku");
            pw.println("["+ nowAsString + "]" + 
                    " [" + event.getThreadName()+"]" +
                    " ["+ event.getLoggerName() + "]" +
                    " ["+ event.getMessage()+"]");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

4 回答 4

1

不要在构造函数中关闭打印编写器并删除您的Thread.sleep(). 您的程序不会终止,因为您正在调用conn.start();在 JMS 客户端中创建等待线程。

pw.flush();之后添加pw.println()onMessage()

编辑:您不必关闭文件。但是,如果您想创建干净的实现,请在关闭挂钩中执行。

于 2012-08-13T12:13:13.837 回答
0

那是因为你在这 30 秒后关闭它,然后甚至退出 jvm。

在 JVM 退出时关闭:Runtime.addShutdownHook

于 2012-08-13T12:10:52.387 回答
0

我觉得我在这里指出了显而易见的事情,但是您确实意识到您在构造函数中等待了 30 秒?

如果您想在 30 秒后关闭连接,那么我建议您Timer在此处使用并执行线程安全关闭连接。

在您的构造函数中暂停的结果是,当其他线程调用时onMessage,您的对象尚未完成创建,并且可能会出现异常行为。

于 2012-08-13T12:27:29.427 回答
0

最后我写了接收器:

public class Receiver implements MessageListener {

    static Connection conn;
    ActiveMQConnectionFactory factory;
    static Session sess;
    static MessageConsumer consumer;


    public Receiver() throws Exception {

        /*
         *  create a logTopic topic consumer
         */
        factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        conn = factory.createConnection();
        sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        conn.start();
        consumer = sess.createConsumer(sess.createTopic("logTopic"));
        consumer.setMessageListener(this);

    }

    public static void main(String[] args) throws Exception {

        Runtime.getRuntime().addShutdownHook(new Thread(new ShutDownListener(consumer, sess, conn)));
        new Receiver();
    }


    public void onMessage(Message message) {
        try {
            LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message)
                    .getObject();

            /*
             * log on console and into a file
             */

            FileReceiver.logToFile(event);
            StdoutReceiver.logOnConsole(event);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 FileReceiver:

public class FileReceiver {

    static PrintWriter pw;
    static DateFormat df;

    static {
        try {
            df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
            pw = new PrintWriter("result.log");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                pw.close();
                System.exit(1);
            }
        });
    }

    public static void logToFile(LoggingEvent event) {
        String nowAsString = df.format(new Date(event.getTimeStamp()));

        pw.println("[" + nowAsString + "]" + " [" + event.getThreadName() + "]"
                + " [" + event.getLoggerName() + "]" + " ["
                + event.getMessage() + "]");
        pw.flush();


    }
}

和标准输出接收器

public class StdoutReceiver {

    public static void logOnConsole(LoggingEvent event) {

        System.out.println("[" + event.getTimeStamp() + "]" + " ["
                + event.getThreadName() + "]" + " [" + event.getLoggerName()
                + "]" + " [" + event.getMessage() + "]");
    }

}
于 2012-08-14T09:25:05.863 回答