Maneira de fazer uma solicitação ruim em uma fila de letras mortas ao usar o JAX-RPC?
Pergunta
Estou usando o JAX-RPC 1.1 para gerar serviços para um conjunto de aplicativos em execução foi 6.0, comunicando-se via WebSphere MQ. Um mainframe estará enviando mensagens para os Serviços; portanto, se, por algum motivo, a mensagem não puder ser convertida em objetos (provavelmente devido à estranheza ebcdic-to-ASCII), a mensagem precisa ser colocada na fila de letra morta para exame .
Alguém sabe se existe uma maneira padrão de fazer isso (ou seja, fornecendo o JMS:/ endereço com um nome DLQ) ou se o forwarding do DLQ precisará ser executado manualmente de alguma forma?
Solução
Primeiro, deixe -me recomendar que você não confie no DLQ para isso. O DLQ é um recurso de nível QMGR usado para armazenar mensagens que o canal não pode resolver. Por ser um vetor de ataque em potencial, a maioria das lojas conscientes da segurança não concede acesso a aplicativos ou, se o fizerem, é o acesso somente para a colocação.
A melhor maneira de fazer isso é criar uma fila de exceção específica do aplicativo. Se o aplicativo tiver várias filas de entrada, todas elas poderão usar a mesma fila de exceção e, em seguida, a equipe de suporte do aplicativo poderá gerenciar qualquer mensagem que aterrisse lá sem os problemas de segurança.
Qualquer que seja o caminho, conseguir que o aplicativo honre isso é extremamente fácil. Por exemplo, suponha que seu aplicativo esteja lendo Jax.svc.request. Você define a fila de exceção e aponta os campos boq*:
Def Ql (Jax.svc.exception) Alter QL (Jax.svc.request) boqname (Jax.svc.exception) boqthresh (5)
As classes JMS perguntam sobre os atributos BOQ* da fila quando ela for aberta e verifique a contagem de backup de cada mensagem lida. No seu programa, use uma sessão transativa e, se você não puder processar a mensagem, ligue para o método session.backout (). A mensagem será lida e não foi mais apoiada do que os tempos do BathShesh, depois foi solicitado à fila nomeada no BoqName. Se essa fila estiver cheia ou indisponível, o DLQ será tentado. Se isso falhar, as classes lançarão uma exceção.
Escolhemos um bothresh> 1 para permitir a possibilidade de uma mensagem processável ser apoiada se, por exemplo, o QMGR for desligado.
Normalmente, eu aciono a fila de exceção para que ela possa levantar um alarme ou enviar um email se algo cair nela. Se você tiver uma ferramenta de monitoramento, pode verificar a profundidade> 0.
Se, por algum motivo, você não quiser usar a funcionalidade JMS para solicitar automaticamente a mensagem, o aplicativo precisará de lógica para solicitá -la. Se você colocar a mensagem no DLQ, desejará prender um cabeçalho DLQ. Não fazer isso provavelmente quebrará o manipulador DLQ ou qualquer outra instrumentação assistindo a essa fila.