/** * JBoss, Home of Professional Open Source * Copyright Red Hat, Inc., and individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.aerogear.simplepush.server.netty; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; import io.netty.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.jboss.aerogear.simplepush.server.SimplePushServer; import org.jboss.aerogear.simplepush.server.SimplePushServerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * UserAgentReaperHandler is responsible for starting a single scheduled job * that will clean up inactive user agents. * * @see UserAgentReaper */ @Sharable public class UserAgentReaperHandler extends ChannelHandlerAdapter { private final Logger logger = LoggerFactory.getLogger(UserAgentReaperHandler.class); private final SimplePushServer simplePushServer; private static ScheduledFuture<?> scheduleFuture; private static final AtomicBoolean reaperStarted = new AtomicBoolean(false); /** * Sole constructor. * * @param simplePushServer the {@link SimplePushServer} that this reaper will operate on. */ public UserAgentReaperHandler(final SimplePushServer simplePushServer) { this.simplePushServer = simplePushServer; } @Override public void handlerAdded(final ChannelHandlerContext ctx) throws Exception { if (started()) { return; } final SimplePushServerConfig config = simplePushServer.config(); logger.info("Creating UserAgentReaper job : " + config.userAgentReaperTimeout()); scheduleFuture = ctx.executor().scheduleAtFixedRate(new UserAgentReaper(simplePushServer), config.userAgentReaperTimeout(), config.userAgentReaperTimeout(), TimeUnit.MILLISECONDS); reaperStarted.set(true); } /** * Returns true if the reaper job has started. * * @return {@code true} if the reaper job has started, false otherwise. */ public boolean started() { return reaperStarted.get(); } /** * Cancels the reaper job if it is active. */ public void cancelReaper() { if (scheduleFuture != null) { if (scheduleFuture.cancel(true)) { reaperStarted.set(false); } } } }