我正在写一段代码,这将允许我们:
前2分我没有问题; 使用Peek接收模式,我可以显示消息列表,我们可以编辑和重新发送,没有任何问题.
当我想从死信队列中删除消息时,问题就来了.
我们如何通过消息级别对消息执行此操作?我们可能只想删除驻留在死信队列中的2条消息,并保留其他消息以便稍后查看.调用.Complete()死信队列中的消息是否像在主订阅中那样删除它?
以供参考; 这是我们获取SubscriptionClient死信队列的代码:
private SubscriptionClient GetOrCreateSubscriptionClient(string connectionString)
{
if (!NamespaceManager.TopicExists(_topicName))
{
NamespaceManager.CreateTopic(new TopicDescription(_topicName)
{
MaxSizeInMegabytes = 5120,
DefaultMessageTimeToLive = TimeSpan.FromSeconds(DEFAULT_LOCK_DURATION_IN_SECONDS)
});
}
if (!NamespaceManager.SubscriptionExists(_topicName, _subscriptionName))
{
NamespaceManager.CreateSubscription(_topicName, _subscriptionName);
}
var deadLetterPath = SubscriptionClient.FormatDeadLetterPath(_topicName, _subscriptionName);
var client = SubscriptionClient.CreateFromConnectionString(
connectionString, deadLetterPath, _subscriptionName, ReceiveMode.PeekLock);
return client;
}
Run Code Online (Sandbox Code Playgroud) 我在监测和固定的消息编写功能dead letter queue的topic subscription在Azure上.
我可以得到一个_subscriptionClient.PeekBatch(10)用于显示的消息列表; 但是,当我们想要实际删除其中一条消息时,我们会陷入困境.
工作流程将是:
.Complete().问题是,虽然我们有消息列表,但我们不能先.Complete()使用特定的消息.subscriptionClient.Receive().
由于你不能通过.Receive()MessageId发送消息,这是否意味着我们必须逐个遍历消息,如下所示?
public BrokeredMessage GetMessageById(string messageIdentifier)
{
BrokeredMessage matchingMessage = null;
var messageNotFound = true;
var messagesToAbandon = new List<BrokeredMessage>();
while (messageNotFound)
{
var message = _subscriptionClient.Receive();
if (message == null)
{
throw new Exception("Could not find the message on the queue");
}
if (message.MessageId == messageIdentifier)
{
messageNotFound = false;
matchingMessage = message;
}
else …Run Code Online (Sandbox Code Playgroud) 我一直在这里关注这篇文章:
http://blogs.msdn.com/b/sqlcat/archive/2011/03/08/linked-servers-to-sql-azure.aspx
如何将链接服务器从SQL Server 2008 R2设置为SQL Azure实例.我使用SQL Native Client 10.0作为ODBC驱动程序,并通过显示连接有效的默认数据库进行判断; 但是,当我尝试建立链接服务器时,如上文所述; 我收到以下错误:
用于链接服务器"Azure_Test"的OLE DB提供程序"MSDASQL"返回消息"[Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序".
现在我看到一些论坛帖子(不幸的是没有结论)表明它可能是64位问题.有没有人从本地实例成功地将链接服务器设置为SQL Azure?
编辑:戴维斯的答案确实是正确的; 只是以为我会分享这个我发现你现在可以用链接服务器做的很棒的事情:
DELETE OPENQUERY (AzureTest,
'SELECT * FROM [AzureDB].static.MyTable');
INSERT OPENQUERY (AzureTest,
'SELECT * FROM [AzureDB].static.MyTable')
SELECT *
FROM static.MyTable
SELECT * FROM OPENQUERY(AzureTest, 'SELECT * FROM [AzureDB].static.MyTable')
Run Code Online (Sandbox Code Playgroud) 在C#中修改私有方法中的对象很常见,因为它们通常是引用类型而不是值类型,例如:
public void Main()
{
var person = new Person();
SetPersonsName(person);
System.Writeln(person.Firstname + " " + person.Lastname);
}
private void SetPersonsName(Person person)
{
person.Firstname = "Jimi";
person.Lastname = "Hendrix";
}
Run Code Online (Sandbox Code Playgroud)
Firstname和Lastname应用于对象,并且将在我们通过引用传递对象时指向它(指向它在内存中的位置)而不是像我们为value-types所做的那样创建对象的副本.
那么如果我们有一个IQueryable并使用相同的方法将Where子句添加到对象集合中,如下所示呢?
public void Main()
{
// Returns Jimi Hendrix and Justin Bieber
var people = _workspace.GetDataSource<Person>();
FilterByRockGods(people);
foreach(var person in people)
{
// Will still print "Jimi Hendrix" and "Justin Bieber"
// Should only print "Jimi Hendrix" (obviously)
System.Writeln(person.Firstname + " " + person.Lastname);
}
}
private void FilterByRockGods(IQueryable<Person> …Run Code Online (Sandbox Code Playgroud) 我们在Azure Service Bus客户端周围有以下包装器:
public virtual void SendMessage(object bodyObject)
{
var brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject);
_queueClient.Send(brokeredMessage);
}
Run Code Online (Sandbox Code Playgroud)
由以下SerializeMessageBody组成:
public BrokeredMessage SerializeMessageBody(object bodyObject)
{
var brokeredMessage = new BrokeredMessage(bodyObject);
brokeredMessage.Properties[MESSAGE_TYPE_PROPERTY_KEY] =
bodyObject.GetType().AssemblyQualifiedName;
return brokeredMessage;
}
Run Code Online (Sandbox Code Playgroud)
我编写了一个集成测试,通过运行SendMessage然后使用Service Bus Explorer 2.0查看消息内容来检查这是否有效.我们这样做是为了确保我们可以使用该工具修改和重新发送消息来修改XML.我发送的消息如下:
[DataContract]
public class TestServiceBusMessage
{
[DataMember]
public Guid ExternalIdentifier { get; set; }
[DataMember]
public int Identifier { get; set; }
[DataMember]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是; 当在工具上查看邮件正文时,而不是看起来像XML,而是如下所示:
@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/XMLSchema-instance@ExternalIdentifier?$13d81b90-d932-437f-a11c-9106412b6c4a@
Identifier?& @Name?Test Message
Run Code Online (Sandbox Code Playgroud)
我认为这是一个编码问题; …
我们在Windows Azure上以Web角色托管了一个API,其中有2个实例接收请求,验证它们然后将它们添加到Azure Service Bus队列.
最近我们开始加载测试,发现我们当前的代码抛出以下异常:
无法向命令队列添加命令异常:Microsoft.ServiceBus.Messaging.QuotaExceededException:已达到或超过队列的最大连接数.活动连接数:100,允许的最大连接数:100.
假设我们维护了一个类的实例,下面的客户端代码是否会保持单个连接打开?我试图确定问题是与ServiceBusClient代码或我们的依赖注册是否为每个请求初始化一个新客户端.
public class ServiceBusClient : IDisposable
{
#region Constants and Fields
protected readonly NamespaceManager NamespaceManager;
private const int DEFAULT_LOCK_DURATION_IN_SECONDS = 300; // 5 minutes
private const string SERVICE_BUS_CONNECTION_STRING_KEY
= "service.bus.connection.string";
private readonly IMessageBodySerializer _messageBodySerializer;
private readonly MessagingFactory _messagingFactory;
private readonly QueueClient _queueClient;
private readonly string _queueName;
private readonly ISettingsManager _settingsManager;
#endregion
#region Constructors and Destructors
public ServiceBusClient(
ISettingsManager settingsManager,
IMessageBodySerializer messageBodySerializer, s
tring queueName)
{
_settingsManager = settingsManager;
_messageBodySerializer = messageBodySerializer;
var connectionString = …Run Code Online (Sandbox Code Playgroud) 无论一个主题上在Azure Service Bus和相关的认购暴露的DefaultMessageTimeToLive财产; 初始化如下:
if (!NamespaceManager.TopicExists(TopicName))
{
NamespaceManager.CreateTopic(
new TopicDescription(TopicName)
{
MaxSizeInMegabytes = 5120,
DefaultMessageTimeToLive = TimeSpan.FromDays(14)
});
}
if (!NamespaceManager.SubscriptionExists(TopicName, SubscriptionName))
{
NamespaceManager.CreateSubscription(
new SubscriptionDescription(TopicName, SubscriptionName)
{
LockDuration = TimeSpan.FromMinutes(5),
DefaultMessageTimeToLive = TimeSpan.FromDays(7),
EnableDeadLetteringOnMessageExpiration = true
});
}
Run Code Online (Sandbox Code Playgroud)
两者有什么区别,有两个TTL设置的目的是什么?此外; 如果消息在主题上过期会发生什么?
如果我在现有的RavenDB会话上运行以下查询:
var result = session.Query<Location>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Where(l => l.Name = "Home" && !l.Deleted);
Run Code Online (Sandbox Code Playgroud)
RavenDB等待哪些索引?我的假设是它等待查询时所有索引都是最新的; 但是,这是否意味着如果Location其他表上只有一个动态索引而是20个索引,那么我们总是在等待21个索引更新?
或者,我是否误解了该方法的功能?
在SQL Server 2008 R2中,您可以在调试死锁时使用以下命令查找所有打开的事务:
DBCC OPENTRAN
Run Code Online (Sandbox Code Playgroud)
但是,该功能在Windows Azure SQL数据库中不可用; 它改为抛出错误:
"DBCC command 'OPENTRAN' is not supported in this version of SQL Server."
Run Code Online (Sandbox Code Playgroud)
该sp_who2存储过程也不存在.
在Azure版本的SQL Server中获取所有打开的事务的正确查询是什么?
我知道ServicePointManager.ServerCertificateValidationCallback.Net Core中不再存在,而是替换为:
using(var handler = new System.Net.Http.HttpClientHandler())
{
using (var httpClient = new System.Net.Http.HttpClient(handler))
{
handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) =>
{
return true;
};
}
}
Run Code Online (Sandbox Code Playgroud)
但是我们目前正在使用该ServiceStack.Core库,据我所知,该库不会暴露像这样的属性或处理程序本身.
我如何告诉ServiceStack客户端在此代码中绕过ssl验证?
using(var client = new JsonServiceClient("https://www.google.com"))
{
var response = client.Get("/results");
}
Run Code Online (Sandbox Code Playgroud)
如果有办法,Windows和Linux上的工作方式是否相同?
在我们的应用程序中,我们强制存储为字符串的所有日期都应采用ISO 8601格式.因此,例如,如果我们在Lucene索引中存储日期,我想确保它始终以以下格式存储:
2014-03-12T23:03:13Z
Run Code Online (Sandbox Code Playgroud)
我们有一个扩展方法DateTime.ToISO8601DateTimeString(),可以轻松实现现有代码的单元测试,确保始终如此.
我想知道是否有可能确保DateTime.ToString()永远不会在代码中调用(除了它的重载)?
可能的路线:
DateTime.ToString()异常有没有人用过类似的方法成功地实现了这个目标?
为了澄清,我希望这是应用程序范围,如果在项目调用中的任何地方添加新代码,则会自动失败 DateTime.ToString()
我有以下代码使用yield来构建集合:
public IEnumerable<Comment> GetComments(
IEnumerable<ContentItem> commentContentItems)
{
foreach (var commentContentItem in commentContentItems)
{
var Comment = new Comment
{
CommentCreatedByName = commentContentItem.InitiatorName,
CommentCreatedByID = commentContentItem.CreatedByID,
ContentItemID = commentContentItem.ContentItemID,
CommentDate = commentContentItem.CreatedDate
};
yield return Comment;
}
}
Run Code Online (Sandbox Code Playgroud)
我想开始检查项目是否被删除,如果是,则以不会将已删除的项目添加到集合中的方式生成.
我知道我可以使用linq来减少这样的集合:
foreach (var commentContentItem in commentContentItems.Where(x => !x.Deleted))
Run Code Online (Sandbox Code Playgroud)
但为了争论; 你会怎样使用收益率,比如收益率更高的情况?
例如:
if (commentContentItem.Deleted)
{
yield return null;
}
Run Code Online (Sandbox Code Playgroud) 在页面加载我正在检查是否已批准ahstationStatus标志我想要选中复选框,下面的实现它不起作用,任何想法实现错误.
main.html中
<div class="col-md-3">
<label class="radio-inline">
<input type="checkbox"
ng-model="aprv"
name="attestorFlag"
id="attestorFlag"
ng-value="'Y'"> I attest
</label>
</div>
Run Code Online (Sandbox Code Playgroud)
main.js
if ($scope.attestorObj.attestationStatus === 'approved') {
$scope.aprv = 'Y';
}
Run Code Online (Sandbox Code Playgroud) c# ×10
azure ×7
.net ×1
.net-core ×1
angularjs ×1
dead-letter ×1
encoding ×1
indexing ×1
iqueryable ×1
javascript ×1
linq ×1
linux ×1
odbc ×1
oledb ×1
queue ×1
ravendb ×1
reflection ×1
servicestack ×1
sql ×1
sql-server ×1
unit-testing ×1