package org.jboss.as.undertow;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ReloadRequiredRemoveStepHandler;
import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler;
import org.jboss.as.controller.SimplePersistentResourceDefinition;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.dmr.ModelNode;
import org.xnio.Options;
/**
* @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2012 Red Hat Inc.
*/
public class WorkerResourceDefinition extends SimplePersistentResourceDefinition {
//The defaults for these come from XnioWorker
static final OptionAttributeDefinition THREAD_DAEMON = new OptionAttributeDefinition.Builder(Constants.THREAD_DAEMON, Options.THREAD_DAEMON)
.setDefaultValue(new ModelNode(false))
.build();
static final OptionAttributeDefinition WORKER_TASK_CORE_THREADS = new OptionAttributeDefinition.Builder(Constants.WORKER_TASK_CORE_THREADS, Options.WORKER_TASK_CORE_THREADS)
.setDefaultValue(new ModelNode(4))
.build();
static final OptionAttributeDefinition WORKER_TASK_MAX_THREADS = new OptionAttributeDefinition.Builder(Constants.WORKER_TASK_MAX_THREADS, Options.WORKER_TASK_MAX_THREADS)
.setDefaultValue(new ModelNode(16))
.build();
static final OptionAttributeDefinition WORKER_TASK_KEEPALIVE = new OptionAttributeDefinition.Builder(Constants.WORKER_TASK_KEEPALIVE, Options.WORKER_TASK_KEEPALIVE)
.setDefaultValue(new ModelNode(60))
.build();
static final OptionAttributeDefinition STACK_SIZE = new OptionAttributeDefinition.Builder(Constants.STACK_SIZE, Options.STACK_SIZE)
.setDefaultValue(new ModelNode(10L))
.build();
static final OptionAttributeDefinition WORKER_IO_THREADS = new OptionAttributeDefinition.Builder(Constants.WORKER_IO_THREADS, Options.WORKER_IO_THREADS)
.setDefaultValue(new ModelNode(1))
.build();
static final OptionAttributeDefinition WORKER_TASK_LIMIT = new OptionAttributeDefinition.Builder(Constants.WORKER_TASK_LIMIT, Options.WORKER_TASK_LIMIT)
.setDefaultValue(new ModelNode(0x4000))
.build();
/*
workers support...
WORKER_NAME THREAD_DAEMON WORKER_TASK_CORE_THREADS WORKER_TASK_MAX_THREADS WORKER_TASK_KEEPALIVE STACK_SIZE WORKER_READ_THREADS WORKER_WRITE_THREADS
WORKER_NAME should be derived from the resource name for ease of debugging and whatnot
maybe something like "%s I/O" where %s is the name of the resource
in current upstream, WORKER_TASK_CORE_THREADS and WORKER_TASK_KEEPALIVE have no effect
or WORKER_TASK_LIMIT which should also be supported
actually, forget that last one
WORKER_TASK_LIMIT should diaf
limiting the work queue will just lead to 500 errors and other problems
*/
static OptionAttributeDefinition[] ATTRIBUTES = new OptionAttributeDefinition[]{
WORKER_IO_THREADS,
WORKER_TASK_CORE_THREADS,
WORKER_TASK_KEEPALIVE,
WORKER_TASK_LIMIT,
WORKER_TASK_MAX_THREADS,
THREAD_DAEMON,
STACK_SIZE
};
static final Map<String, OptionAttributeDefinition> ATTRIBUTES_BY_XMLNAME;
static {
Map<String, OptionAttributeDefinition> attrs = new HashMap<>();
for (AttributeDefinition attr : ATTRIBUTES) {
attrs.put(attr.getXmlName(), (OptionAttributeDefinition) attr);
}
ATTRIBUTES_BY_XMLNAME = Collections.unmodifiableMap(attrs);
}
public static final WorkerResourceDefinition INSTANCE = new WorkerResourceDefinition();
private WorkerResourceDefinition() {
super(UndertowExtension.WORKER_PATH,
UndertowExtension.getResolver(Constants.WORKER),
WorkerAdd.INSTANCE,
ReloadRequiredRemoveStepHandler.INSTANCE
);
}
@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
super.registerAttributes(resourceRegistration);
for (AttributeDefinition attr : WorkerResourceDefinition.ATTRIBUTES) {
resourceRegistration.registerReadWriteAttribute(attr, null, new ReloadRequiredWriteAttributeHandler(attr));
}
}
@Override
public AttributeDefinition[] getAttributes() {
return ATTRIBUTES;
}
}