Websphere - javax.naming.NameNotFoundException [RESOLVIDO]

Eae pessoal,

É o seguinte… estou com uma thread no Websphere onde tenho que acessar os JNDI para conectar na base. Configurei as refferências de recursos, marquei tudo como Sharable no web.xml.
mas quando tento fazer o lookup tomo um:

javax.naming.ConfigurationException: A JNDI operation on a “java:” name cannot be completed because the serverruntime is not able to associate the operation’s thread with any J2EE application component. This condition can occur when the JNDI client using the “java:” name is not executed on the thread of a server application request. Make sure that a J2EE application does not execute JNDI operations on “java:” names within static code blocks or in threads created by that J2EE application. Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on “java:” names.
[Root exception is javax.naming.NameNotFoundException: Name jdbc not found in context “java:comp/env”.]

O trecho de código:
Context objContext = new InitialContext();
DataSource objDataSource = (DataSource) objContext.lookup(“java:comp/env”).lookup(“jdbc/MinhaConexao”);

Pelo que já li, o motivo é que a thread não enxerga as variáveis de referência do aplicativo. E uma solução seria usar Factory para as conexões e outra seria fazer o lookup antes de chamar o thread e então passar para ele como argumento.

Não tem mesmo outra saída? Será que no XML não consigo fazer alguma confiuração ou mesmo no momento do lookup para que a thread enxergue as conexões do Websphere?

Vlw a força
FELIZ ANO NOVO!

Essa sua Thread é criada onde ?

Se for dentro de algum listener, ou qualquer outro lugar que tenha acesso ao contexto da aplicação você pode acessá-lo diretamente, seria o mais fácil…

Se for uma aplicação standalone acessando o websphere então você tem que configurar esse contexto para acessar o websphere, algo assim:

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL,"iiop://localhost:2809");
InitialContext context = new InitialContext(env);

dobau, é um standaone mesmo. Não consigo acessar diretamente o contexto.

Na verdade, tenho um aplicativo que inicia essa thread e dentro dessa thread preciso manioular registros na base de dados. E no momento de obter a conexão usando o lookup, não acho os JNDI.

A solução foi fazer com Facotory, similar ao que você sugeriu. Dessa forma consigo acessar os JNDI numa boa.

Já até imlementei essa solução e nem fo itranquilo, funcionou de prima… hehe (coisa rara).

Mas fiquei triste por não poder usar o lookup. Achei que houvesse alguma configuração para permitir isso. Não cheguei a ver a evolução do Websphere para saber qual das duas formar veio depois. Em relação a desempenho, não vi diferença, já que tive que retestar todo o aplicativo por causa dessa mudança.

O código que inclui foi:

class MeuJNDI extends DbConnectionFactory{

private DataSource dataSource;

public MeuJNDI(){
// Crio e registro o Factory com os JNDI
Context inicontext = new InitialContext();
Context envcontext = (Context) inicontext.lookup(“java:comp/env”);
dataSource = (DataSource) envcontext.lookup(“jdbc/MinhaConexao”);
DbConnectionFactoryHome.getHome().registerFactory(“MeuFactory”, (DbConnectionFactory) this);
}

}

O construtor acima chamo no initServlet das aplicações, dessa forma garanto a criação do factory antes de precisar usar.

E depois, dentro do Thread ou em qualquer outro lugar que precise acessa a base de dados, recupero a conexão usando:


DbConnectionFactory connFactory = DbConnectionFactoryHome.getHome().lookupFactory(“MeuFactory”);
Connection con = connFactory.getConnection();

Vlw!
FuI!