1
2
3
4
5
6
7
8
9
10
11 package org.mule.module.logging;
12
13 import java.lang.ref.PhantomReference;
14 import java.lang.ref.Reference;
15 import java.lang.ref.ReferenceQueue;
16 import java.util.Map;
17 import java.util.concurrent.Executors;
18 import java.util.concurrent.ThreadFactory;
19
20
21
22
23
24 public class LoggerReferenceHandler
25 {
26
27
28 protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(getClass());
29
30 public LoggerReferenceHandler(final String threadName,
31 final ReferenceQueue<ClassLoader> referenceQueue,
32 final Map<PhantomReference<ClassLoader>, Integer> references,
33 final Map<Integer, ?> loggerRepository)
34 {
35 Executors.newSingleThreadExecutor(new ThreadFactory()
36 {
37 public Thread newThread(Runnable r)
38 {
39 final Thread thread = Executors.defaultThreadFactory().newThread(r);
40 thread.setName(threadName);
41
42
43 return thread;
44 }
45 }).submit(new Runnable()
46 {
47 public void run()
48 {
49 while (!Thread.currentThread().isInterrupted())
50 {
51 try
52 {
53 final Reference<? extends ClassLoader> reference = referenceQueue.remove();
54 logger.debug("Cleaning up the logging hierarchy");
55 final Integer classLoaderHash = references.get(reference);
56 loggerRepository.remove(classLoaderHash);
57 }
58 catch (InterruptedException e)
59 {
60 Thread.currentThread().interrupt();
61 }
62 catch (RuntimeException rex)
63 {
64 logger.error("Zombies detected, run for your life", rex);
65 }
66 }
67 }
68 });
69 }
70 }