1

I created a console application which will be used by "Service Broker External Activator" service. The configuration file in "C:\Program Files\Service Broker\External Activator\Config" has been changed, but it writes an exception to log file as bellow

EXCEPTION ERROR = 32, No enabled application monitor is on behalf of queue

Here is my configuration

<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>

And here is the 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

When I send a message to TargetService, new message arrives on ExternalActivatorQueue. When I start the "Service Broker External Activator" service, error appears. Any idea to find out the source of this problem?

4

2 回答 2

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 的值匹配,成功匹配给定的应用程序正在执行。

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

于 2013-05-28T10:32:48.650 回答
1

更可能的原因是您在 ServerName 元素中使用了“localhost”。我只是通过将 ServerName 更改为 localhost 在我的工作示例中复制了它。

ServerName 和 ConnectionString 的服务器必须是实际的计算机名,特别是机器名,也不能是 DNS 名。

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

于 2015-10-21T19:43:04.470 回答