Pergunta

Desenvolvemos um canal WCF personalizado que se comunica via IBM WebSphere MQ.

Nós criamos uma fábrica de canais:

public class MqChannelFactory : ChannelFactoryBase<IRequestChannel>

Que retorna instâncias do nosso canal:

public class MqRequestChannel : ChannelBase, IRequestChannel

Conectar -se ao IBM MQ Queue Manager é uma operação cara. Atualmente, fazemos isso em canal.onopen ().

Seguindo as diretrizes para o uso correto dos canais, somos Callign ChannelfAlactory.createChannel () Cada vez que precisamos de um canal, enviando a mensagem e chamando canal.close ().

Nossa suposição era que o pool de canais executados em canais, de modo que, quando quando o canal.close () foi chamado, o canal não foi realmente fechado, mas retornou à piscina. Mas, toda vez que chamamos de canalfactory.createchannel, um novo canal está sendo instanciado e, quando a solicitação é enviada, a abertura do canal cara é executada.

Então, a pergunta: qual é a melhor abordagem para impedir que o canal seja aberto em todas as solicitações?

Algumas das opções que estamos investigando:

  • Existe de alguma forma através da configuração para especificar que o pool de canais deve ocorrer? Deveríamos implementar nosso próprio pool de canais em nossa história do Channel?

  • Devemos apenas manter nosso canal aberto para a vida útil do aplicativo, enviando todas as solicitações através dele?

  • Devemos executar a operação cara (conectando -se ao gerente da fila) na fábrica de canais, que abordamos a vida útil do aplicativo?

Foi útil?

Solução

Realmente não existe uma regra dura e rápida sobre qual é a melhor opção. Inicialmente, eu diria que a solução possivelmente mais fácil seria cache os canais de clientes no nível do aplicativo. Dependendo da sua implementação, isso pode exigir algum trabalho de sincronização, btw.

Você poderia potencialmente reunir conexões no nível do canal de faculdades. Eu hesitaria em reunir canais inteiros (sempre há alguma complexidade lá), mas você pode reunir conexões internamente e ter canais adquirir conexões quando necessário da piscina mantida pela fábrica de canais.

Isso tem a vantagem que o cliente da base já caches Instâncias do ClientFactory a partir do .NET 3.0 SP1, para que isso possa facilitar o código do aplicativo (se você estiver usando).

A desvantagem, porém, é que isso pode ficar mais difícil de implementar E se O endereço do endpoint possui informações necessárias para abrir a conexão com o gerenciador de filas, porque você pode criar canais para diferentes endereços de endpoint a partir de um único objeto ChannelFactory. Provavelmente, isso significa que você precisará proibir explicitamente isso, ou que sua implementação do ChannelFactory pode precisar manter vários pools de conexão internamente (um por endereço de endpoint ou algo assim).

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