/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.discovery;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.server.scheduler.SchedulerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
import javax.persistence.EntityManager;
import java.util.List;
/**
* Quartz job that offloads the work of sending inventory status updates to agents
* to the background, serviced by any one node of the cluster.
*
* @author Robert Buck
*/
public class AgentInventoryStatusUpdateJob implements Job {
public static final String PLATFORMS_COMMA_LIST = "PlatformsList";
public static final String SERVERS_COMMA_LIST = "ServersList";
public static final String KEY_TRIGGER_NAME = "TriggerName";
public static final String KEY_TRIGGER_GROUP_NAME = "TriggerGroupName";
private final Log log = LogFactory.getLog(AgentInventoryStatusUpdateJob.class);
public static void externalizeJobValues(JobDataMap jobDataMap, String key, List<Resource> resources) {
if (resources != null && resources.size() > 0) {
StringBuilder valuesCommaSeparated = new StringBuilder();
valuesCommaSeparated.append(resources.get(0).getId());
for (int i = 1; i < resources.size(); i++) {
valuesCommaSeparated.append(",").append(resources.get(i).getId());
}
jobDataMap.put(key, valuesCommaSeparated.toString());
}
}
public static void internalizeJobValues(EntityManager entityManager, String valuesCsvList, List<Resource> resources) {
if (valuesCsvList==null)
return;
final String[] resourceIdStrings = valuesCsvList.split(",");
for (String resourceIdString : resourceIdStrings) {
int resourceId = Integer.parseInt(resourceIdString);
resources.add(entityManager.find(Resource.class, resourceId));
}
}
private void unscheduleJob(JobDataMap jobDataMap) {
final String triggerName = (String) jobDataMap.get(KEY_TRIGGER_NAME);
final String triggerGroupName = (String) jobDataMap.get(KEY_TRIGGER_GROUP_NAME);
SchedulerLocal scheduler = LookupUtil.getSchedulerBean();
try {
scheduler.unscheduleJob(triggerName, triggerGroupName);
} catch (SchedulerException e) {
log.error("Failed to unschedule Quartz trigger [" + triggerName + "].", e);
}
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
final JobDataMap jobDataMap = context.getMergedJobDataMap();
unscheduleJob(jobDataMap);
DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
discoveryBoss.updateAgentInventoryStatus(
(String) jobDataMap.get(PLATFORMS_COMMA_LIST),
(String) jobDataMap.get(SERVERS_COMMA_LIST));
}
}