没有启用的应用程序监视器代表队列XYZ

时间:2013-03-12 11:26:11

标签: service-broker

我创建了一个控制台应用程序,它将由“Service Broker External Activator”服务使用。 “C:\ Program Files \ Service Broker \ External Activator \ Config”中的配置文件已更改,但它会将日志文件的异常写入下面

EXCEPTION ERROR = 32,未启用的应用程序监视器代表队列

这是我的配置

<NotificationServiceList>
    <NotificationService name="ExternalActivatorService" id="100" enabled="true">
      <Description>My test notification service</Description>
      <ConnectionString>
        <!-- All connection string parameters except User Id and Password should be specificed here -->
        <Unencrypted>Data Source=localhost;Initial Catalog=Chapter4_ExternalActivation;Application Name=External Activator;Integrated Security=True;</Unencrypted>
      </ConnectionString>
    </NotificationService>
  </NotificationServiceList>
  <ApplicationServiceList>
        <ApplicationService name="ProcessingApplication" enabled="true">
      <OnNotification>
        <ServerName>localhost</ServerName>
        <DatabaseName>Chapter4_ExternalActivation</DatabaseName>
        <SchemaName>dbo</SchemaName>
        <QueueName>ExternalActivatorQueue</QueueName>
      </OnNotification>
      <LaunchInfo>
        <ImagePath>D:\Temp\ServiceBroker\9781590599990\Samples\Chapter4\02 ExternalProcessingApplication\ProcessingApplication\bin\Debug\ProcessingApplication.exe</ImagePath>
        <CmdLineArgs></CmdLineArgs>
        <WorkDir>D:\Temp\ServiceBroker\9781590599990\Samples\Chapter4\02 ExternalProcessingApplication\ProcessingApplication\bin\Debug</WorkDir>
      </LaunchInfo>
      <Concurrency min="1" max="1" />
    </ApplicationService>
  </ApplicationServiceList>

这是SQL

CREATE DATABASE Chapter4_ExternalActivation
GO

ALTER DATABASE Chapter4_ExternalActivation
      SET ENABLE_BROKER;
GO

USE Chapter4_ExternalActivation
GO

--*********************************************
--*  Create the message type "RequestMessage"
--*********************************************
CREATE MESSAGE TYPE
[http://ssb.csharp.at/SSB_Book/c04/RequestMessage]
VALIDATION = WELL_FORMED_XML
GO

--*********************************************
--*  Create the message type "ResponseMessage"
--*********************************************
CREATE MESSAGE TYPE
[http://ssb.csharp.at/SSB_Book/c04/ResponseMessage]
VALIDATION = WELL_FORMED_XML
GO

--************************************************
--*  Create the contract "HelloWorldContract"
--************************************************
CREATE CONTRACT [http://ssb.csharp.at/SSB_Book/c04/HelloWorldContract]
(
    [http://ssb.csharp.at/SSB_Book/c04/RequestMessage] SENT BY INITIATOR,
    [http://ssb.csharp.at/SSB_Book/c04/ResponseMessage] SENT BY TARGET
)
GO

 --********************************************************
--*  Create the queues "InitiatorQueue" and "TargetQueue"
--*********************************************************
CREATE QUEUE InitiatorQueue
WITH STATUS = ON
GO

CREATE QUEUE TargetQueue
GO

 --**************************************************************
--*  Create the services "InitiatorService" and "TargetService"
--***************************************************************
CREATE SERVICE InitiatorService
ON QUEUE InitiatorQueue 
(
    [http://ssb.csharp.at/SSB_Book/c04/HelloWorldContract]
)
GO

CREATE SERVICE TargetService
ON QUEUE TargetQueue
(
    [http://ssb.csharp.at/SSB_Book/c04/HelloWorldContract]
)
GO

 --******************************************************************
--*  Deactivate the internal activation on the queue (if necessary)
--*******************************************************************
ALTER QUEUE TargetQueue
    WITH ACTIVATION (DROP)
GO

--*********************************************
--*  Create the event notification queue
--*********************************************
CREATE QUEUE ExternalActivatorQueue
GO

--*********************************************
--*  Create the event notification service
--*********************************************
CREATE SERVICE ExternalActivatorService
ON QUEUE ExternalActivatorQueue
(
    [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]
)
GO

--***********************************************************************
--*  Subscribe to the QUEUE_ACTIVATION event on the queue "TargetQueue"
--***********************************************************************
CREATE EVENT NOTIFICATION EventNotificationTargetQueue
    ON QUEUE TargetQueue
    FOR QUEUE_ACTIVATION
    TO SERVICE 'ExternalActivatorService', 'current database';
GO

当我向TargetService发送消息时,新消息到达ExternalActivatorQueue。当我启动“Service Broker External Activator”服务时,会出现错误。有什么想法找出这个问题的根源吗?

2 个答案:

答案 0 :(得分:2)

如果问题仍然存在,这可能会有所帮助。

如果所有SSSB对象和事件通知设置正确,那么需要查看消息如何被推送到通知队列。

以下是您必须使用的邮件格式并将其发送到通知队列

DECLARE @RequestMsg XML
SELECT @RequestMsg = N'<EVENT_INSTANCE>
   <EventType>QUEUE_ACTIVATION</EventType>
   <PostTime>' + CONVERT(CHAR(24),GETDATE(),126) + '</PostTime> 
   <SPID>' + CAST(@@SPID AS VARCHAR(9)) + '</SPID> 
   <ServerName>ServerName</ServerName>   -- use @@SERVERNAME to eliminate hard code 
   <LoginName></LoginName>    -- you can skip this element 
   <UserName></UserName>      -- you can skip this element 
   <DatabaseName>DatabaseName</DatabaseName> -- use DB_NAME() to eliminate hard code 
   <SchemaName>dbo</SchemaName>
   <ObjectName>NotifyQueue</ObjectName>
   <ObjectType>QUEUE</ObjectType>
</EVENT_INSTANCE>';

另外要注意消息的每个部分中的值,它应与[EAService.config]的配置值匹配,请参阅上述XML结构中的注释。

 <ApplicationService name="myMessageApp" enabled="true">
  <OnNotification>
    <ServerName>ServerName</ServerName>
    <DatabaseName>DatabaseName</DatabaseName>
    <SchemaName>dbo</SchemaName>
    <QueueName>NotifyQueue</QueueName>
  </OnNotification>
  <LaunchInfo>

这样做的原因是,服务中的逻辑将SSSB消息值与EAService.Config的值匹配,在成功匹配时给定应用程序正在执行。

希望如果您遇到同样的问题,这将对您有所帮助。

答案 1 :(得分:1)

更可能的原因是你正在使用&#34; localhost&#34;在ServerName元素中。我只是通过将ServerName更改为localhost来在我的工作示例中重现它。

ServerName和ConnectionString的服务器必须是实际的计算机名称,具体是机器名,也不是DNS名称。

如果您使ConnectionString的服务器为localhost,则服务启动后不会发生任何事情。您不会收到错误,但不会激活。