我想在SQL Server Management Studio中清除队列,但我不想删除整个队列中的队列内容(消息).
谢谢,塞纳
我是一个Sql Server Service Broker新手,我正在尝试掌握为一个(看似)简单的用例设置Service Broker的最佳方法:我想创建一个简单的工作队列,其中一个应用程序将工作项丢弃到队列和单独的应用程序从该队列中获取工作项并处理它们.第一个应用程序不需要从第二个应用程序返回状态消息.我希望队列存在于单个Sql Server实例中.
最令我困惑的是对话/对话与这种情况的关系.我知道你只能在对话/对话的上下文中发送/接收消息,但由于这两个应用程序之间没有来回的喋喋不休,我对于何时是创建新会话的正确时间感到迷茫.两种极端的替代方案似乎是:
走这些路线的后果是什么?
此外,在第一种情况下,似乎我需要进行一些END CONVERSATION,以便Sql Server能够在内部清理资源.什么时候将它们放入正确的地方是否有任何指导?(或者最终依靠对话超时可能会更好?)
什么是SQL Server中的Service Broker,在简单数据库中启用它是否有意义,而不是在分布式数据库中启用它?
在服务器上设置了一个正常运行的Service Broker,我们正在迁移到新服务器,但我似乎无法在新机器上设置Service Broker.
已经做了明显的(对我来说)像DB上的启用代理,丢弃路由,服务,合同,队列甚至消息类型并重新添加它们,使用STATUS ON设置ALTER QUEUE
SELECT*FROM sys.service_queues
给我一个队列列表,包括我自己的两个队列,显示为activation_enabled,receive_enabled等.
不用说队列不起作用.当我把消息丢进他们时,没有任何东西进入,什么都没有出来.
有任何想法吗?我确信我错过了一些非常明显的东西......
我需要为一个表实现SqlCacheDependency,这将依赖于这个查询:
SELECT Nickname FROM dbo.[User].
我为此创建了一个方法:
private IEnumerable<string> GetNicknamesFromCache()
{
const String cacheValueName = "Nicknames";
var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>;
if (result == null)
{
result = _repository.GetAllNicknames();
var connectionString = ConfigurationManager.ConnectionStrings["RepositoryContext"].ConnectionString;
var sqlConnection = new SqlConnection(connectionString);
var sqlCommand = new SqlCommand("SELECT Nickname FROM dbo.[User]", sqlConnection);
var sqlDependency = new SqlCacheDependency(sqlCommand);
HttpRuntime.Cache.Insert(cacheValueName, result, sqlDependency);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序时,它不起作用.我检查了订户列表(sys.dm_qn_subscriptions表),没有记录.
我调查了很多时间,并且已经尝试了各种解决方案,但它们对我不起作用:
使用可信连接并为公共角色设置一些权限:
GRANT CREATE PROCEDURE TO public
GRANT CREATE QUEUE TO public
GRANT CREATE SERVICE TO public …
我目前有一个从遗留应用程序更新的数据库.我想利用SQL Service Broker队列,以便在更新记录时,将消息放入队列中(使用触发器或其他东西).
然后,我希望有一个长时间运行的应用程序(用.NET编写的Windows服务),它不断"监听"队列以获取消息并处理它们以用于另一个应用程序.
我在网上找到了一些示例代码,只想获得一些关于代码是否可靠的输入.所以,这是Windows服务类的缩写版本:
public class MyService
{
public void StartService()
{
Thread listener = new Thread(Listen);
listener.IsBackground = true;
listener.Start();
}
private void Listen()
{
while (true)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
string commandText = "WAITFOR ( RECEIVE * FROM MyQueue);";
using (SqlCommand command = new SqlCommand(commandText, connection))
{
connection.Open();
command.CommandTimeout = 0;
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// Process message
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你怎么看?代码完全按照我想要的方式工作.但是,关闭包含SQL命令的新线程的想法永远不会超时 - 在无限循环内 - 让我有点紧张.
我有一个分布式系统,其中将有1个SQL Server,1-n处理服务器和1-n数据供应商(网络中的硬件设备).提供的数据需要在进入关系数据库结构之前进行处理 - 由处理服务器执行(作为Windows服务 - .net代码来解析数据,处理数据并将其插入关系结构中.)
处理潜力加载而不是减慢数据供应商的速度,我想实现一个队列,但我不确定我是否想要将MSMQ服务器的复杂性添加到混合中.是否有一个很好的MSMQ替代方案,例如使用DB(平面表)作为队列?.NET是否为DB队列提供了任何开箱即用的支持,还是有另一种可靠的排队选项?
谢谢
编辑:(11月29日,晚上11:30)
听起来像SQL Service Broker(SSB)可能会这样做.
http://www.netframeworkdev.com/windows-communication-foundation/service-broker-vs-msmq-as-reliable-queueing-mechanism-63981.shtml
编辑:(11月30日,上午7:45)
发现另一个非常有用的链接:
http://social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/52687510-0852-44f3-bfcd-83610d1c1b9a
我也在研究将要提供的数据的最大/最小尺寸.在他们的头顶,有谁知道MSMQ和/或SSB容纳的最大尺寸?
MSMQ:4MB消息大小
SSB:2GB消息大小
编辑:(30 nov,8; 15am)
MSMQ和SSB之间的比较:
消息队列的良好策略?
要求是通过SSIS调用Web服务并从SQL Server Service Broker激活的存储过程调用SSIS.
这是我目前正在做的事情:
队列
CREATE QUEUE [schema].[ProccessingQueue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [schema].[usp_ProccessingQueueActivation] , MAX_QUEUE_READERS = 10 , EXECUTE AS N'dbo' ), POISON_MESSAGE_HANDLING (STATUS = ON)
Run Code Online (Sandbox Code Playgroud)
我的存储过程:
ALTER PROCEDURE [schema].[usp_ProccessingQueueActivation]
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
<snip declaration>
BEGIN
BEGIN TRANSACTION;
WAITFOR
(
RECEIVE TOP (1)
@ConversationHandle = conversation_handle,
@MessageBody = CAST(message_body AS XML),
@MessageTypeName = message_type_name
FROM [schema].[ProccessingQueue]
), TIMEOUT 5000;
<snip …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以将SignalR消息直接添加到SignalR SQL背板(来自SQL),因此我不必使用SignalR客户端来执行此操作.
我的情况是我有一个SQL Service Broker队列的激活存储过程,当它触发时,我想向SignalR客户端发送一条消息.目前,我必须在单独的进程中从SQL Service Broker接收消息,然后立即使用SignalR集线器重新发送消息.
我希望我的激活存储过程基本上将消息直接移动到SignalR SQL背板上.
我需要一个针对发布者/订阅者功能的企业服务总线/消息队列解决方案.我知道MANY存在...... MSMQ,MS系列,RabbitMQ,NServiceBus等等......
我的一个要求是在共享托管解决方案中,我能保证的唯一依赖是SQL 2005及更高版本......这直接导致我直接进入SQL Service Broker.
如果听起来我正试图将ESB功能塞进SSB ......我想我是......
我的问题是:有没有人知道.NET API或框架位于SQL Service Broker之上并且已经提供了大量的管道工程?
如果我使用纯ADO.net,我可以通过调用存储过程将项添加到队列,但是然后:
正是这些问题让我希望现有的.net解决方案已经完成了所有这些工作.