Java operators and embedded adapters can be managed using the sbadmin client. There are two aspects to managing Java operators and embedded adapters: managing their lifecycle, and managing their properties.
Java operators and embedded adapters are distinct entities in StreamBase. Each is managed using sbadmin in the same way without fail, however. During this discussion, the phrase [Java operators] is typically used, but everything said about Java operators applies equally to embedded adapters.
Both the lifecycle and properties of a Java operator can be managed using sbadmin. Each of these is discussed separately below. Keep in mind, though, that these sbadmin commands might typically be used together to accomplish a task. As an example, a Java operator might be shut down, then one of its properties changed, and then restarted. In this way the behavior of the operator can be changed without stopping and restarting the StreamBase application.
In general, Java operators undergo the same life cycle events as the StreamBase application that contains them. When the application starts, its Java operators start. When the application suspends or resumes, its Java operators also suspend and resume. And when a StreamBase application shuts down, its Java operators shut down.
In addition to this kind of life cycle management, the life cycle of an individual Java operator can be managed separately from the application that contains it. So, for example, an embedded input adapter could be suspended while the application around it continues to run. This would effectively shut off input from that individual adapter while the application continues processing.
A custom operator or embedded adapter will generally call a typecheck method and may do so quite frequently. It is therefore important that the method be as clean and efficient as possible. For more information, see Typecheck Method Considerations.
When discussing the management of Java operators, its helpful to understand how
operators are named. Each Java operator in a StreamBase application has a name.
This name can be specified in Studio, and appears along with the operator in
Studio. Consider a Java operator that was given a name
MyJavaOperator in Studio.
This name, which will be referred to as the unqualified name, may not be the full name of the Java Operator, however. The name of a Java operator may be qualified with any combination of a node name, a container name, and module names.
In this case, the qualified name of the Java operator might be something like
Also, each Java operator necessarily runs in a container. In order for a Java
operator to be located, its container must be known. However, it may often be the
case that the operator is running in the default container. In this case, the name
of the container may be omitted. The default container is named
default. So the operator names
MyModule.MyJavaOperator are equivalent. The operator names
MyContainer.MyModule.MyJavaOperator are not equivalent, however.
Java operators can also be contained in StreamBase Modules. A StreamBase
application can contain more than one module, each of which might contain a Java
operator with the same name. In this example, the Java operator named
MyJavaOperator is contained in a module named
MyModule. There might also be a Java operator named
AnotherModule.MyJavaOperator in the same StreamBase application,
but these operators are not the same.
In StreamBase, modules can be nested, so that a Java operator might have a name
The command sbc status --operators, described next, prints the qualified names of the Java operators in a StreamBase application. If you are in doubt, you can determine the qualified names of Java operators in an application by using the status command.
The sbc subcommand, sbc status returns status information about the StreamBase Server. This command has been extended so that it can also return the status of any Java operators contained within the StreamBase application.
The command sbc status --operators returns the status of any Java operators contained by the server's application. Note that this command is disjoint from the sbc status command, meaning that sbc status returns information about the server only and not any operators contained in the server. Similarly, sbc status --operators returns information about contained Java operators only, and not any information about the server itself.
In this context, the status of a Java operator consists only of its current state,
or where it is in its life cycle. The possible states include
SHUTDOWN. These states are discussed further below.
During its lifetime, a StreamBase application undergoes life cycle changes. This means that the application is started and then eventually shuts down. However, an application can also be suspended and resumed any of times before it is shut down.
By default, a Java operator will undergo the same life cycle changes as the
StreamBase application that contains it. Additionally, however, a Java operator can
be suspended and resumed independently of its application. Also, a Java operator
can be shut down and then restarted independently of its application. Finally, it
is possibly for Java operators to be left in a
or unstarted state when the StreamBase application starts up. Each of these state
changes is described below.
By default, a Java operator starts along with the StreamBase application that
contains it. In Studio, in the General tab for Java operators, there is a check
box labeled Start with application. By default,
this box is checked, meaning that the Java operator will start with the
application. Deselecting this box will cause the given adapter to be left in the
NONE state when the application starts.
A Java operator that does not start with its application will stay in the
NONE state until it is explicitly started with the
operatorName command. Such an
adapter will not start even the whole application is resumed. So for example, the
application as a whole may suspend and then resume; this will have no effect on
an operator that has not started with its application.
Executing the command sbadmin suspendOperators
operatorName [...] will
suspend one or more Java operators without suspending the application as a whole.
This command makes sense only if the Java operator, and by implication the
StreamBase application, is already running.
When a Java operator is suspended, it may be that tuples will still arrive at the operator. This could be true of standard Java operators and embedded output adapters, but not embedded input adapters. Its possible to configure the Java operator to handle these tuples in two different ways:
A suspended Java operator can choose to drop tuples that are delivered to it.
Conversely, the operator can choose to process these tuples.
These two possibilities are represented by static Strings on the class
SUSPENDED_AND_PROCESSING_TUPLES respectively. A Java operator is
configured to either drop or process tuples by calling the method
setSuspendBehavior on its instance.
setSuspendBehavior takes an
argument, the value of which must be either
Executing the command sbadmin resumeOperators
operatorName ... will
resume one or more Java operators. In order to resume an Operator, the
application containing it needs to be running. In other words, its not sensible
for a Java operator to run if the application containing it is not running.
It is possible to execute the commands sbadmin
... and sbadmin
... . These commands shut down and then restart Java
operators. There are no analogous sbadmin commands that apply to the server as a
Shutting down and restarting a Java operator is different from suspending and
SHUTDOWN is a terminal state; once an
Operator has been shut down nothing more can be done with it. When an operator is
restarted, a new instance of the Operator is created, it is reinitialized, and so
on. In constrast, when an Operator is suspended and resumed, it is not destroyed
and then recreated; rather it stops processing incoming messages.
The shutdown and restart operations might be needed under various circumstances,
for example when a Java operator is misconfigured. In this case, the operator can
be shut down, its configuration changed using sbadmin
operatorCommand, and then
restarted. In this case, the operator would be reinstantiated and reinitialized,
meaning that its constructor and its init method would be invoked. If it is
necessary to run the constructor or init method of an Operator, then the operator
needs to be shut down and restarted rather than suspended and resumed.
A Java Operator can register threads using a method
registerRunnable on the
Operator class. When an Operator has not yet started its
managed threads will also have not yet started. Similarly, when an Operator is
running its managed threads are actively running, and when an Operator is
suspended its managed threads are also suspended.
Its also the case, however, that the state of an Operator's managed threads can effect the state of an Operator as a whole. In particular, if an Operator registers one or more threads, and each of these threads ends execution (by leaving its run method), then the Operator as a whole will be shut down.
A Java operator may have a set of properties; these are available on the operator's Parameters tab in StreamBase Studio. For input and output adapters, these properties are available on the Adapter Settings tab. These properties can be altered in StreamBase Studio, and they will be read when the application is started.
This set of properties can also be accessed through the public programming interface
com.streambase.sb.client.StreamBaseAdminClient. Similarly, these
properties can be accessed from the StreamBase provided implementation of this API,
the sbadmin command line client. In all
cases, a property is referred to by its name, which is the same as the name that is
displayed in StreamBase Studio for that property.
sbadmin, or any implementation of
StreamBaseAdminClient, can be used to alter a property
of a Java operator while the StreamBase application that contains it is running. So
the properties of a Java operator can be managed dynamically while the operator runs.
Three distinct operations can be carried out on the properties of a Java operator:
Its set of properties, and their current values, can be retrieved.
A property can be retrieved individually.
A property can be set to a new value.
getOperatorProperties(String , on
StreamBaseAdminClient, returns the set of properties and their
getOperatorProperties returns an
array of Strings, where each String is a name-value pair. The name and the value of
the property are delimited with a colon.
Similarly, there is an sbadmin command
that prints out the set of properties and their values for a Java operator. The
command sbadmin getOperatorProperties
operatorName prints the properties
and their values for the given operator.
StreamBaseAdminClient returns the value of the given property on
the given operator. The value is represented as a String.
Similarly, the command sbadmin getOperatorProperty
propertyName prints the String
representation of the given property.
Lastly, the method
setOperatorProperty(String is used to set the given property on
the given operator to the given value. Again, there is an analogous sbadmin command that is used to accomplish the same
task, sbadmin setOperatorProperty
StreamBaseAdminClient interface, each
property of a Java operator is represented as a String. Consider also that the
properties of Java operators are restricted to a limited set of types. Each of
these types can be converted easily to and from Strings, so that this does not
prove to be a limitation.
A new value for a property can be set while an operator is executing. Typically, a Java operator processes incoming tuples when its processTuple method is invoked. An embedded input adapter might begin processing when it receives a call back or in a loop.
Setting a given property on a Java operator will take effect immediately only if that property is read in the code that processes an incoming tuple or message.
So, essentially, the effect of setting a given property on an operator depends on
how and where that property is accessed. Some properties may 'take effect'
immediately. Others may require that the operator be suspended and resumed before
taking effect. This would be the case if the given property is read, and acted on,
in the suspend and resume callbacks, the methods
resumed. Finally, some properties may take effect only when the
operator has been shutdown and restarted.