[wildfly-dev] Batch Subsystem Model
James R. Perkins
jperkins at redhat.com
Fri Sep 13 01:13:20 EDT 2013
On 09/12/2013 09:10 PM, David M. Lloyd wrote:
> On 09/12/2013 11:02 PM, James R. Perkins wrote:
>> On 09/12/2013 08:48 PM, David M. Lloyd wrote:
>>> On 09/12/2013 10:39 PM, James R. Perkins wrote:
>>>> I'm struggling a bit come up with the right model for the batch
>>>> subsystem. The XML currently looks like the following, but doesn't have
>>>> to remain like this if someone has a better idea.
>>>>
>>>> <subsystem xmlns="urn:jboss:domain:batch:1.0">
>>>> <job-repository value="default"/>
>>>>
>>>> <job-repository-type name="default">
>>>> <in-memory thread-pool-name="default"/>
>>>> </job-repository>
>>> End tags
>>>
>>>> <job-repository-type name="jdbc">
>>>> <jdbc thread-pool-name="default">
>>> I don't recall if we use -name suffixes in referential attributes. I
>>> don't think we do.
>> That's what EJB had. You define a thread-pool then on like service=async
>> there is a thread-pool-name attribute. I don't really care either way, I
>> was just trying to make it consistent.
>>>> <datasource jndi-name="java:jboss/datasources/ExampleDS"/>
>>>> </jdbc>
>>>> </job-repository>
>>>>
>>>> <unbounded-queue-thread-pool name="default">
>>>> <max-threads count="10"/>
>>>> <keepalive-time time="100" unit="milliseconds"/>
>>>> </unbounded-queue-thread-pool>
>>> Rename this element to something like "batch-thread-pool".
>> No problem. For some reason I was thinking we should allow different
>> types to be used, but I guess it doesn't really matter. Really i that
>> case it could just be defined within the "job-repository-type".
> In fact the opposite is usually true. The way the executor behaves
> often has a specific bearing on the performance, behavior, or
> reliability of the corresponding service. For example a service which
> is expecting an unbounded or blocking executor might not actually have
> code to deal with rejection. If the user unknowingly configures a
> bounded queue to such a service for whatever reason (typically because
> the user thinks that tweaking this knob will make it "better" somehow)
> then suddenly the service can fail in strange ways under load.
That actually makes sense and it's how EJB is setup.
>
>>>> </subsystem>
>>>>
>>>> This would make the model for the in-memory type something like;
>>>> "subsystem" => {
>>>> "batch" => {
>>>> "job-repository" => "default",
>>>> "job-repository-type" => {"default" => {
>>>> "type" => "in-memory",
>>>> "thread-pool-name" => "default"
>>>> }}
>>>> }
>>>> }
>>>>
>>>> The problem is I'm not sure what to do with JDBC which would also need a
>>>> datasource/jndi-name attribute, but I don't want that attribute on the
>>>> in-memory type.
>>>>
>>>> Another thought I had was to have it look more like;
>>>> "subsystem" => {
>>>> "batch" => {
>>>> "job-repository" => "default",
>>>> "in-memory" => {"default" => {
>>>> "thread-pool-name" => "default"
>>>> }},
>>>> "jdbc" => {"jdbc" => {
>>>> "thread-pool-name" => "default",
>>>> "jndi-name" => "java:jboss/datasources/ExampleDS"
>>>> }}
>>>> }
>>>> }
>>>>
>>>> The problem here is really the jdbc resource could also be called
>>>> default. I'm not sure if there is a way to query a parent resource to
>>>> check each name, but if there is then maybe that's the way to go.
>>>>
>>>> Anyway, if anyone has suggestions let me know.
>>> Why have a separate job-repository from job-repository-type?
>>>
>> The only reason was to not use a complex (OBJECT) value for the
>> job-repository. In the ideal world I would just have something like
>>
>> "subsystem" => {
>> "batch" => {
>> "job-repository" => "in-memory" => {
>> "thread-pool" => {
>> "max-threads" => 10,
>> "keepalive" => {
>> "time" => "100",
>> "unit" => "milliseconds"
>> }
>> }
>> }}
>> }
>> }
> Why would you have to use a complex object for the job repository? Just
> make it a sub-resource.
I guess I meant sub-resource, but I wasn't sure if you could limit
sub-resources. Like only allow specific names like
job-repository=in-memory OR job-repository=jdbc. Essentially I need to
have one or the other, but not both and no other values should be allowed.
>
>> Of course for CLI that would be a huge PITA. Maybe it's the best
>> solution though. I would simplify the XML as well to something more like;
>> <subsystem xmlns="urn:jboss:domain:batch:1.0">
>> <job-repository>
>> <in-memory>
>> <thread-pool>
>> <max-threads count="10"/>
>> <keepalive-time time="100" unit="milliseconds"/>
>> </thread-pool>
>> </in-memory>
>> </job-repository>
>> </subsystem>
>>
>> The question I would have for that is would it be acceptable to allow
>> only specific values (in-memory and jdbc) for the job-repository key?
> No. If you have two possible "kinds" of things then they should be
> element types. For example:
>
> <in-memory-job-repository>
> <thread-pool>
> ...
>
> or:
>
> <jdbc-job-repository>
> <data-source name="java:..."/>
> <thread-pool>
> ...
>
> There is some argument to be made to allow sharing thread pools between
> repositories; in this case it would be OK to move the thread pool to the
> top level. Either way these things should all be sub-resources.
In this specific case it might not matter because you can only define
one job repository type.
>
--
James R. Perkins
Red Hat JBoss Middleware
More information about the wildfly-dev
mailing list