这似乎是个问题
@Override
public void start() {
super.start();
scheduler.scheduleAtFixedRate(this::sendEmail, 1, 1L, TimeUnit.HOURS);
}
此计划程序将为初始化的每个追加程序排队发送电子邮件任务。
你能将对象的实例或某个id记录在每个日志行中,并且每次调用start时记录吗?这应该可以澄清这种情况。
为了清楚起见,我用Sysout代替了logger(并在main方法中初始化)尝试了相同的代码,并且它按预期工作。这是密码
public class ScheduledSMTPAppender /*extends SMTPAppender*/ {
private static final ThreadFactory tf = r -> {
Thread t = new Thread(r, "ScheduledSMTPAppender Thread");
t.setDaemon(true); //make daemon or it will prevent your program to exit
return t;
};
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, tf);
private final List<String> events = new ArrayList<>();
private int maxMessages = 10;
public static void main(String args[]) {
ScheduledSMTPAppender app = new ScheduledSMTPAppender();
System.out.println("started");
Thread t = new Thread(() -> {
try {
scheduler.awaitTermination(1, TimeUnit.HOURS);
} catch (Exception e) {
}
});
System.out.println("awaiting termination");
t.start();
System.out.println("thread initiated");
new Thread(() -> {
// Thread to add events to check logs
for (int i =0;i<10;i++)
{app.addEvent("asd");
try {Thread.sleep(1000);
} catch(Exception e) {};}
}).start();
}
public ScheduledSMTPAppender() {
super();
System.out.println("starting");
scheduler.scheduleAtFixedRate(this::sendEmail, 1, 1L, TimeUnit.SECONDS);
}
/*
public ScheduledSMTPAppender(EventEvaluator<String> eventEvaluator) {
super(eventEvaluator);
}
@Override
public void start() {
super.start();
scheduler.scheduleAtFixedRate(this::sendEmail, 1, 1L, TimeUnit.HOURS);
}*/
//@Override
protected void sendBuffer(List<String> cb, String lastEventObject) {
//System.out.println("sending email");
events.add(lastEventObject);
if (events.size() > maxMessages) {
sendEmail();
}
System.out.println(new Date() + "sent email" + lastEventObject);
}
//needs to be synchronized for thread safety
private synchronized void sendEmail() {
try {
if (events.isEmpty()) {
return;
}
String lastEvent = events.get(events.size() - 1);
events.remove(events.size() - 1);
List<String> cb;
if (events.isEmpty()) {
cb = new ArrayList<>(1);
} else {
cb = new ArrayList<>(events.size());
for (String e : events) {
cb.add(e);
}
}
sendBuffer(cb, lastEvent);
events.clear();
} catch (Exception e) {
//Important to have a catch all here or the scheduled task will die
//addError("Error occurred while sending e-mail notification.", e);
}
}
//this allows to make "maxMessages" a parameter of your appender
public int getMaxMessages() {
return maxMessages;
}
// public String getContentType() {
// return layout.getContentType();
// }
public void setMaxMessages(int maxMessages) {
this.maxMessages = maxMessages;
}
public void addEvent(String s) {
events.add(s);
}
}