blob: 108ce42a34df608a359492b54c9ab4982a786744 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.batchee.jmx;
import org.apache.batchee.container.impl.JobInstanceImpl;
import javax.batch.operations.JobOperator;
import javax.batch.operations.NoSuchJobException;
import javax.batch.runtime.BatchRuntime;
import javax.batch.runtime.JobExecution;
import javax.batch.runtime.JobInstance;
import javax.batch.runtime.Metric;
import javax.batch.runtime.StepExecution;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class BatchEEMBeanImpl implements BatchEEMBean {
public static final BatchEEMBeanImpl INSTANCE = new BatchEEMBeanImpl();
private static final String[] JOB_INSTANCES_ATTRIBUTES = { "jobName", "instanceId" };
private static final TabularType JOB_INSTANCES_TABULAR_TYPE;
private static final CompositeType JOB_INSTANCES_COMPOSITE_TYPE;
private static final String[] PROPERTIES_ATTRIBUTES = { "key", "value" };
private static final TabularType PROPERTIES_TABULAR_TYPE;
private static final CompositeType PROPERTIES_COMPOSITE_TYPE;
private static final String[] JOB_EXECUTION_ATTRIBUTES =
{ "executionId", "jobName", "Batch status", "Exit status", "Create time", "Last updated time", "Start time", "End time" };
private static final TabularType JOB_EXECUTION_TABULAR_TYPE;
private static final CompositeType JOB_EXECUTION_COMPOSITE_TYPE;
private static final String[] STEP_EXECUTION_ATTRIBUTES =
{ "stepExecutionId", "stepName", "Batch status", "Exit status", "Start time", "End time", "Read", "Write",
"Commit", "Rollback", "Read skip", "Process skip", "Write skip", "Filter" };
private static final TabularType STEP_EXECUTION_TABULAR_TYPE;
private static final CompositeType STEP_EXECUTION_COMPOSITE_TYPE;
static {
try {
JOB_INSTANCES_COMPOSITE_TYPE = new CompositeType("JobInstance", "Job Instance", JOB_INSTANCES_ATTRIBUTES, JOB_INSTANCES_ATTRIBUTES,
new OpenType[] { SimpleType.STRING, SimpleType.LONG });
JOB_INSTANCES_TABULAR_TYPE = new TabularType("JobInstances", "Job Instances",
JOB_INSTANCES_COMPOSITE_TYPE,
JOB_INSTANCES_ATTRIBUTES);
PROPERTIES_COMPOSITE_TYPE = new CompositeType("Properties", "Properties", PROPERTIES_ATTRIBUTES, PROPERTIES_ATTRIBUTES,
new OpenType[] { SimpleType.STRING, SimpleType.STRING });
PROPERTIES_TABULAR_TYPE = new TabularType("Properties", "Properties",
PROPERTIES_COMPOSITE_TYPE,
PROPERTIES_ATTRIBUTES);
JOB_EXECUTION_COMPOSITE_TYPE = new CompositeType("JobExecution", "Job Execution", JOB_EXECUTION_ATTRIBUTES, JOB_EXECUTION_ATTRIBUTES,
new OpenType[] { SimpleType.LONG, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING,
SimpleType.STRING, SimpleType.STRING, SimpleType.STRING });
JOB_EXECUTION_TABULAR_TYPE = new TabularType("JobExecutions", "Job Executions",
JOB_EXECUTION_COMPOSITE_TYPE, JOB_EXECUTION_ATTRIBUTES);
STEP_EXECUTION_COMPOSITE_TYPE = new CompositeType("StepExecution", "Step Execution", STEP_EXECUTION_ATTRIBUTES, STEP_EXECUTION_ATTRIBUTES,
new OpenType[] { SimpleType.LONG, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING,
SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG });
STEP_EXECUTION_TABULAR_TYPE = new TabularType("StepExecutions", "Step Executions",
STEP_EXECUTION_COMPOSITE_TYPE,
STEP_EXECUTION_ATTRIBUTES);
} catch (final OpenDataException e) {
throw new IllegalArgumentException(e);
}
}
private static Properties toProperties(final String params) {
final Properties properties = new Properties();
if (params != null && !params.isEmpty()) {
for (final String kv : params.split("|")) {
final String[] split = kv.split("=");
if (split.length == 1) {
continue;
}
properties.setProperty(split[0], split[1]);
}
}
return properties;
}
private static Object[] asArray(final JobExecution n) {
return new Object[] {
n.getExecutionId(),
n.getJobName(),
n.getBatchStatus().name(),
n.getExitStatus(),
n.getCreateTime().toString(),
n.getLastUpdatedTime().toString(),
n.getStartTime() != null ? n.getStartTime().toString() : "",
n.getEndTime() != null ? n.getEndTime().toString() : "",
};
}
private static Object[] asArray(final StepExecution n) {
return new Object[] {
n.getStepExecutionId(),
n.getStepName(),
n.getBatchStatus().name(),
n.getExitStatus(),
n.getStartTime() != null ? n.getStartTime().toString() : "",
n.getEndTime() != null ? n.getEndTime().toString() : "",
metric(n.getMetrics(), Metric.MetricType.READ_COUNT),
metric(n.getMetrics(), Metric.MetricType.WRITE_COUNT),
metric(n.getMetrics(), Metric.MetricType.COMMIT_COUNT),
metric(n.getMetrics(), Metric.MetricType.ROLLBACK_COUNT),
metric(n.getMetrics(), Metric.MetricType.READ_SKIP_COUNT),
metric(n.getMetrics(), Metric.MetricType.PROCESS_SKIP_COUNT),
metric(n.getMetrics(), Metric.MetricType.WRITE_SKIP_COUNT),
metric(n.getMetrics(), Metric.MetricType.FILTER_COUNT)
};
}
private static long metric(final Metric[] metrics, final Metric.MetricType type) {
for (final Metric m : metrics) {
if (type.equals(m.getType())) {
return m.getValue();
}
}
return -1;
}
public BatchEEMBeanImpl() {
// no-op
}
private JobOperator operator() { // lazy since we register jmx with the servicesmanager init
return BatchRuntime.getJobOperator();
}
@Override
public String[] getJobNames() {
final Set<String> jobNames = operator().getJobNames();
return jobNames.toArray(new String[jobNames.size()]);
}
@Override
public int getJobInstanceCount(final String jobName) {
return operator().getJobInstanceCount(jobName);
}
@Override
public TabularData getJobInstances(final String jobName, final int start, final int count) {
final List<JobInstance> instances = operator().getJobInstances(jobName, start, count);
try {
final TabularDataSupport data = new TabularDataSupport(JOB_INSTANCES_TABULAR_TYPE);
for (final JobInstance n : instances) {
data.put(new CompositeDataSupport(JOB_INSTANCES_COMPOSITE_TYPE, JOB_INSTANCES_ATTRIBUTES, new Object[] { n.getJobName(), n.getInstanceId() }));
}
return data;
} catch (final OpenDataException e) {
return null;
}
}
@Override
public Long[] getRunningExecutions(final String jobName) {
try {
final List<Long> runningExecutions = operator().getRunningExecutions(jobName);
return runningExecutions.toArray(new Long[runningExecutions.size()]);
} catch (final NoSuchJobException nsje) {
return new Long[0];
}
}
@Override
public TabularData getParameters(final long executionId) {
final Properties parameters = operator().getParameters(executionId);
try {
final TabularDataSupport data = new TabularDataSupport(PROPERTIES_TABULAR_TYPE);
for (final Map.Entry<Object, Object> entry : parameters.entrySet()) {
data.put(new CompositeDataSupport(PROPERTIES_COMPOSITE_TYPE, PROPERTIES_ATTRIBUTES, new Object[] { entry.getKey(), entry.getValue() }));
}
return data;
} catch (final OpenDataException e) {
return null;
}
}
@Override
public TabularData getJobInstance(final long executionId) {
final JobInstance instance = operator().getJobInstance(executionId);
try {
final TabularDataSupport data = new TabularDataSupport(JOB_INSTANCES_TABULAR_TYPE);
data.put(new CompositeDataSupport(JOB_INSTANCES_COMPOSITE_TYPE, JOB_INSTANCES_ATTRIBUTES, new Object[] { instance.getJobName(), instance.getInstanceId() }));
return data;
} catch (final OpenDataException e) {
return null;
}
}
@Override
public void stop(final long executionId) {
operator().stop(executionId);
}
@Override
public void abandon(final long executionId) {
operator().abandon(executionId);
}
@Override
public long start(final String jobXMLName, final String jobParameters) {
return operator().start(jobXMLName, toProperties(jobParameters));
}
@Override
public long restart(final long executionId, final String restartParameters) {
return operator().restart(executionId, toProperties(restartParameters));
}
@Override
public TabularData getJobExecutions(final long id, final String name) {
final List<JobExecution> executions = operator().getJobExecutions(new JobInstanceImpl(id, name));
try {
final TabularDataSupport data = new TabularDataSupport(JOB_EXECUTION_TABULAR_TYPE);
for (final JobExecution n : executions) {
data.put(new CompositeDataSupport(JOB_EXECUTION_COMPOSITE_TYPE, JOB_EXECUTION_ATTRIBUTES, asArray(n)));
}
return data;
} catch (final OpenDataException e) {
return null;
}
}
@Override
public TabularData getJobExecution(final long executionId) {
final JobExecution execution = operator().getJobExecution(executionId);
try {
final TabularDataSupport data = new TabularDataSupport(JOB_EXECUTION_TABULAR_TYPE);
data.put(new CompositeDataSupport(JOB_EXECUTION_COMPOSITE_TYPE, JOB_EXECUTION_ATTRIBUTES, asArray(execution)));
return data;
} catch (final OpenDataException e) {
return null;
}
}
@Override
public TabularData getStepExecutions(final long jobExecutionId) {
final List<StepExecution> executions = operator().getStepExecutions(jobExecutionId);
try {
final TabularDataSupport data = new TabularDataSupport(STEP_EXECUTION_TABULAR_TYPE);
for (final StepExecution n : executions) {
data.put(new CompositeDataSupport(STEP_EXECUTION_COMPOSITE_TYPE, STEP_EXECUTION_ATTRIBUTES, asArray(n)));
}
return data;
} catch (final OpenDataException e) {
return null;
}
}
}