From 0d6f7a26954948f81628a06c1b90ec523bdc3bc4 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Fri, 8 Aug 2008 04:34:45 +0000 Subject: [PATCH] Added a new extension point to listen to slave connection/disconnection activity. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@11339 71c3de6d-444a-0410-be80-ed276b4c234a --- core/src/main/java/hudson/model/Hudson.java | 13 ++++++ .../java/hudson/slaves/ComputerListener.java | 40 +++++++++++++++++++ .../java/hudson/slaves/SlaveComputer.java | 4 ++ 3 files changed, 57 insertions(+) create mode 100644 core/src/main/java/hudson/slaves/ComputerListener.java diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index 52782c9247..a163045321 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -16,6 +16,7 @@ import static hudson.Util.fixEmpty; import hudson.XmlFile; import hudson.ProxyConfiguration; import hudson.slaves.RetentionStrategy; +import hudson.slaves.ComputerListener; import hudson.model.Descriptor.FormException; import hudson.model.listeners.ItemListener; import hudson.model.listeners.JobListener; @@ -271,6 +272,11 @@ public final class Hudson extends View implements ItemGroup, Node, */ private transient final CopyOnWriteList scmListeners = new CopyOnWriteList(); + /** + * List of registered {@link ComputerListener}s. + */ + private transient final CopyOnWriteList computerListeners = new CopyOnWriteList(); + /** * TCP slave agent port. * 0 for random, -1 to disable. @@ -542,6 +548,13 @@ public final class Hudson extends View implements ItemGroup, Node, return scmListeners; } + /** + * Gets all the installed {@link ComputerListener}s. + */ + public CopyOnWriteList getComputerListeners() { + return computerListeners; + } + /** * Gets the plugin object from its short name. * diff --git a/core/src/main/java/hudson/slaves/ComputerListener.java b/core/src/main/java/hudson/slaves/ComputerListener.java new file mode 100644 index 0000000000..50b4e80e2f --- /dev/null +++ b/core/src/main/java/hudson/slaves/ComputerListener.java @@ -0,0 +1,40 @@ +package hudson.slaves; + +import hudson.model.Computer; +import hudson.model.Hudson; +import hudson.ExtensionPoint; + +/** + * Receives notifications about status changes of {@link Computer}s. + * + * @author Kohsuke Kawaguchi + * @since 1.246 + */ +public abstract class ComputerListener implements ExtensionPoint { + /** + * Called right after a {@link Computer} comes online. + */ + public void onOnline(Computer c) {} + + /** + * Called right after a {@link Computer} went offline. + */ + public void onOffline(Computer c) {} + + /** + * Registers this {@link ComputerListener} so that it will start receiving events. + */ + public final void register() { + Hudson.getInstance().getComputerListeners().add(this); + } + + /** + * Unregisters this {@link ComputerListener} so that it will never receive further events. + * + *

+ * Unless {@link ComputerListener} is unregistered, it will never be a subject of GC. + */ + public final boolean unregister() { + return Hudson.getInstance().getComputerListeners().remove(this); + } +} diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index f95268d41d..8e4b154ac1 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -229,6 +229,8 @@ public final class SlaveComputer extends Computer { numRetryAttempt = 0; this.channel = channel; } + for (ComputerListener cl : Hudson.getInstance().getComputerListeners()) + cl.onOnline(this); Hudson.getInstance().getQueue().scheduleMaintenance(); } @@ -336,6 +338,8 @@ public final class SlaveComputer extends Computer { logger.log(Level.SEVERE, "Failed to terminate channel to " + getDisplayName(), e); } } + for (ComputerListener cl : Hudson.getInstance().getComputerListeners()) + cl.onOffline(this); } @Override -- GitLab