Tratar exceções do lookup (InitialContext)

2 respostas
adamitj

Estou conseguindo conectar minha aplicação Standalone com sucesso aos EJBs “deployados” em um servidor Glassfish. Só tem um problema: quando o glassfish não foi iniciado, o lookup fica em looping infinito, e trava a aplicação.

Estou tentando tratar esta exceção para que tente conectar apenas uma vez e depois fechar o programa em caso de falha, mas sem sucesso. Alguém poderia me ajudar?

O código que estou tentando tratar é esse:

<a>code</a>

try {

Object obj = ctx.lookup(jndi);

return obj;

} catch (org.omg.CORBA.COMM_FAILURE ex) {

Logger.getLogger(Session.class.getName()).log(Level.SEVERE, null, ex);

LogErro.show(ex);

} catch (Throwable ex) {

Logger.getLogger(Session.class.getName()).log(Level.SEVERE, null, ex);

LogErro.show(ex);

}

(…)

[/code]

O erro que estou tendo é este (repetindo-se infinitamente):

18/03/2009 14:24:08 com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl &lt;init&gt; WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 192.168.100.120; port: 3700" org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2690) at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2711) at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.&lt;init&gt;(SocketOrChannelConnectionImpl.java:261) at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.&lt;init&gt;(SocketOrChannelConnectionImpl.java:274) at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:130) at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:192) at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:181) at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:325) at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112) at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69) at com.sun.enterprise.naming.SerialContext.narrowProvider(SerialContext.java:134) at com.sun.enterprise.naming.SerialContext.getRemoteProvider(SerialContext.java:220) at com.sun.enterprise.naming.SerialContext.getProvider(SerialContext.java:159) at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:409) at javax.naming.InitialContext.lookup(InitialContext.java:392) at com.sssistemas.sgp_client.Session.lookup(Session.java:51) at com.sssistemas.sgp_client.Session.getServerSessionBean(Session.java:72) at com.sssistemas.sgp_client.LoginFrame.jButton2ActionPerformed(LoginFrame.java:124) at com.sssistemas.sgp_client.LoginFrame.access$100(LoginFrame.java:24) at com.sssistemas.sgp_client.LoginFrame$2.actionPerformed(LoginFrame.java:70) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener$Actions.actionPerformed(BasicButtonListener.java:287) at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636) at javax.swing.JComponent.processKeyBinding(JComponent.java:2849) at javax.swing.JComponent.processKeyBindings(JComponent.java:2884) at javax.swing.JComponent.processKeyEvent(JComponent.java:2812) at java.awt.Component.processEvent(Component.java:5911) at java.awt.Container.processEvent(Container.java:2023) at java.awt.Component.dispatchEventImpl(Component.java:4501) at java.awt.Container.dispatchEventImpl(Container.java:2081) at java.awt.Component.dispatchEvent(Component.java:4331) at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:704) at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969) at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:841) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668) at java.awt.Component.dispatchEventImpl(Component.java:4373) at java.awt.Container.dispatchEventImpl(Container.java:2081) at java.awt.Window.dispatchEventImpl(Window.java:2458) at java.awt.Component.dispatchEvent(Component.java:4331) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Caused by: java.lang.RuntimeException: java.net.ConnectException: Connection refused: connect at com.sun.enterprise.iiop.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:347) at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.&lt;init&gt;(SocketOrChannelConnectionImpl.java:244) ... 47 more Caused by: java.net.ConnectException: Connection refused: connect at sun.nio.ch.Net.connect(Native Method) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507) at com.sun.corba.ee.impl.orbutil.ORBUtility.openSocketChannel(ORBUtility.java:105) at com.sun.enterprise.iiop.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:332) ... 48 more

2 Respostas

Felagund

Cara até onde eu sei, ele fica assim ate recuperar a conexão com o servidor, aqui acontece isso ate a conexão ser reestabelecida, ai ele para com a exception.

Também não consegui captura-la :slight_smile:

[]'s

adamitj

Fiz uma implementação aqui que resolveu o problema. Entretanto, no meu caso, como estou executando uma aplicação Standalone, caso o lookup falhe o sistema vai ser encerrado.

