문제

우리는 IBM WebSphere MQ를 통해 통신하는 맞춤형 WCF 채널을 개발했습니다.

우리는 채널 공장을 만들었습니다.

public class MqChannelFactory : ChannelFactoryBase<IRequestChannel>

채널의 인스턴스를 반환합니다.

public class MqRequestChannel : ChannelBase, IRequestChannel

IBM MQ 큐 관리자에 연결하는 것은 비용이 많이 드는 작업입니다. 현재 Channel.onopen () 에서이 작업을 수행합니다.

채널을 올바르게 사용하기위한 지침에 따라 Callign ChannelFactory.createChannel ()이 필요할 때마다 메시지를 보내고 메시지를 보내고 채널을 호출합니다.

우리의 가정은 Channeflactory가 채널의 풀링을 수행했다고 가정했기 때문에 Channel.close ()가 호출 될 때 채널이 실제로 닫히지 않고 오히려 수영장으로 돌아 왔습니다. 그러나 우리는 channelfactory.createchannel을 호출 할 때마다 새로운 채널이 인스턴스화되고 요청이 전송되면 비싼 채널 개방이 수행됩니다.

따라서 질문 : 모든 요청에서 채널이 열리지 않도록하는 가장 좋은 방법은 무엇입니까?

우리가 조사하는 옵션 중 일부 :

  • 채널 풀링이 이루어져야한다고 지정하기위한 구성을 통해 어쨌든 있습니까? Channeflactory에서 자신의 채널 풀링을 구현해야합니까?

  • 응용 프로그램 수명을 위해 채널을 열어두고 모든 요청을 통해 모든 요청을 보내야합니까?

  • 채널 공장에서 값 비싼 작업 (대기열 관리자에 연결)을 수행 해야하는데, 이는 응용 프로그램 수명을 위해 캐시해야합니까?

도움이 되었습니까?

해결책

최선의 선택이 무엇인지에 대한 어려운 규칙은 없습니다. 처음에는 가장 쉬운 솔루션이 응용 프로그램 수준에서 클라이언트 채널을 캐시하는 것입니다. 구현에 따라 일부 동기화 작업이 필요할 수 있습니다. BTW.

Channeflactory 레벨에서 연결을 풀 수 있습니다. 나는 전체 채널을 풀을 주저 할 것이지만 (항상 약간의 복잡성이 있습니다), 내부적으로 연결을 풀을 풀고 채널 공장에서 보유한 수영장에서 필요할 때 채널이 연결을 획득 할 수 있습니다.

클라이언트베이스의 이점이 있습니다 이미 캐시 ClientFactory Instances .NET 3.0 SP1 기준으로 응용 프로그램 코드에서 더 쉽게 사용할 수 있습니다 (사용하는 경우).

그러나 단점은 이것이 구현하기가 더 어려워 질 수 있다는 것입니다. 만약에 엔드 포인트 주소에는 단일 channelfactory 객체에서 다른 엔드 포인트 주소에 대한 채널을 생성 할 수 있기 때문에 큐 관리자에 대한 연결을 열는 데 필요한 정보가 있습니다. 아마도이를 명시 적으로 허용하지 않거나 ChannelFactory 구현이 여러 연결 풀을 내부적으로 유지해야 할 수도 있음을 의미합니다 (엔드 포인트 주소 또는 이와 유사한 것).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top