A própria documentação da Oracle deixa claro que a função do gerenciamento de threads é do próprio container. A especificação diz que é proibido o uso de threads.
The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread, or to change a thread’s priority or name. The enterprise bean must not attempt to manage thread groups.
Permitir que a aplicação faça o controle de threads irá interferir no controle do ciclo de vida dos componentes do container. Então estamos proibidos de usar threads diretamente na aplicação (elas existem, mas controladas pelo container). O uso direto delas implicaria na violação e perda dos recursos fornecidos pelo container: segurança, clustering, controle de transação e afins.
Mesmo o controle sendo feito no container, podemos utilizar as vantagens que as threads oferecem sem comprometer a integridade do container. Na maioria dos casos, conhecer os componentes possíveis da arquitetura é suficiente para não utilizar threads diretamente. Por exemplo, um envio de e-mail em lote pode ser desenvolvido com uma fila JMS em conjunto com um MDB. Um agendamento, pode ser feito utilizando Quartz ou um Timer Service.
Além das threads, se você leu as referências acima, irá ver que não podemos nem gravar arquivos dentro do container, pois você perderia o controle da concorrência, em ambientes clusterizados você teria problemas com arquivos que não são distribuídos em várias máquinas, operações com arquivos também não são transacionais e teria problemas com segurança. Caso deseja realmente fazer isso, você terá que desenvolver esse controle manualmente, como um sistema de arquivo distribuido entre os nós do cluster, controle de transação manual como um arquivo de lock, um controle de concorrência para garantir que um arquivo seja lido ou escrito por vez, eliminando a concorrência entre os clusters e um mecanismo de detecção ou compensação de erro ou rollback em caso de falhas entre as operações utilizando arquivos. O que não é uma tarefa fácil, mas às vezes se faz necessário.
Há casos específicos que existe a necessidade de uso threads, mas devemos fazer isso sem comprometer o container, para isso há soluções como a JSR 236, que é a api de utilitários de concorrência (vulgo, usar thread do jeito certo) e se tornou padrão na especificação do JEE 7. Há uma boa referência do uso aqui e aqui.
Resumindo: Evite o uso de threads em escopo JEE, caso você identifique a necessidade, verifique se algum componente padrão resolve o seu problema, caso contrário, utilze APIs adequadas para usar threads sem comprometer os recursos fornecidos pelo JEE.
]]>oracle.core.ojdl.logging.LoggingConfigurationException: ODL-52049: cannot create instance of class ‘oracle.dfw.incident.IncidentDetectionLogFilter’: java.lang.ExceptionInInitializerError
….
WARNING: unable to register log dump; exception: java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException
…<Critical> <WebLogicServer> <BEA-000286> <Failed to invoke startup class “DMS-Startup”, java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager
java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager
Isso ocorre, pois há algum problema ao gravar na pasta temporária que por padrão é /var/tmp. Você pode alterar o padrão com o parâmetro “-Djava.io.tmpdir” ou limpe o /var/tmp com o comando rm -rf /var/tmp/*
Garanta que o diretório /var/tmp tenha permissão de leitura e escrita para o seu usuário.
Inicie o WebLogic novamente.
]]>Eu estarei por lá, principalmente no dia 11, onde teremos uma trilha de TV Digital. Compareça!
]]>Crie uma aplicação SOA Suite e no composite.xml, arraste o componente Spring Context (Component Pallete) para a raia do meio.

Clique em OK. Você deverá ter um componente com um folhinha verde no meio do composite. O próximo passo é criar uma interface e uma classe para ser utilizada com o Spring Context. Clique em File, New, Java Interface e clique em OK. Dê um nome, no meu exemplo vou dar o nome de OlaSpring. Clique em OK. Insira o seguinte conteúdo:
]]>Para visualizar a árvore JNDI no JBoss 7.1, acesse o console administrativo, escolha a opção Profile no canto superior direito:

No menu lateral, escolha a opção Container, Naming:

Irá abrir uma tela escrita JNDI View. Agora é só navegar na árvore JNDI.
]]>Resolvi encapsular o lógica de execução em uma classe, mas queria evitar de ter que implementar uma interface para cada MBean a ser utilizado. E esse pensamento resultou na seguinte classe:
]]>Ao invés de realizarmos as operações desse jeito:
[sourcecode language=”java” highlight=”1,2,4,5,6″]
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection("jdbc:oracle:thin:@//database:1521/orcl.localdomain", "thiago", "senha");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTE");
while(rs.next()) {
ResultSetMetaData rsMetaData = rs.getMetaData();
int columnCount = rsMetaData.getColumnCount();
for(int colIdx = 0; colIdx<columnCount; colIdx++) {
System.out.print(rs.getObject(colIdx+1) + "|");
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
[/sourcecode]
Realizamos de uma maneira “mais JavaBean”:
[sourcecode language=”java” highlight=”1,2,4,5,6,7,8,9,10″]
RowSetFactory rowSetFactory = null;
JdbcRowSet jdbcRs = null;
try {
rowSetFactory = RowSetProvider.newFactory();
jdbcRs = rowSetFactory.createJdbcRowSet();
jdbcRs.setUrl("jdbc:oracle:thin:@//database:1521/orcl.localdomain");
jdbcRs.setUsername("thiago");
jdbcRs.setPassword("senha");
jdbcRs.setCommand("SELECT * FROM CLIENTE");
jdbcRs.execute();
while(jdbcRs.next()) {
ResultSetMetaData rsMetaData = jdbcRs.getMetaData();
int columnCount = rsMetaData.getColumnCount();
for(int colIdx = 0; colIdx<columnCount; colIdx++) {
System.out.print(jdbcRs.getObject(colIdx+1) + "|");
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
[/sourcecode]
Como client de Telnet, iremos utilizar a biblioteca Commons Net da Apache. Faça o download nesse site, descompacte-a e localize o jar da biblioteca. Crie um projeto e adicione as duas libs (jars) no classpath (build path no Eclipse e libraries no JDeveloper e Netbeans). Crie um WebService (JAX-WS) conforme o exemplo abaixo:
]]>Para visualizar a estrutura JNDI do WebLogic. Acesse o console (http://IP:PORTA/console) vá em Environment, Servers, selecione o servidor desejado e clique em View JNDI Tree. Está meio escondido, mas pela imagem abaixo fica mais fácil achar:

Irá abrir uma nova janela onde você visualizar toda estrutura JNDI do server selecionado.
]]>