use of org.quartz.core.jmx.QuartzSchedulerMBean in project midpoint by Evolveum.
the class RemoteNodesManager method startRemoteScheduler.
void startRemoteScheduler(String nodeIdentifier, OperationResult result) {
NodeType node = getNode(nodeIdentifier, result);
if (node == null) {
return;
}
String nodeName = node.getNodeIdentifier();
String address = node.getHostname() + ":" + node.getJmxPort();
JMXConnector connector = null;
try {
MBeanServerConnection mbsc;
try {
connector = connectViaJmx(address);
mbsc = connector.getMBeanServerConnection();
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot connect to the remote node {} at {}", e, nodeName, address);
result.recordFatalError("Cannot connect to the remote node " + nodeName + " at " + address + ": " + e.getMessage(), e);
return;
}
try {
QuartzSchedulerMBean mbeanProxy = getMBeanProxy(nodeName, mbsc);
if (mbeanProxy != null) {
mbeanProxy.start();
result.recordSuccessIfUnknown();
} else {
result.recordFatalError("Cannot start remote scheduler " + nodeName + " at " + address + " because it cannot be found on that node.");
}
return;
} catch (Exception e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot start remote scheduler; remote node {} at {}", e, nodeName, address);
result.recordFatalError("Cannot start remote scheduler " + nodeName + " at " + address + ": " + e.getMessage());
return;
}
} finally {
try {
if (connector != null) {
connector.close();
}
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot close JMX connection to {}", e, address);
}
}
}
use of org.quartz.core.jmx.QuartzSchedulerMBean in project midpoint by Evolveum.
the class RemoteNodesManager method addNodeStatusFromRemoteNode.
/**
* Used exclusively for collecting running task information.
*
* @param info A structure to which information should be added
* @param node Node which to query
*/
void addNodeStatusFromRemoteNode(ClusterStatusInformation info, PrismObject<NodeType> node, OperationResult parentResult) {
OperationResult result = parentResult.createSubresult(RemoteNodesManager.class.getName() + ".addNodeStatusFromRemoteNode");
result.addParam("node", node);
NodeType nodeInfo = node.asObjectable();
String nodeIdentifier = nodeInfo.getNodeIdentifier();
String address = nodeInfo.getHostname() + ":" + nodeInfo.getJmxPort();
if (!taskManager.getClusterManager().isUp(nodeInfo)) {
nodeInfo.setExecutionStatus(NodeExecutionStatusType.DOWN);
info.addNodeInfo(nodeInfo);
result.recordStatus(OperationResultStatus.SUCCESS, "Node is down");
return;
}
JMXConnector connector = null;
try {
MBeanServerConnection mbsc;
try {
connector = connectViaJmx(address);
mbsc = connector.getMBeanServerConnection();
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot connect to the remote node {} at {}", e, nodeIdentifier, address);
result.recordWarning("Cannot connect to the remote node " + nodeIdentifier + " at " + address + ": " + e.getMessage(), e);
nodeInfo.setExecutionStatus(NodeExecutionStatusType.COMMUNICATION_ERROR);
nodeInfo.setConnectionResult(result.createOperationResultType());
info.addNodeInfo(nodeInfo);
return;
}
try {
QuartzSchedulerMBean mbeanProxy = getMBeanProxy(nodeIdentifier, mbsc);
boolean running = false, down = true;
if (mbeanProxy != null) {
try {
running = mbeanProxy.isStarted() && !mbeanProxy.isShutdown() && !mbeanProxy.isStandbyMode();
down = mbeanProxy.isShutdown();
} catch (Exception e) {
// was: InstanceNotFoundException but it does not seem to work
String message = "Cannot get information from scheduler " + nodeIdentifier + " because it does not exist or is shut down.";
LoggingUtils.logUnexpectedException(LOGGER, message, e);
result.recordWarning(message, e);
nodeInfo.setConnectionResult(result.createOperationResultType());
}
} else {
result.recordWarning("Cannot get information from node " + nodeIdentifier + " at " + address + " because the JMX object for scheduler cannot be found on that node.");
nodeInfo.setConnectionResult(result.createOperationResultType());
}
LOGGER.trace(" - scheduler found = " + (mbeanProxy != null) + ", running = " + running + ", shutdown = " + down);
if (down) {
// this is a mark of error situation (we expect that during ordinary shutdown the node quickly goes down so there is little probability of getting this status on that occasion)
nodeInfo.setExecutionStatus(NodeExecutionStatusType.ERROR);
} else if (running) {
nodeInfo.setExecutionStatus(NodeExecutionStatusType.RUNNING);
} else {
nodeInfo.setExecutionStatus(NodeExecutionStatusType.PAUSED);
}
List<ClusterStatusInformation.TaskInfo> taskInfoList = new ArrayList<ClusterStatusInformation.TaskInfo>();
if (mbeanProxy != null) {
TabularData jobs = mbeanProxy.getCurrentlyExecutingJobs();
for (CompositeData job : (Collection<CompositeData>) jobs.values()) {
String oid = (String) job.get("jobName");
LOGGER.trace(" - task oid = " + oid);
taskInfoList.add(new ClusterStatusInformation.TaskInfo(oid));
}
}
if (result.isUnknown()) {
result.recordStatus(OperationResultStatus.SUCCESS, "Node " + nodeIdentifier + ": status = " + nodeInfo.getExecutionStatus() + ", # of running tasks: " + taskInfoList.size());
}
info.addNodeAndTaskInfo(nodeInfo, taskInfoList);
} catch (Exception e) {
// unfortunately, mbeanProxy.getCurrentlyExecutingJobs is declared to throw an Exception
LoggingUtils.logUnexpectedException(LOGGER, "Cannot get information from the remote node {} at {}", e, nodeIdentifier, address);
result.recordWarning("Cannot get information from the remote node " + nodeIdentifier + " at " + address + ": " + e.getMessage(), e);
nodeInfo.setExecutionStatus(NodeExecutionStatusType.COMMUNICATION_ERROR);
nodeInfo.setConnectionResult(result.createOperationResultType());
info.addNodeInfo(nodeInfo);
return;
}
} finally {
try {
if (connector != null) {
connector.close();
}
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot close JMX connection to {}", e, address);
}
result.recordSuccessIfUnknown();
}
}
use of org.quartz.core.jmx.QuartzSchedulerMBean in project midpoint by Evolveum.
the class RemoteNodesManager method stopRemoteTaskRun.
// the task should be really running
void stopRemoteTaskRun(String oid, NodeType node, OperationResult parentResult) {
OperationResult result = parentResult.createSubresult(RemoteNodesManager.class.getName() + ".stopRemoteTaskRun");
result.addParam("oid", oid);
result.addParam("node", node);
LOGGER.debug("Interrupting task " + oid + " running at " + getClusterManager().dumpNodeInfo(node));
String nodeName = node.getNodeIdentifier();
String address = node.getHostname() + ":" + node.getJmxPort();
Holder<JMXConnector> connectorHolder = new Holder<>();
try {
QuartzSchedulerMBean mbeanProxy = getSchedulerBean(node, connectorHolder, result);
if (mbeanProxy != null) {
try {
mbeanProxy.interruptJob(oid, Scheduler.DEFAULT_GROUP);
LOGGER.debug("Successfully signalled shutdown to task " + oid + " running at " + getClusterManager().dumpNodeInfo(node));
result.recordSuccessIfUnknown();
} catch (Exception e) {
// necessary because of mbeanProxy
String message = "Cannot signal task " + oid + " interruption to remote node " + nodeName + " at " + address;
LoggingUtils.logUnexpectedException(LOGGER, message, e);
result.recordFatalError(message + ":" + e.getMessage(), e);
}
}
} finally {
closeJmxConnection(connectorHolder, address);
}
}
use of org.quartz.core.jmx.QuartzSchedulerMBean in project midpoint by Evolveum.
the class RemoteNodesManager method getSchedulerBean.
private QuartzSchedulerMBean getSchedulerBean(NodeType node, Holder<JMXConnector> connectorHolder, OperationResult result) {
String nodeName = node.getNodeIdentifier();
String address = node.getHostname() + ":" + node.getJmxPort();
try {
JMXConnector connector = connectViaJmx(address);
connectorHolder.setValue(connector);
MBeanServerConnection serverConnection = connector.getMBeanServerConnection();
QuartzSchedulerMBean bean = getMBeanProxy(nodeName, serverConnection);
if (bean == null) {
String message = "Cannot connect to the Quartz Scheduler bean at remote node " + nodeName + " at " + address + " because the JMX object for scheduler cannot be found on that node.";
LOGGER.warn("{}", message);
result.recordFatalError(message);
}
return bean;
} catch (IOException | MalformedObjectNameException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot connect to the quartz scheduler bean at remote node {} at {}", e, nodeName, address);
result.recordFatalError("Cannot connect to the quartz scheduler bean at remote node " + nodeName + " at " + address + ": " + e.getMessage(), e);
return null;
}
}
use of org.quartz.core.jmx.QuartzSchedulerMBean in project midpoint by Evolveum.
the class RemoteNodesManager method stopRemoteScheduler.
public void stopRemoteScheduler(String nodeIdentifier, OperationResult parentResult) {
OperationResult result = parentResult.createSubresult(RemoteNodesManager.class.getName() + ".stopRemoteScheduler");
result.addParam("nodeIdentifier", nodeIdentifier);
NodeType node = getNode(nodeIdentifier, result);
if (node == null) {
return;
}
String nodeName = node.getNodeIdentifier();
String address = node.getHostname() + ":" + node.getJmxPort();
JMXConnector connector = null;
try {
MBeanServerConnection mbsc;
try {
connector = connectViaJmx(address);
mbsc = connector.getMBeanServerConnection();
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot connect to the remote node {} at {}", e, nodeName, address);
result.recordFatalError("Cannot connect to the remote node " + nodeName + " at " + address + ": " + e.getMessage(), e);
return;
}
try {
QuartzSchedulerMBean mbeanProxy = getMBeanProxy(nodeName, mbsc);
if (mbeanProxy != null) {
mbeanProxy.standby();
result.recordSuccess();
} else {
result.recordWarning("Cannot stop the scheduler on node " + nodeName + " at " + address + " because the JMX object for scheduler cannot be found on that node.");
}
return;
} catch (Exception e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot put remote scheduler into standby mode; remote node {} at {}", e, nodeName, address);
result.recordFatalError("Cannot put remote scheduler " + nodeName + " at " + address + " into standby mode: " + e.getMessage());
return;
}
} finally {
try {
if (connector != null) {
connector.close();
}
} catch (IOException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Cannot close JMX connection to {}", e, address);
}
}
}
Aggregations