Pergunta

Nós construímos uma infra-estrutura de aplicações baseado no ActiveMQ.

Podemos enviar e receber mensagens muito bem, e para a maioria das coisas parte são muito rápidos e OK.

No entanto, temos notado que, se enviar um lote de mensagens "ao mesmo tempo", diz 5.000 mensagens - que ActiveMQ receberá as mensagens para a 3ª aplicação festa na outra extremidade muito rapidamente, e que esta aplicação irá processar também muito rapidamente, e que ele irá en fila as respostas de volta para o corretor rapidamente também, dizer menos de um minuto.

Mas por alguma razão, o nosso VB.NET EXE que originou as mensagens em primeiro lugar só aparece para ser o processamento das mensagens de retorno que recebe de forma irregular, às vezes fazendo cerca de um por segundo, por vezes, fazer pausas durante uma hora ou assim e, em seguida, volta a um por segundo indo.

Origin (VB.NET EXE which we manage) 
    -> Broker  (which we manage)
        -> (3rd party app) 
            -> back to the same broker 
                -> back to the origin app.

O receptor está aguardando a MessageListener evento a partir de código C # baixado ActiveMQ talvez 9 meses atrás:

Public Delegate Sub MessageListener(ByVal message As NMS.IMessage)
     Member of: NMS

Eu acho que o que está acontecendo é que MessageListener só nos dá uma mensagem (NMS.IMessage) para mastigar, e é isso que temos o processo.

Existe alguma maneira de dizer "Em um evento de MessageListener, por favor, ver se há outras mensagens na fila agora e fazê-los todos"?

Foi útil?

Solução

Acontece que, nós pensamos que sabemos um pouco mais agora do que se trata.

Quando o nosso VB.NET WinForms aplicativo que usa o ActiveMQ DLL, eventualmente, deixa de funcionar, o que tende a fazer algumas vezes por semana, temos um programa de vigilância que usa as PsList e PsKill utilitários Winternals para colher o zumbi e inicie uma nova conexão do cliente.

Quando isso acontece, usando jconsole para analisar os shows corretor nós que a sessão do zombie ainda está registrado, e assim é o novo cliente fresco.

A minha teoria agora é que quando AMQ vê ambas as sessões, ele tenta começar a distribuir mensagens para ambas as sessões de estilo round-robin. AMQ tenta enviar a mensagem para o zumbi, que não responde. Depois de um determinado período de tempo (um segundo talvez) AMQ desiste e vai para a próxima sessão na lista, o novo cliente fresco.

Em algum momento, o corretor ou pilha TCP provavelmente percebe que o zumbi não manteve a sua conexão TCP ativa e dá-se; em seguida, a operação volta ao normal.

Portanto, a questão torna-se, como escrever um cliente ActiveMQ que a) não morrer ou b) morre graciosamente, desligando-o da sessão no processo?

Edit: upgrade para a próxima versão do ActiveMQ resolvido isso. Também tivemos um único aplicativo fazer o envio e recepção, mas não era threadsafe - por isso, se ele recebeu enquanto estava tentando enviar isso causou as falhas. Nós re escreveu-lo como duas aplicações de console, que enviou os dados e que os dados recebidos. Não há mais falha. Além disso, a versão mais antiga do ActiveMQ estávamos usando no momento não lidar com falhas graciosamente, a atualização para o 4.x resolvido isso.

Outras dicas

Eu sugiro relatório até a Usuário Fórum juntamente com talvez levantando uma href="http://activemq.apache.org/camel/support.html" rel="nofollow noreferrer"> problema de suporte

scroll top