Problema com threads ajax

olá pessoal do PJ estou com um problema na exceução de um script ajax,
onde necessito que o dwr exceute 2 threads assincronas, mas ao executa-las noto que somente uma executa com sucesso!

estou utilizando o DWR 2.0 rodando o container web Tomcat em windows, no caso se eu rodar o Tomcat no linux e acessar meu script no firefox em windows funciona perfeitamente, mas com o tomcat em windows, parece que ele perde a uma das threads se perde e nuca retorna para o navegador.

OBS: as threads executan simultaneamente e sendo que a primeira a ser executada espera que a segunda termine a sua exceução para que esta continue a excecução e termine, ou seja a primeira thread espera que a segunda termine para que ela possa terminar com sucesso!

se alguém tiver uma idéia do que pode estar acontecendo me ajude por favor.

desde já muito obrigado a todos.

Cara acho que o que vc procura é o call bacth ou seja chamadas em Bacth o dwr tem isso

http://getahead.org/dwr/browser/engine
http://getahead.org/dwr/browser/engine/batch

Ou vc pode setar na sua chamada para ele ser NAO assincrono…dependendo do seu contexto.

algo do tipo…setando ele como nao assincrono, ou seja depois que ele terminar esse ele vai executar o outro…ai vc pode deixar o outro caso deseje dentro do seu callback ai vai depender da sua implementacao.

FacadeAjax.setFormulario('formularioCadastro.html',{
	callback:function(data){
				    
	},
       errorHandler:function(errorString, exception) {},
       timeout:50000
      ,async:false
 });

http://getahead.org/dwr/browser/engine/options

Boa sorte…

handersonbf valeu pela ajuda, acho que me expressei mal a repeito do meu problema e por isso estou postando uma complementacao, para esclarecer um pouco melor as coisas.

mas mesmo assim foi muito boa a sua dica e certamente irei usar.
muito legal o uso do Bacth para exceutar varias rotinas.

FacadeAjax.setFormulario('formularioCadastro.html',{
   callback:function(data){
               
   },
       errorHandler:function(errorString, exception) {},
       timeout:50000
      ,async:false
 }); 

fiz algumas modificações no meu fonte que segue abaixo…

    ......
    private int timeout=60000;

    .....
    public Object myFunction(String attributeName,ScriptBuffer callScript) {
        
        System.out.println("request time:"+System.currentTimeMillis());
        Engine en=new Engine(WebContextFactory.get().getScriptSession());
        en.setAsync(true);
        en.setActiveReverseAjax(true);
        en.addScript( callScript );
        
        // esperando um pouco
        long initTime = System.currentTimeMillis();
        while( true ){
            if( WebContextFactory.get().getSession().getAttribute(attributeName) != null )
                    break;
            if( System.currentTimeMillis()-initTime >= this.timeout ){
                System.out.println("Time OUT!!!"+System.currentTimeMillis());
                break;
            }
        }
        if( WebContextFactory.get().getSession().getAttribute(attributeName)==null ){
            throw new Exception("Timeout esgotado");
        }else{
            return WebContextFactory.get().getSession().getAttribute(attributeName);
        }
    }
    
    //metodo chamado apos excecução da rotina!!
    public void retMyFunction(attributeName,valor) {
        System.out.println("Retornou!")
        WebContext wctx = WebContextFactory.get();
        wctx.getSession().setAttribute( attributeName, valor );
    }
    ...

e agora o que acontece é que retMyFunction leva axproximadamente 20 segundos para ser chamada. o que é pouco performatico levando em conta que a callScript excecuta quase instantaniamente.

seria algum problema relacionadoa excecução de threads no windows?
ou com concorrencia entre os requests ajax?, ou pelo modo com que o script foi feio?

mas desejá obrigato a todos!

cara realmente nao consegui entender o seu codigo rsrsrsr

mais tipo…vc ta gerando a funcao que seria um javascript no java nao eh isso ?

Pq eu nao estou realmente entendendo o seu problema.vamos ver se entendi me corrija entao…

Vc que executar dois comandos(metodos e tal) simultaneamente, so que o segundo depende do primeiro eh isso ?
Mais se o segundo depende do primeiro para que executar simultaneamente ? isso que ta vamos dizer me travando para entender…

Me explique o contexto, onde vc ta usando isso, qual a finalidade talvez tenha outra solucao nao sei…queria entender o seu contexto o contexto da aplicacao no caso da funcionalidade.

Pelo que tinha entendido antes , entendi que vc queria fazer uma chamada a algum metodo da classe java, e depois que a mesma terminasse vc chamaria outro…com as dicas que te passei vc resolve isso…so que vc falou que nao era isso entao me perdi…

uma maneira ate mais simples do que a te passei eh vc fazer chamadas em cascata…algo do tipo…

[code]

FacadeAjax.metodo1(parametro,{
callback:function(data){

FacadeAjax.metodo1(parametro,{
callback:function(data){

},
errorHandler:function(errorString, exception) {},
timeout:50000
,async:false
});

},
errorHandler:function(errorString, exception) {},
timeout:50000
,async:false
});

[/code][/quote]

putz maldito teclado…

continuando…

FacadeAjax.metodo1(parametro,{
   callback:function(data){
        //executa o retorno do 1 metodo que é a chamada para o segundo..

        FacadeAjax.metodo2(parametro,{
            callback:function(data){
                    //executa o retorno do segundo metodo....
             },
               errorHandler:function(errorString, exception) {},
               timeout:50000
               //retirando essa propriedade seu metodo fica ASSINCRONO
              ,async:false
           });           
   
   },
       errorHandler:function(errorString, exception) {},
       timeout:50000
       //retirando essa propriedade seu metodo fica ASSINCRONO
      ,async:false
 }); 

Bem os dois estão como nao assincrono, mais é só retirar a propriedade ,async:false que OS DOIS vao ficar assincrono como vc quer…ele vai tipo executar em modo assincrono e quando um terminar ele ja executa o outro no modo assincrono tbm…era isso ?

Abraços

é apos esta discussao estou chegando a conclusao que o problema pode nao se o ajax, mas vamos lá.

bom é o seginte, o cliente chama uma funcao do servidor atravez do dwr,
essa chamada espera que um parametro seja retornado, que no caso seria a nossa segunda thread, na qual executa um script no cliente e retorna atratravez do metodo:

    //metodo chamado apos excecução da rotina!!
    public void retMyFunction(attributeName,valor) {
        System.out.println("Retornou!")
        WebContext wctx = WebContextFactory.get();
        wctx.getSession().setAttribute( attributeName, valor );
    }

quando esse metodo for chamado ele seta um atributo na sessao onde este é esperado pelo metodo

public Object myFunction(String attributeName,ScriptBuffer callScript) { .... }

e somente entao se continua a execução so script da primeira chamada

por isso a necessidade de uma execução assincrona, senao eu nao conseguiria executar o metodo de retorno porque ele ficaria esperando minha primeira chamada terminar o que nunca ocorreria.

obs: este script é parte de uma implemetação de segurança em um sistema que estou trabalhando.

espero que eu tenha esclarecido a função do meu fonte.

ralmente eu poderia modificar meu fonte para funcionar do modo com que voce me mostro, e de fato farei se for necesssario!

o que realmente está me deixando intrigado é o fato do meu fonte funcionar, mas com uma perda muito grande de performace;

valeu pela força handersonbf, se lhe interesar teste meu fonte que te passei, e veja que ocorre, acho que vai ser interessante :grin: .