привет всем.
есть java слиент который должен подключаться к удаленному jboss jmx server и получать различную информацию используя технологию jmx.
собственно ето код клиента который отвечает за подключение:
org.jboss.jmx.adaptor.rmi.RMIAdaptor adaptor = null;
Hashtable env = new Hashtable();
String factory = "org.jboss.security.jndi.JndiLoginInitialContextFactory";
env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
String url = "jnp://"+host+":"+port;
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_CREDENTIALS, username);
env.put(Context.SECURITY_PRINCIPAL, password);
Context ctx = new InitialContext(env);
Object obj = null;
//String CLASS_NAME = "[" + JMXJbossConnectorHelper.class.getName() + "]";
try {
Context context = new InitialContext(env);
obj = context.lookup("jmx/invoker/RMIAdaptor");
adaptor = (org.jboss.jmx.adaptor.rmi.RMIAdaptor) PortableRemoteObject.narrow(obj, org.jboss.jmx.adaptor.rmi.RMIAdaptor.class);
} catch (ClassCastException e) {
if (obj != null) {
Class _class = obj.getClass();
System.out.println("_class.toString()-->"+_class.toString());
Class[] interfaces = obj.getClass().getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
System.out.println("interfaces: "+interfaces.toString());
}
}
e.printStackTrace();
}
если я запускаю клиента из eclipse то все работает как часы.А когда етот клиент деплоится на jboss server то получаю странное исключение:
java.lang.ClassCastException
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at com.bmc.patrol.com_bmc.solutions.DRJAS.collectors.jboss4.JMXJbossConnectorHelper.getConnection(JMXJbossConnectorHelper.java:106)
at com.bmc.patrol.com_bmc.solutions.DRJAS.collectors.jboss4.AvailabilityCollector.createTreeHead(AvailabilityCollector.java:449)
at com.bmc.patrol.com_bmc.solutions.DRJAS.collectors.jboss4.AvailabilityCollector.discover(AvailabilityCollector.java:782)
at com.bmc.patrol.com_bmc.solutions.DRJAS.lib.common.CollectorManagerRSMImpl.startDiscovery(CollectorManagerRSMImpl.java:291)
at com.bmc.patrol.com_bmc.solutions.DRJAS.RootElementParamlet.doExecute(RootElementParamlet.java:261)
at com.bmc.patrol.patsdk.paramlet.container.simple.SimpleParamletContainer.executeParamletBatchedJobs(SimpleParamletContainer.java:551)
at com.bmc.patrol.patsdk.paramlet.container.simple.SimpleParamletContainer.executeJobs(SimpleParamletContainer.java:473)
at com.bmc.patrol.patsdk.services.CollectionJob.executeParamletJobs(CollectionJob.java:1898)
at com.bmc.patrol.patsdk.services.CollectionJob.doApplicationCollection(CollectionJob.java:439)
at com.bmc.patrol.patsdk.services.CollectionJob.execute(CollectionJob.java:226)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
Caused by: java.lang.ClassCastException: $Proxy43 cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
... 13 more
как быть ? куда копать?
да вот еще что:
SecurityAssociation.setServer();
if( username != null )
{
SecurityAssociation.setPrincipal( new SimplePrincipal( username ) );
}
if( password != null )
{
SecurityAssociation.setCredential( password.toCharArray() );
}
org.jboss.jmx.adaptor.rmi.RMIAdaptor adaptor = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put( Context.INITIAL_CONTEXT_FACTORY, JBOSS_CONTEXT_FACTORY );
env.put( Context.URL_PKG_PREFIXES, JBOSS_URL_PKG_PREFIXES );
env.put( Context.PROVIDER_URL, host + ":" + port );
// Disable Discovery
env.put( NamingContext.JNP_DISABLE_DISCOVERY, "true" );
// Socket timeout, set to one minute.
env.put( TimedSocketFactory.JNP_SO_TIMEOUT, "60000" );
// Initial connect timeout, set to one minute.
env.put( TimedSocketFactory.JNP_TIMEOUT, "60000" );
Object obj = null;
//String CLASS_NAME = "[" + JMXJbossConnectorHelper.class.getName() + "]";
try {
Context context = new InitialContext(env);
obj = context.lookup("jmx/invoker/RMIAdaptor");
adaptor = (RMIAdaptor) PortableRemoteObject.narrow(obj, org.jboss.jmx.adaptor.rmi.RMIAdaptor.class);
} catch (ClassCastException e) {
if (obj != null) {
Class[] interfaces = obj.getClass().getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
}
}
e.printStackTrace();
}
в чем особенность использования выделеного кода? я не нашел подробной документации что именно он делает :
и в чем отличее от предыдушего варианта?просто етот вариант работает не стабильно с периодическими исключениями и поетому я опасаюсь его использовать в конечном продукте.
SecurityAssociation.setServer();
if( username != null )
{
SecurityAssociation.setPrincipal( new SimplePrincipal( username ) );
}
if( password != null )
{
SecurityAssociation.setCredential( password.toCharArray() );
}
заранее спасибо.