diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index e7d8daebb..f93c48408 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -2163,7 +2163,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } protected static ScheduledAction schedule(Runnable runnable, long delay, TimeUnit unit) { - return SMACK_REACTOR.schedule(runnable, delay, unit); + return SMACK_REACTOR.schedule(runnable, delay, unit, ScheduledAction.Kind.NonBlocking); } protected void onStreamOpen(XmlPullParser parser) { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/Manager.java b/smack-core/src/main/java/org/jivesoftware/smack/Manager.java index d3c4beec1..a306bc3af 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/Manager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/Manager.java @@ -54,6 +54,14 @@ public abstract class Manager { } protected static final ScheduledAction schedule(Runnable runnable, long delay, TimeUnit unit) { - return AbstractXMPPConnection.SMACK_REACTOR.schedule(runnable, delay, unit); + return schedule(runnable, delay, unit, ScheduledAction.Kind.NonBlocking); + } + + protected static final ScheduledAction scheduleBlocking(Runnable runnable, long delay, TimeUnit unit) { + return schedule(runnable, delay, unit, ScheduledAction.Kind.Blocking); + } + + protected static final ScheduledAction schedule(Runnable runnable, long delay, TimeUnit unit, ScheduledAction.Kind scheduledActionKind) { + return AbstractXMPPConnection.SMACK_REACTOR.schedule(runnable, delay, unit, scheduledActionKind); } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ScheduledAction.java b/smack-core/src/main/java/org/jivesoftware/smack/ScheduledAction.java index 962e1d75e..da0377fab 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ScheduledAction.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ScheduledAction.java @@ -20,16 +20,25 @@ import java.util.Date; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; +import org.jivesoftware.smack.util.Async; + public class ScheduledAction implements Delayed { - final Runnable action; + enum Kind { + NonBlocking, + Blocking, + } + + private final Runnable action; final Date releaseTime; final SmackReactor smackReactor; + final Kind kind; - ScheduledAction(Runnable action, Date releaseTime, SmackReactor smackReactor) { + ScheduledAction(Runnable action, Date releaseTime, SmackReactor smackReactor, Kind kind) { this.action = action; this.releaseTime = releaseTime; this.smackReactor = smackReactor; + this.kind = kind; } /** @@ -68,4 +77,15 @@ public class ScheduledAction implements Delayed { long delayInMillis = getTimeToDueMillis(); return unit.convert(delayInMillis, TimeUnit.MILLISECONDS); } + + void run() { + switch (kind) { + case NonBlocking: + action.run(); + break; + case Blocking: + Async.go(() -> action.run()); + break; + } + } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackReactor.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackReactor.java index 6d870a9ca..eaff9ca3d 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/SmackReactor.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackReactor.java @@ -145,10 +145,10 @@ public class SmackReactor { } } - ScheduledAction schedule(Runnable runnable, long delay, TimeUnit unit) { + ScheduledAction schedule(Runnable runnable, long delay, TimeUnit unit, ScheduledAction.Kind scheduledActionKind) { long releaseTimeEpoch = System.currentTimeMillis() + unit.toMillis(delay); Date releaseTimeDate = new Date(releaseTimeEpoch); - ScheduledAction scheduledAction = new ScheduledAction(runnable, releaseTimeDate, this); + ScheduledAction scheduledAction = new ScheduledAction(runnable, releaseTimeDate, this, scheduledActionKind); scheduledActions.add(scheduledAction); selector.wakeup(); return scheduledAction; @@ -206,7 +206,7 @@ public class SmackReactor { } if (dueScheduledAction != null) { - dueScheduledAction.action.run(); + dueScheduledAction.run(); return; }