[wildfly-dev] best way to get extensions to apply model changes immediately at runtime?

Brian Stansberry brian.stansberry at redhat.com
Wed Apr 27 18:50:44 EDT 2016


On 4/27/16 4:09 PM, John Mazzitelli wrote:
> I'm in the need to support runtime changes to my subsystem extension (for example, someone should be able to use the CLI to add a child resource or change a resource's attribute and have those changes take effect immediately - i.e. support Flag.RESTART_NONE rather than Flag.RESTART_RESOURCE_SERVICES).
>
> I'm assuming I need to do this in the AddStepHandler

You use an AbstractAddStepHandler subclass for adding a child resource.

You use an AbstractWriteAttributeHandler subclass for changing an 
existing resource's attribute (i.e. the write-attribute operation.)

>but I'm confused if I should override AbstractAddStepHandler.populateModel or AbstractAddStepHandler.performRuntime.
>

Flag.RESTART_NONE and Flag.RESTART_RESOURCE_SERVICES refer to how the 
operation affects runtime services, so what's relevant there is 
performRuntime. Or in the case of AbstractWriteAttributeHandler, 
applyUpdateToRuntime.

You have an AttributeDefinition for each of your attributes. If you pass 
all of them to the AbstractAddStepHandler constructor you normally do 
not need to override populateModel as the default behavior is fine.

> Can someone fill me in on which one is recommended to be used? I'm not sure under which conditions each of those should be used and why.
>

Operations execute in stages. There are five[1], but really only two are 
relevant to people not working on the kernel code.

Stage.MODEL -- changes to the in-memory configuration model are made 
here. AbstractAddStepHandler.populateModel executes in this stage. It 
takes the parameters from the operation and sticks them in the in-memory 
configuration model.

Stage.RUNTIME -- all in-memory configuration model changes have been 
made and whatever model integrity checks we do have been performed. Now 
it's time to make changes to the running container to reflect what's in 
the configuration model. For example, add or remove MSC services. 
AbstractAddStepHandler.performRuntime is called in this stage, as is 
AbstractWriteAttributeHandler.applyUpdateToRuntime.


> The other thing is, it seems this is only for adding child resources (or removing them; I assume it is analogous for Remove Step Handlers). How do you intercept the changing of an attribute value for an existing resource, particularly if my resource extends PersistentResourceDefinition?
>

See above re AbstractWriteAttributeHandler. You'll need to write your 
own subclass which in applyUpdateToRuntime integrates with your runtime 
stuff and makes changes. For example looks up your service in MSC and 
calls a setter on the service's value object. In revertUpdateToRuntime, 
which is called in case of rollback you reverse the change.

To register your custom handler you need to override 
PersistentResourceDefinition.registerAttributes so instead of calling 
the superclass (which registers ReloadRequiredWriteAttributeHandler for 
all attributes) instead you register your handler(s).

(Tomaz, I think we need to make this write handler registration easier. 
Perhaps something like a 
PersistentResourceDefinition.getAttributeHandlers() method that returns 
a Map<String, OperationStepHandler>. And then registerAttributes uses 
the map instead of hardcoding ReloadRequiredWriteAttributeHandler. 
Default impl just fills the map values with 
ReloadRequiredWriteAttributeHandler.)


[1] 
https://github.com/wildfly/wildfly-core/blob/master/controller/src/main/java/org/jboss/as/controller/OperationContext.java#L983

> Thanks for any help,
>
> John Mazz
> _______________________________________________
> wildfly-dev mailing list
> wildfly-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/wildfly-dev
>


-- 
Brian Stansberry
Senior Principal Software Engineer
JBoss by Red Hat


More information about the wildfly-dev mailing list