Usei uma thread para realizar o lookup (ConnectThread.java). Ela fica executando enquanto uma outra classe de sessão (Session.java) fica testando se a thread conseguiu fazer o lookup e devolver o objeto para si.

Aqui vão os fontes:

ConnectThead.java
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;

/**
 * Cria uma thread para tentar realizar um Lookup remoto.
 * @author Tiago José Adami - 18/03/2009
  */
public class ConnectThread extends Thread {

	// Contexto já inicializado
	private Context ctx;

	// Nome do mapeamento do recurso a ser obtido
	private String resource;

	// Objeto Session que irá chamar esta conexão.
	private Session session;

	// Construtor
	public ConnectThread(Context ctx, String jndiResource, Session session) {
		// Dá um nome à thread
		super(&quot;lookup(\&quot;&quot;+jndiResource+&quot;)\&quot;&quot;);

		this.ctx = ctx;
		this.resource = jndiResource;
		this.session = session;
	}

	@Override
	public void run() {
		Logger.getLogger(Session.class.getName()).log(Level.INFO, &quot;* THREAD &quot;+this.getName()+&quot; INICIADA.&quot;);

		// Busca o recurso solicitado
		Object obj = this.lookup();

		// Se passar aqui, é porque o servidor está carregado e funcionando!
		// Seta o objeto na sessão que chamou esta Thread.
		session.setContextObjectLookup(obj);

		Logger.getLogger(Session.class.getName()).log(Level.INFO, &quot;* THREAD &quot;+this.getName()+&quot; ENCERRADA.&quot;);
	}

	/**
	 * Busca o recurso
	 * @return Objeto representando o recurso remoto.
	 */
	private Object lookup() {
		try {
			Object obj = ctx.lookup(resource);
			return obj;
		} catch (Throwable ex) {
			Logger.getLogger(Session.class.getName()).log(Level.SEVERE, &quot;Falha na conexão.&quot;, ex);
		}
		return null;
	}
}
Session.java
import com.sssistemas.sscore.exception.LookupException;
import com.sssistemas.sscore.util.LogErro;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Classe abstrata com funcionalidades para recuperar recursos de um servidor de aplicações.
 * @author Tiago José Adami - 18/03/2009
 */
public abstract class Session {
	private Context ctx = null;
	private Object contextObjectLookup = null;

	public Session() {
		try {
			EjbClientResources ejbClient = EjbClientResources.instanceOf();
			Properties props = ejbClient.createAppServerContextProperties(EjbClientResources.GLASSFISH_APP_SERVER, &quot;192.168.100.120&quot;, 3700);
			ctx = new InitialContext(props);
		} catch (NamingException ex) {
			Logger.getLogger(Session.class.getName()).log(Level.SEVERE, null, ex);
		} catch (Exception e) {
			LogErro.show(e);
		}
	}

	public void setContextObjectLookup(Object obj) {
		this.contextObjectLookup = obj;
	}

	public Object lookup(String jndi) throws LookupException {
		// Abre a execução da Thread de conexão
		this.contextObjectLookup = null;
		ConnectThread conn = new ConnectThread(ctx, jndi, this);
		conn.start();
		
		try {
			// Verifica se o objeto não é nulo a cada segundo, com um limite de 5 segundos
			for (int i = 1; i &lt;= 2; i++) {
				Logger.getLogger(this.getClass().getName()).log(Level.INFO, &quot;* Aguardando &quot; + i + &quot; recuperação do objeto remoto &quot; + jndi);
				if (this.contextObjectLookup != null) {
					Logger.getLogger(this.getClass().getName()).log(Level.INFO, &quot;* Objeto remoto &quot; + jndi + &quot; recuperado. Continuando...&quot;);
					break;
				}
				Thread.sleep(1000);
			}
		} catch (InterruptedException ex) {
			// Nada a fazer
		}
		if (this.contextObjectLookup == null) {
			throw new LookupException();
		}
		return contextObjectLookup;
	}
}
Criado 18 de março de 2009
Ultima resposta 18 de mar. de 2009
Respostas 2
Participantes 2