/* * Copyright to the original author or authors. * * 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.rioproject.monitor.service.handlers; import org.rioproject.deploy.DeployAdmin; import org.rioproject.deploy.DeploymentResult; import org.rioproject.monitor.service.OpStringManager; import org.rioproject.monitor.service.OpStringManagerController; import org.rioproject.opstring.OperationalString; import org.rioproject.opstring.OperationalStringException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.rmi.RemoteException; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Use DeployHandlers to provide hot deployment capability */ public class DeployHandlerMonitor { private DeployHandler[] deployHandlers; private ScheduledExecutorService deployExecutor; private long lastRecordedTime; private OpStringManagerController opStringMangerController; private DeployAdmin deployAdmin; static Logger logger = LoggerFactory.getLogger(DeployHandlerMonitor.class.getName()); public DeployHandlerMonitor(DeployHandler[] deployHandlers, long deployScan, OpStringManagerController opStringMangerController, DeployAdmin deployAdmin) { this.deployHandlers = deployHandlers; this.opStringMangerController = opStringMangerController; this.deployAdmin = deployAdmin; processDeployHandlers(null); lastRecordedTime = System.currentTimeMillis(); deployExecutor = Executors.newSingleThreadScheduledExecutor(); deployExecutor.scheduleAtFixedRate(new Runnable() { public void run() { processDeployHandlers(new Date(lastRecordedTime)); lastRecordedTime = System.currentTimeMillis(); } }, 0, deployScan, TimeUnit.MILLISECONDS); } public void terminate() { if (deployExecutor != null) deployExecutor.shutdownNow(); } private void processDeployHandlers(Date from) { for (DeployHandler dHandler : deployHandlers) { List<OperationalString> opstrings = from == null ? dHandler.listOfOperationalStrings() : dHandler.listOfOperationalStrings(from); for (OperationalString opstring : opstrings) { String action = null; try { Map<String, Throwable> errorMap; if (opStringMangerController.getOpStringManager(opstring.getName())!=null) { action = "update"; OpStringManager mgr = opStringMangerController.getOpStringManager(opstring.getName()); errorMap = mgr.doUpdateOperationalString(opstring); } else { action = "deploy"; DeploymentResult result = deployAdmin.deploy(opstring, null); errorMap = result.getErrorMap(); } if (!errorMap.isEmpty()) { for (Map.Entry<String, Throwable> entry : errorMap.entrySet()) { logger.warn("Deploying service [" + entry.getKey() + "] resulted in " + "the following exception", entry.getValue()); } } } catch (OperationalStringException e) { logger.warn("Unable to " + action + " [" + opstring.getName() + "], "+e.getMessage()); } catch (RemoteException e) { logger.warn("Unable to " + action + " [" + opstring.getName() + "]", e); } } } } }