BizTalk和自定义绑定,并禁用接收位置



我已经基于RabbitMQ.ServiceModel 为BizTalk创建了一个自定义绑定(System.ServiceModel.Channels.binding(

https://github.com/CymaticLabs/Unity3D.Amqp/tree/master/lib/rabbitmq-dotnet-client-rabbitmq_v3_4_4/projects/wcf/RabbitMQ.ServiceModel/src/serviceModel

当队列不存在时,我正在尝试禁用我的接收位置。我可以检测到队列在RabbitMQInputChannel.cspublic override void Open(TimeSpan timeout)中丢失,但我不知道如何禁用我的接收位置。

https://github.com/CymaticLabs/Unity3D.Amqp/blob/master/lib/rabbitmq-dotnet-client-rabbitmq_v3_4_4/projects/wcf/RabbitMQ.ServiceModel/src/serviceModel/RabbitMQInputChannel.cs

namespace RabbitMQ.ServiceModel
{
internal sealed class RabbitMQInputChannel : RabbitMQInputChannelBase // Implement interface IChannel and IInputChannel
{
[...]
public override void Open(TimeSpan timeout)
{
try
{
if (State != CommunicationState.Created && State != CommunicationState.Closed)
{
this.Close();
throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State));
}
OnOpening();
string queueName = m_bindingElement.QueueName;
string key = m_bindingElement.RoutingKey == null ? string.Empty : m_bindingElement.RoutingKey;
string exchange = m_bindingElement.ExchangeName;

if (m_bindingElement.QueueDeclare)
{
try
{
m_model.QueueDeclare(queueName, true, false, false, null);
}
catch (Exception ex)
{
}
}

//Listen to the queue
m_consumer = new EventingBasicConsumer(m_model);
m_consumer.ConsumerCancelled += OnConsumerCancelled;
m_consumer.Received += (sender, args) => m_queue.Add(args);
m_model.BasicConsume(queueName, false, m_consumer);
OnOpened();

}
catch(Exception ex)
{
EventLogHelper.WriteError(ex.Message);
this.Close();
}
}
private void OnConsumerCancelled(object sender, ConsumerEventArgs e)
{
// HERE I WANT TO DISABLE MY RECEIVE LOCATION
}
}
}

首先要在WCF自定义接收位置上启用DisableLocationOnFailure属性。

然后,当队列丢失时,您需要在方法IInputChannel.TryReceive中引发异常。

最新更新