| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 00:34:24
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
Estava a rever algumas classes que escrevi para um projeto ejb e me deparei com a seguinte situação:
Uso direto e reto bundles e constant object [hardcore java 2004] em meus componentes contudo ainda fico fulo da vida por ter de reiniciar as instâncias dos meus servers quando algum bundle é alterado (duvido que niguém aqui não tenha se deparado com o mesmo problema).
Enfim: preciso de uma forma de reinicializar essas "constantes" só que isso fica difícil com membros estáticos.
Pensei em descarregar as classes com as constantes mas vi que o buraco é mais embaixo (classloader).
Achei o seguinte na web:
http://blog.taragana.com/index.php/archive/how-to-unload-java-class/
http://portal.acm.org/citation.cfm?id=609750
Alguém aqui já fez algo semelhante?
Woody
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 10:28:30
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
Não é bem mais fácil reler os arquivos com as mensagens? Se sim, tem isso pronto já aqui.
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 11:57:12
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
vou dar uma olhada e te digo.
valeu
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 13:57:03
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
cara, continuo na mesma.
Posso usar a classe que vc indicou (ReloadableResourceBundleMessageSource) pra carregar minhas constantes numa boa mas e depois que elas forem carregadas? Lembre que estou usando membros estáticos (isso pra poder identificar qq erro de digitação em tempo de compilação e não ter de procurar nada em cache - fica tudo em mémória).
Essa abordagem precisa ser usada com cautela - eu sei. Carregar muita coisa em memória em vez de só carregar qdo necessário é sempre perigoso. Tento balancear o uso desse artifício limitando-o a alguns casos bem específicos.
Vamos aos exemplos, acho que vai ficar mais fácil de me fazer entender:
ServiceConstants.properties
E o problema persiste: como recarregar as constantes definidas na classe ServiceConstants ?
Woody
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 14:14:54
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Você pode usar reflection ou então usar outro objeto que não String para tuas constantes.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 14:31:16
|
urubatan
Moderador
![[Avatar]](/images/avatar/fe9fc289c3ff0af142b6d3bead98a923.jpg)
Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline
|
ou então faz elas deixarem de ser constantes (ja que é exatamente isto que tu quer, alterar elas, e uma constante não pode ser alterada ... )
ai cria um metodo refresh que le novamente todos os valores.
pode protegelas contra escrita usando AOP ...
|
[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 14:42:45
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
isso resolveria é verdade. Mas eu não quero que elas deixem de ser constantes - deve ter alguma forma de fazer isso - caracas.
Se esse lance do classload não fosse tão arriscado eu mandava ver nele (não conheço ninguém que o tenha usado) - resolveria tudo, bastaria descarregar a classes "constante" e vua-lá (na sua próxima utilização ela seria carregada novamente).
AOP? Tô fora - já vio o peso que essa parada agrega? não conheço ninguém ninguém mesmo usando AOP em produção (só vejo bobeirinhas ou demos pra tentar vender o peixe)
Woody
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 14:49:43
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Primeiro que com classloading você não resolveria o seu problema, pois teria que recarregar TODAS classes do teu sistema.
Segundo, todas maneira que existem são gambiarras porque quer ir contra algo que você mesmo estabeleceu, quer que tuas constantes deixem de ser constantes.
É como querer uma classe tua não possua os métodos wait() de Object, vai contra o sistema de tipos da linguagem.
Em resumo, seja esperto e crie um wrapper para essas Strings e seja feliz. Caso contrario não existe nem garantia que reloading vai funcionar, pois a JVM é livre para propagar os valores de constantes estáticas diretamente para onde bem entender.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 15:41:46
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
louds wrote:Primeiro que com classloading você não resolveria o seu problema, pois teria que recarregar TODAS classes do teu sistema.
Segundo, todas maneira que existem são gambiarras porque quer ir contra algo que você mesmo estabeleceu, quer que tuas constantes deixem de ser constantes.
É como querer uma classe tua não possua os métodos wait() de Object, vai contra o sistema de tipos da linguagem.
Em resumo, seja esperto e crie um wrapper para essas Strings e seja feliz. Caso contrario não existe nem garantia que reloading vai funcionar, pois a JVM é livre para propagar os valores de constantes estáticas diretamente para onde bem entender.
Primeiro, segundo, terceiro? lista de compras?
Desculpe mas vc chegou a ler os dois artigos nos links que postei? Please. Eles falam justamente sobre como resolver esse problema: reescrevendo um classload mais simples.
As constantes continuariam sendo cosntantes (são REFerências tá? não são strings imutáveis) sendo que a "inicialização" destas é que é responsável pela leitura de seus valores do bundle.
Descarregá-las iria facilitar minha vida (se não fosse arriscado), elas não deixariam de ser "constantes". Na verdade essa solução (descarregar classes) já é necessidade de containers de aplicação (jboss, tomcat)
Não sou esperto louds, gosto de pesquisar e um wrapper (ou vários) não iriam resolver sem ter de alterar muita coisa no meu código legado - sorry.
Woody
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 16:58:39
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
agodinhost wrote:
louds wrote:Primeiro que com classloading você não resolveria o seu problema, pois teria que recarregar TODAS classes do teu sistema.
Segundo, todas maneira que existem são gambiarras porque quer ir contra algo que você mesmo estabeleceu, quer que tuas constantes deixem de ser constantes.
É como querer uma classe tua não possua os métodos wait() de Object, vai contra o sistema de tipos da linguagem.
Em resumo, seja esperto e crie um wrapper para essas Strings e seja feliz. Caso contrario não existe nem garantia que reloading vai funcionar, pois a JVM é livre para propagar os valores de constantes estáticas diretamente para onde bem entender.
Primeiro, segundo, terceiro? lista de compras?
Desculpe mas vc chegou a ler os dois artigos nos links que postei? Please. Eles falam justamente sobre como resolver esse problema: reescrevendo um classload mais simples.
As constantes continuariam sendo cosntantes (são REFerências tá? não são strings imutáveis) sendo que a "inicialização" destas é que é responsável pela leitura de seus valores do bundle.
Descarregá-las iria facilitar minha vida (se não fosse arriscado), elas não deixariam de ser "constantes". Na verdade essa solução (descarregar classes) já é necessidade de containers de aplicação (jboss, tomcat)
Não sou esperto louds, gosto de pesquisar e um wrapper (ou vários) não iriam resolver sem ter de alterar muita coisa no meu código legado - sorry.
Woody
Eu olhei, por curiosidade, o segundo é muito superficial e não mostra todos problema envolvidos com classloading. O primeiro cai em uma página de erro da acm.
Eu conheço como funciona classloading em Java e te digo, não da para fazer oque você quer dessa forma.
Uma classe só pode ser descarregada se e somente e ela for coletavel, isto é, ela não estar inclusa no fechamento transitivo de todos objetos tangíveis a partir do root set da aplicação. Todo classloader mantem referência para as classes que ele carrega, logo ela só pode ser coletada quando o classloader dela também for.
Dito isso, quando um método que usa tua classe de constantes for executado, o classloader da classe dele vai tentar carregá-la. Então para você poder fazer tua idéia funcionar o classloader do teu AS vai precisar ser alterado, uma ótima idéia.
Depois disso, você vai ter que contornar o fato que depois que o classloader das classes da tua aplicação encontrar essa classe de constantes ele anota isso internamente. Ou seja, para tua classe ser recarregada, você vai precisar fazer o classloader da tua aplicação ser coletado também.
Moral da história, isso não funciona se você precisa recarregar classes que são usadas por outras que não serão recarregadas. Não dá, simples assim.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2006 17:39:28
|
agodinhost
Virtual Machine Man
![[Avatar]](/images/avatar/b8ffa41d4e492f0fad2f13e29e1762eb.jpg)
Membro desde: 28/03/2006 21:19:16
Mensagens: 590
Localização: RJ, Tijuca
Offline
|
é, alterar código do servidor de aplicação é loucura - já vi na prática gente fazendo isso e as conseqüencias são desastrosas (uma grande revendedora de petróleo do rio fez isso e até hoje usa jboss 2 por causa dessa alteração, alteração tal desnecessária nas versões mais recentes do jboss - era um lance pra corba na vpn).
poxa, isso deveria ser trivial - várias vezes já me deparei com situações em que descarregar um grafo de classes poderia decidir em parar ou não parar meu server.
concordo até a parte do não dá, pode não valer o risco, mas que dá dá (www.platonos.org).
a página da acm tá abrindo direitinho aqui (precisa cadastro).
gostaria de discutir mais esse tema.
Woody
|
"The difference between theory and practice is that, in theory, there is no difference between theory and practice". |
|
|
 |
|
|