Pergunta

Criei um script para monitorar um conjunto de filas e, embora funcione perfeitamente com filas privadas remotas, ele não funciona com filas de saída. Fiz um experimento removendo tudo, menos o essencial do script e criei o seguinte script de teste:

var info = new ActiveXObject("MSMQ.MSMQQueueInfo");
info.FormatName = /*<Queue name>*/;

// 0x80 = MQ_ADMIN_ACCESS
// 0x20 = MQ_PEEK_ACCESS
// 0x00 = MQ_DENY NONE
var mq = info.Open(0x80 | 0x20, 0x00);

var msg = mq.PeekCurrent(false, true, 0); 
if (msg != null) {
    WScript.echo("message found");  
}
else
{
    WScript.echo("Nothing");
}
mq.close();

Eu o executei no servidor e, mesmo que a fila contenha mais de mil mensagens, Peekcurrent sempre retorna nulo. Se eu remover MQ_ADMIN_ACCESS, ele tentar se conectar à fila privada remota e ele se destaca (como esperado, como está descendo para deixar as mensagens acumularem). Se eu iniciar a fila privada remota, ela lê a mensagem corretamente.

Por curiosidade, eu descobri que info.open Sempre é bem -sucedido, independentemente do nome da fila (ou seja, existe ou não) quando o MQ_Admin_Access for usado. Por exemplo, eu digitei "Direct = OS: Qualquer que seja Private $ RandomQueuename" e não recebi nenhum erro.

Não sou especialista em MSMQ (exatamente o oposto), então provavelmente estou cometendo um erro óbvio e não consigo vê -lo. Qualquer ajuda é mais do que bem -vinda. Obrigado.

Pergunta lateral: É possível espiar uma fila de saída remota? No momento, o script está em execução na máquina, onde está localizada a fila de saída, mas não é a única com essas filas. Eu gostaria de evitar implantar o script em todos os lugares, prefiro tê -lo em um único local. Obrigado.

Foi útil?

Solução

Eu encontrei as respostas para as duas perguntas:

  • O problema que eu estava tendo se deveu ao fato de tentar monitorar uma fila MSMQ que estava sendo executada como parte de um grupo de recursos de cluster, enquanto o script estava em execução sob a sessão atual do console. Para acessar uma fila dentro de um grupo de recursos de cluster, o seguinte deve ser feito:

    1. Crie um novo aplicativo genérico
    2. Recurso dentro do grupo em que o serviço MSMQ está em execução e aponte para o seu script.
    3. Na configuração do novo recurso, adicione o serviço MSMQ como uma dependência.
    4. Certifique -se de que a caixa de seleção "Use o nome da rede como nome do computador" é verificado.

Feito, seu script agora se conectará ao serviço MSMQ em execução dentro do grupo de cluster.

  • As filas de saída não são filas reais, mas podem ser vistas como uma "lista de mensagens, agrupadas pela fila a que estão destinadas". Portanto, eles não podem ser monitorados remotamente. Isso significa que, para monitorá -los, o script/aplicativo que faz isso deve ser implantado em cada máquina e, em um ambiente em cluster, uma instância deve ser executada em cada grupo de cluster. Isso adiciona uma sobrecarga significativa se houver muitos servidores, mas pode ser superado criando um sistema centralizado. Grande tarefa de qualquer maneira ...

Espero que minhas descobertas sejam úteis para alguém no futuro. :) De volta ao assado de pizza ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top