Twiddle
Twiddle is a command line tool provided by JBoss to communicate with the JMX server instance. Twiddle tool can be used to get information about the beans, server and also to get and set values to the attributes. We can also use twiddle to invoke various operations.
The tool is available in JBOSS_HOME/bin directory. We can either use twiddle.sh or twiddle.bat.Twiddle provides an extensive help system. Open a command prompt and move to JBOSS_HOME/bin and enter
twiddle.bat –h, which displays the basic help system.
The twiddle command allows one to write own scripts to perform management tasks. The tasks performed by the twiddle command are transient and if the server is restarted the changes are not seen.
The following are the twiddle commands available
jsr77 Print out JSR77 related information
xmbean Print out mbean metadata as an xmbean descriptor
info Get the metadata for an MBean
get Get the values of one or more MBean attributes
invoke Invoke an operation on an MBean
create Create an MBean
setattrs Set the values of one or more MBean attributes
unregister Unregister one or more MBeans
queryMethod Query the server for a list of matching methods of MBeans
listDomains Query the server for a list of available domains
query Query the server for a list of matching MBeans
set Set the value of one MBean attribute
serverinfo Get information about the MBean server
So in this article we will see some of the important commands and put them to work.
Serverinfo: To get basic information about the server, we can use the “serverinfo” command like
?twiddle.bat -s localhost:1099 serverinfo -d --count
584
?twiddle.bat -s localhost:1099 serverinfo -d --domain
jboss
?
Info: info helps us in getting information about the MBeans like
?twiddle.bat info "jboss.system:service=MainDeployer"
Description: Management Bean.
+++ Attributes:
Name: Name
Type: java.lang.String
Access: r-
Name: TempDirString
Type: java.lang.String
Access: r-
Name: EnhancedSuffixOrder
Type: [Ljava.lang.String;
Access: rw
Name: TempDir
Type: java.io.File
Access: rw
Name: StateString
Type: java.lang.String
Access: r-
Name: Controller
Type: org.jboss.kernel.spi.dependency.KernelController
Access: rw
Name: State
Type: int
Access: r-
Name: KernelMainDeployer
Type: org.jboss.deployers.client.spi.DeployerClient
Access: rw
Name: SuffixOrder
Type: [Ljava.lang.String;
Access: r-
Name: CopyFiles
Type: boolean
Access: rw
Name: ServiceController
Type: javax.management.ObjectName
Access: -w
+++ Operations:
void destroy()
void stop()
void removeDeployer(org.jboss.deployment.SubDeployer p1)
void create()
boolean isDeployed(java.lang.String p1)
java.util.Collection listDeployers()
void addDeployer(org.jboss.deployment.SubDeployer p1)
void stop(java.lang.String p1)
void undeploy(java.lang.String p1)
void deploy(org.jboss.deployment.DeploymentInfo p1)
void undeploy(java.net.URL p1)
void redeploy(java.net.URL p1)
java.net.URL getWatchUrl(java.net.URL p1)
void shutdown()
void redeploy(org.jboss.deployment.DeploymentInfo p1)
void start(java.lang.String p1)
org.jboss.deployers.client.spi.Deployment getDeployment(java.net.URL p1)
void checkIncompleteDeployments()
org.jboss.deployers.structure.spi.DeploymentUnit getDeploymentUnit(java.net.URL p1)
java.util.Collection listIncompletelyDeployed()
void start()
org.jboss.deployers.structure.spi.DeploymentContext getDeploymentContext(java.net.URL p1)
java.lang.String listDeployedAsString()
void redeploy(java.lang.String p1)
void undeploy(org.jboss.deployment.DeploymentInfo p1)
boolean isDeployed(java.net.URL p1)
void deploy(java.lang.String p1)
void deploy(java.net.URL p1)
void jbossInternalLifecycle(java.lang.String p1)
java.util.Collection listDeployed()
java.util.Collection listDeployedModules()
java.util.Collection listWaitingForDeployer()
ListDomains:Command allows you to list the available domains in the Jboss Application Server
?twiddle listDomains
jboss.jmx
jboss.web.deployment
jboss.deployment
jboss.pojo
jboss.web
jboss.rmi
JMImplementation
jboss.security
jboss.jdbc
jboss.jacc
jboss.remoting
jboss.ejb
jboss.jca
jboss.classloader
jboss.system
jboss.util
jboss.vfs
com.arjuna.ats.properties
jboss.j2ee
jboss
jboss.aop
jboss.management.local
?
Count the number of domains
?twiddle listDomains -c
22
?
queryMethod: QueryMethod command allows us to
- query the methods of a MBeans
- can filter the query by domains
- get all information needed to invoke a method
?twiddle queryMethod -c list
943
?
If we need to filter the query, to get method in the Jboss domain we can use
?twiddle queryMethod -f "jboss:*" list
jboss:service=AttributePersistenceService apmListAll
jboss:service=AttributePersistenceService apmListAllAsString
jboss:service=JNDIView list boolean
jboss:service=JNDIView listXML
jboss:service=invoker,type=unified addListener org.jboss.remoting.callback.InvokerCallbackHandler
jboss:service=invoker,type=unified removeListener org.jboss.remoting.callback.InvokerCallbackHandler
query: this command allows us to query the server for a list of matching MBeans like
?twiddle.bat -s localhost query jboss.jca:*
jboss.jca:service=RARDeployment,name='jboss-xa-jdbc.rar'
jboss.jca:service=ManagedConnectionFactory,name=StudentDB
jboss.jca:service=ManagedConnectionPool,name=StudentDB
jboss.jca:service=WorkManagerThreadPool
jboss.jca:service=WorkManager
jboss.jca:service=LocalTxCM,name=StudentDB
jboss.jca:service=CachedConnectionManager
jboss.jca:service=DataSourceBinding,name=StudentDB
jboss.jca:service=RARDeployment,name='mail-ra.rar'
jboss.jca:service=JCAMetaDataRepository,name=DefaultJCAMetaDataRepository
jboss.jca:service=RARDeployment,name='jboss-local-jdbc.rar'
This will return the list of the names that belong to the Jca mbean and then
?twiddle.bat -s localhost query jboss.system:*
jboss.system:service=MainDeployer
jboss.system:service=ServiceBindingManager
jboss.system:type=Log4jService,service=Logging
jboss.system:service=ThreadPool
jboss.system:type=Server
jboss.system:service=ServiceController
jboss.system:type=ServerConfig
jboss.system:type=ServerInfo
We made a query to the server for the mbean jboss.system.This query is very useful when we need to find information about the server which will be useful in
- getting thread dumps
- to get time spent on threads
- type of underlying architecture
- Server configurations e.t.c.
The 2 mbean Server, ServerConfig and Serverinfo provides various levels of information about the server
Server: provides information about the version of Jboss server in use.
ServerConfig: provides various information about the server configuration in use.
ServerInfo: provdes various information about the underlying architecture.
To query all the web application available in the server we can use
?twiddle.bat -s localhost query jboss.web.deployment:*
jboss.web.deployment:war=/test
jboss.web.deployment:war=/ROOT
jboss.web.deployment:war=/admin-console
jboss.web.deployment:war=/jmx-console
jboss.web.deployment:war=/SimpleSample
Get: get command can be used in getting various information about the server like
//Get the InUseConnectionCount for the StudentDB Connection Pool
?twiddle.bat -s localhost get "jboss.jca:service=ManagedConnectionPool,name=StudentDB" InUseConnectionCount
InUseConnectionCount=0
//To gets The Free Memory available
?twiddle.bat get "jboss.system:type=ServerInfo" FreeMemory
FreeMemory=24364400
If we need to get various attributes of a mbean, we can use the get method like
?twiddle.bat get "jboss.system:type=ServerInfo"
ActiveThreadCount=65
AvailableProcessors=2
OSArch=x86
MaxMemory=506920960
HostAddress=69.58.242.23
JavaVersion=1.6.0_10
OSVersion=5.1
JavaVendor=Sun Microsystems Inc.
TotalMemory=240517120
ActiveThreadGroupCount=5
OSName=Windows XP
FreeMemory=88499752
HostName=PKMI-DS00C2B17
JavaVMVersion=11.0-b15
JavaVMVendor=Sun Microsystems Inc.
JavaVMName=Java HotSpot(TM) Server VM
If we need to check whether Jboss server status, we can use
?twiddle get "jboss.system:type=Server" Started
Started=true
?
Started=true
?
Set:this command can be used to set values to various attributes like
//To set the Max Pool size to 300 for the StudentDB pool
?twiddle.bat -s localhost set jboss.jca:service=ManagedConnectionPool,name=StudentDB MaxSize 300
MaxSize=300
Invoke: invoke is one of the most important command. Invoke is used to invoke an operation on a mbean. Invoke can be used like
//Invoke the list operation on the JNDI View mbean
?twiddle.bat invoke jboss:service=JNDIView list true
<h1> Other components with java:comp namespace</h1>
<h1>java: Namespace</h1>
<pre>
+- securityManagement (class: org.jboss.security.integration.JNDIBasedSecurityManagement)
+- comp (class: javax.namingMain.Context)
+- StudentDB (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
+- TransactionPropagationContextImporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
+- policyRegistration (class: org.jboss.security.plugins.JBossPolicyRegistration)
+- Mail (class: javax.mail.Session)
+- TransactionPropagationContextExporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
+- ProfileService (class: org.jboss.system.server.profileservice.repository.AbstractProfileService)
+- jaas (class: javax.naming.Context)
| +- jmx-console (class: org.jboss.security.plugins.SecurityDomainContext)
| +- jboss-web-policy (class: org.jboss.security.plugins.SecurityDomainContext)
+- TransactionSynchronizationRegistry (class: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImpl
e)
+- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory)
+- TransactionManager (class: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate)
+- timedCacheFactory (class: javax.naming.Context)
Failed to lookup: timedCacheFactory, errmsg=org.jboss.util.TimedCachePolicy cannot be cast to javax.naming.NamingEnumeration
</pre>
<h1>Global JNDI Namespace</h1>
<pre>
+- UserTransactionSessionFactory (proxy: $Proxy89 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
+- SecureDeploymentManager (class: org.jnp.interfaces.NamingContext)
| +- remote[link -> DeploymentManager] (class: javax.naming.LinkRef)
+- SecureManagementView (class: org.jnp.interfaces.NamingContext)
| +- remote[link -> ManagementView] (class: javax.naming.LinkRef)
+- DeploymentManager (class: org.jboss.aop.generatedproxies.AOPProxy$4)
+- ProfileService (class: org.jboss.aop.generatedproxies.AOPProxy$2)
+- SecureProfileService (class: org.jnp.interfaces.NamingContext)
| +- remote[link -> ProfileService] (class: javax.naming.LinkRef)
+- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
+- jmx (class: org.jnp.interfaces.NamingContext)
| +- invoker (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor (proxy: $Proxy91 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RM
IAdaptorExt)
| +- rmi (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
+- TomcatAuthenticators (class: java.util.Properties)
+- ManagementView (class: org.jboss.aop.generatedproxies.AOPProxy$3)
</pre>
In order to use invoke a MBean we need to remember a few things,
The domain, where the MBean can be found in
The properties of the MBean
The method name to invoke
And also the properties, if the method takes any
Deploy a war file:
?twiddle.bat invoke "jboss.system:service=MainDeployer" deploy "C:\software\JbossAsWebApp.war"
NOTE: when we deploy the application using the MainDeployer mbean, the application is available temporarily. The application will be deployed temporarily and can be accessible until the server gets shutdown.
Note: the twiddle supports only archive files to be deployed .we cannot use twiddle to deploy exploded directories.
Undeploy a war file:
?twiddle.bat invoke "jboss.system: service=MainDeployer" undeploy "C:\software\JbossAsWebApp.war"
Perform operations on war files:
If we need to stop and start a web application, get all the web application available in the server
//To Query the web application available in the server,
?twiddle.bat -s localhost query jboss.web.deployment:*
jboss.web.deployment:war=/test
jboss.web.deployment:war=/ROOT
jboss.web.deployment:war=/admin-console
jboss.web.deployment:war=/jmx-console
jboss.web.deployment:war=/SimpleSample
Then try to start the application using invoke like
?twiddle.bat invoke jboss.web.deployment:war=/test stop
'null'
?twiddle.bat invoke jboss.web.deployment:war=/test start
'null'
?
If you try to start an application, which is already started then us gets an exception saying that the web-mapping already exists.
More articles to Come. So happy Coding.....