WAITFOR (RECEIVE... Causes System.Transactions.TransactionAbortedException?
Oct 4, 2007
I'm implementing a transactional receive from SSB queue. I used System.Transactions.TransactionScope to simplify the transaction management code. When I used the "WAITFOR (RECEIVE ...), TIMEOUT 100" statment I get TransactionAbortedException when I try to open the second connection under the same TransactionScope block.
Note that when I remove the WAITFOR and just doing RECEIVE everything works fine and the transaction state is guaranteed.
Does anybody know if this a known issue with WAITFOR? Does it supposed to abort the transaction when the command completes?
See code below and stack traces I got.
Thanks,
Noam Helfman
Repro code:
Code Blockusing (TransactionScope txnScope = new
TransactionScope(TransactionScopeOption.RequiresNew))
{
using (SqlConnection conn1 = new SqlConnection(TestConnectionString))
{
conn1.Open();
using (SqlCommand command = conn1.CreateCommand())
{
command.CommandText =
"WAITFOR (RECEIVE TOP(1) message_body FROM TestReceiveQueue), TIMEOUT 100"; // <-- this causes TransactionAbortedException below
//command.CommandText = "RECEIVE TOP(1) message_body FROM TestReceiveQueue"; // <-- this works
command.CommandType = CommandType.Text;
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
byte[] message = (byte[])reader["message_body"];
}
}
}
using (SqlConnection conn2 = new SqlConnection(TestConnectionString))
{
conn2.Open(); // <-- TransactionAbortedException here
using (SqlCommand command = conn2.CreateCommand())
{
command.CommandText = string.Format("INSERT INTO tbl1 VALUES (1)");
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
}
txnScope.Complete();
}
}
...
Schema:
Code BlockCREATE QUEUE TestReceiveQueue WITH STATUS=ON ,RETENTION=OFF;
CREATE TABLE tbl1 (col1 int not null);
Stack traces:
Code Block
System.Data.SqlClient.SqlException: Cannot promote the transaction to a distributed transaction because there is an active save point in this transaction.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction)
at System.Data.SqlClient.SqlDelegatedTransaction.Promote()
System.Transactions.TransactionPromotionException: Failure while attempting to promote transaction.
at System.Data.SqlClient.SqlDelegatedTransaction.Promote()
at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
System.Transactions.TransactionAbortedException: The transaction has aborted.
at System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(InternalTransaction tx)
at System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
at System.Transactions.Transaction.Promote()
at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, dbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SqlServiceBrokerQueueTest.WAITFORBug() in SqlServiceBrokerQueueTest.cs:line 375
View 6 Replies
ADVERTISEMENT
May 21, 2004
Whats the difference between waitfor time and waitfor delay in SQL Sever2000.
Which one is better if you want to send a file at a certain time?
Thanks,
View 3 Replies
View Related
Oct 14, 2005
Hi,
I've been doing some work with nested TransactionScope classes and timeouts and I'm getting some strange results that I can't quite explain. I'm hoping that I've done something foolish in my code, since that will be by far the easiest fix :)
The scenario is that I have a stored procedure that may block indefinately (arguably not great, but it's outside of my control) - in the example below, it does a simple "waitfor" to pause for 3 seconds. There is a intermediate data layer between my application code and the database that wraps all database calls in a TransactionScope (essentially the ExecCommand method in the example). At the application layer, we create a TransactionScope with a timeout, then call into the data layer to perform the query (the application layer is the Main method in the example).
The behaviour I'm seeing is that the initial call will block within SQL Server until the current executing SQL command completes (in this case, the waitfor). At that point, the batch is terminated and control returns to the C#. Within the C# there are no errors until the outer TransactionScope is disposed; the only apparent way of detecting that the batch didn't complete is to examine the Transaction.Current.TransactionInformation.Status property. I can just about live with that (although would have prefered that the ExecuteNonQuery had thrown); the example checks this status property and throws an exception if it's bad.
So far, so good. It all goes very wrong if I attempt to make another call. If the connection has the "connection reset" property set to false, then the second call fails immediately with a "transaction in doubt" error. If the "connection reset" property is set to true, then the second call completes successfully, except the database doesn't get called! (In profiler, you see the exec os sp_reset_connection, but that's all). It all looks as if I've not tidied up properly, but I'm not sure what I've missed. To add some spice, putting a 1 second sleep before the Execute makes everything work as expected.
The sample code is below; sorry if it's a little large. There a connection string right at the top that you may need to tweak. It creates a stored procedure in the initial catalog; see line 95 for details - it's nothing offensive! The sample compiles just fine from the command line with no special options needed.
Finally, I'm running .Net v2.0.50727 and the Sept. CTP of SQL Server 2005.
Here's hoping someone can tell me what I've done wrong!
Cheers,
Steve
using System;
View 2 Replies
View Related
Apr 4, 2006
Taht is my code. I have a defined common transaction.
In my call path, I use:
using (IDbConnection connection = GetConnection ()) {
retval = q.Find (connection, out DataParticleList);
connection.Close ();
}
DetermineDataParticles ((DataParticle[]) DataParticleList.ToArray (typeof(DataParticle)));
And then, in Determine DataParticles, I do:
using (TransactionScope scope = new TransactionScope (_Transaction)) {
using (IDbConnection connection = GetConnection ()){
again. As both are using a TransactionScope that - uses the same transaction, and as the first connection has been closed - should the whole thing not reuse the same connection? GetConnection () has the same connection string.
I get a promotion to DTC in the second GetConnection (). That indicates that a new connection is being opened (and attached), and not the first one being used. Any hint on why that is? What can I change for this? I would really like this not to be promoted upward to DTC. It makes no sense to me.
View 7 Replies
View Related
Feb 15, 2007
Hi,
I've tried to enclose a few database operations in a TransactionScope block but it looks like SQL Server CE RM does ignores ambiental transaction.
Here is the code:
static void TestTxn() {
// Command to insert an integer in a table with a single integer column
string cmdPassText = "INSERT TESTTABLE (INTFIELD) VALUES(1)";
// Command to force field type mismatch exception
string cmdFailText = "INSERT TESTTABLE (INTFIELD) VALUES('Foo')";
using (TransactionScope scope = new TransactionScope()) {
using (SqlCeConnection conn = new SqlCeConnection("DataSource = 'Test.sdf'")) {
try {
conn.Open();
SqlCeCommand cmdPass = new SqlCeCommand(cmdPassText, conn);
returnValue = cmdPass.ExecuteNonQuery();
SqlCeCommand cmdFail = new SqlCeCommand(cmdFailText, conn);
returnValue = cmdFail.ExecuteNonQuery();
}
catch (Exception ex){
Console.WriteLine("Command failed");
Console.WriteLine("Exception Message: {0}", ex.Message);
}
}
scope.Complete();
}
}
After first command suceeds and seccond command failes table still has one affected row after transaction.
Am I doing something wrong or System.Transactions.Transaction is not supported with SQL Server CE RM?
Thanks,
Aleksandar
View 3 Replies
View Related
Jan 13, 2006
I have an issue where I am trying to copy between 10-100 TIFF images to a directory, use the command line to combine them (I have a command line driven utility to accomplish this), copy the combined TIFF to another directory, and move to another set of TIFF images.
I can't figure out to make SQL wait for xp_cmdshell to return NULL and then move through the loop. Is there a way to use WAITFOR to look to see what is returned and then move on?
View 5 Replies
View Related
Jul 23, 2005
Env: SQL Server 2000It actually waited for 50 seconds instead of 5, triedWAITFOR DELAY '000:00:005' and WAITFOR DELAY '000:00:5' respectively,and got same behavior. Bug or ?TIA
View 3 Replies
View Related
Jul 20, 2005
System: Dell PowerEdge Server with 3 GB RAM, 2.4 GHz CeleronSoftware: Microsoft SQL Server 2000 Enterprise running on Windows 2003ServerSoftware: Microsoft SQL Server 2000 Enterprise running on Windows 2000ServerIf you run the code below, you'll notice something odd occuring. TheMilliSecond value does not change after a 1Millisecond delay. Is this a bugor am I doing something wrong?Any assistance will be greatly appreciated-----------------------------------------------------------------------------------/*Programmer : Des L. DavisDate : July 4, 2004Purpose : Testing Delayed Reaction*/CREATE PROCEDURE [sp_TestDelay] ASDECLARE @DELAYPERIOD NCHAR(12)SET @DELAYPERIOD = '00:00:00:001'DECLARE @Retries INTSET @Retries = 0DECLARE @MAXTRIES INTSET @MAXTRIES = 1000 -- Maximum number of tries before timing outDECLARE @Modified DATETIMEWHILE ( ( @Retries <= @MAXTRIES ) ) BEGINSET @Modified = GetDate() -- Set Modification DatePRINT @RetriesPRINT @ModifiedPRINT 'Year = ' + CONVERT( NCHAR(4), DATEPART( YEAR, @Modified ) )PRINT 'DayOfYear = ' + CONVERT( NCHAR(3), DATEPART( DAYOFYEAR ,@Modified ) )PRINT 'Hour = ' + CONVERT( NCHAR(2), DATEPART( HOUR, @Modified ) )PRINT 'Minute = ' + CONVERT( NCHAR(2), DATEPART( MINUTE, @Modified ) )PRINT 'Second = ' + CONVERT( NCHAR(2), DATEPART( SECOND, @Modified ) )PRINT 'MilliSecond = ' + CONVERT( NCHAR(3), DATEPART( MILLISECOND,@Modified ) )SET @Retries = @Retries + 1 -- Increment loop counter and retryWAITFOR DELAY @DELAYPERIODENDGO-----------------------------------------------------------------------------------
View 14 Replies
View Related
Sep 25, 2000
Hi,
I created a stored procedure that run as a service in the SQL Server , as long as the server is up.
It queries a table , does some work on the rows one by one , and after each row is done - deletes it from the table.
If there is no data - it goes to 'sleep' - waitfor delay ('00:00:03')
does anyone knows if that waitfor command releases the cpu , or just counting and uses the cpu ?
Eyal.
View 5 Replies
View Related
Jun 23, 2006
http://www.castellcomputers.com/?p=44
This bit of SQL script can be used to insert a pause of one hundredth of a second in a trigger, stored procedure or SQL script. This can be useful for when MSSQL’s built-in WAITFOR DELAY function is just too long (it’s minimum increment is a full second!)
declare @later datetime
declare @now datetime
set @later = current_timestamp+'00:00:00.01'
set @now = current_timestamp
while @now < @later
begin
set @now = current_timestamp
end
I'm sure it could be further tweaked to become a function.. And heck, maybe one of the gurus will tell me that there's something i don't know about WAITFOR or whatnot.. Feedback appreciated!
--
Doug Castell
GoldMine Guru
www.castellcomputers.com
View 1 Replies
View Related
Nov 28, 2003
The following code does work but when the stored procedure is called it takes about 10 seconds for it to load. I am not refering to the 30 minute wait before the name is deleted.
Anyone have any ideas why the call would be so slow? Thanks.
SERVICE CODE
conPubs = (New SqlConnection("Server=blah blah blah")
cmdCommand = New SqlCommand("DeleteName", conPubs)
cmdCommand.CommandType = CommandType.StoredProcedure
cmdCommand.Parameters.Add("@Name", Name)
cmdCommand.Parameters.Item(0).Value = Name
conPubs.Open()
cmdCommand.ExecuteNonQuery()
conPubs.Close()
STOREDPROCEDURE CODE
Create Procedure[DeleteName]
@Name varchar (30)
As
Begin
Set NoCount On
WaitFor Delay "00:30:00"
Delete From NameTable Where Name = @Name
End
GO
View 2 Replies
View Related
Sep 13, 2007
Hi all.
How can I lock table with longtime query?
View 8 Replies
View Related
Oct 19, 2015
We're trying to troubleshoot a timeout issue, so it was requested that I add a WAITFOR statement (1 hour) in a certain stored proc our application uses. I added it and confirmed that it was working by executing the stored proc in SSMS.
However, when our application (using Entity Framework) calls the stored proc, the WAITFOR statement is ignored.
View 4 Replies
View Related
May 22, 2005
Hi there,
I have decided to move all my transaction handling from asp.net to stored procedures in a SQL Server 2000 database. I know the database is capable of rolling back the transactions just like myTransaction.Rollback() in asp.net. But what about exceptions? In asp.net, I am used to doing the following:
<code>Try 'execute commands myTransaction.Commit()Catch ex As Exception Response.Write(ex.Message) myTransaction.Rollback()End Try</code>Will the database inform me of any exceptions (and their messages)? Do I need to put anything explicit in my stored procedure other than rollback transaction?
Any help is greatly appreciated
View 3 Replies
View Related
Aug 21, 2006
I have created a windows library control that accesses a local sql database
I tried the following strings for connecting
Dim connectionString As String = "Data Source=localhostSQLEXPRESS;Initial Catalog=TimeSheet;Trusted_Connection = true"
Dim connectionString As String = "Data Source=localhostSQLEXPRESS;Initial Catalog=TimeSheet;Integrated Security=SSPI"
I am not running the webpage in a virtual directory but in
C:Inetpubwwwrootusercontrol
and I have a simple index.html that tries to read from an sql db but throws
the error
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,
etc etc
The action that failed was:
Demand
The type of the first permission that failed was:
System.Data.SqlClient.SqlClientPermission
The Zone of the assembly that failed was:
Trusted
I looked into the .net config utility but it says unrestricted and I tried adding it to the trusted internet zones in ie options security
I think that a windows form connecting to a sql database running in a webpage should be simple
to configure what am I missing?
View 28 Replies
View Related
Apr 6, 2007
In working through some examples, sometimes I will see this pattern for receiving messages: What is the purpose of the "nested" WAITFOR (RECEIVE? What is this actually doing? Is it receiving the same message in both RECEIVE?
WAITFOR (
RECEIVE @dh = [conversation_handle],
@message_type = [message_type_name],
@message_body = CAST([message_body] AS NVARCHAR(4000))
FROM [Queue]), TIMEOUT 1000;
WHILE @dh IS NOT NULL
BEGIN
IF @message_type = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
BEGIN
RAISERROR (N'Received error %s from service [Target]', 10, 1, @message_body) WITH LOG;
END
END CONVERSATION @dh;
COMMIT;
SELECT @dh = NULL;
BEGIN TRANSACTION;
WAITFOR (
RECEIVE @dh = [conversation_handle],
@message_type = [message_type_name],
@message_body = CAST([message_body] AS NVARCHAR(4000))
FROM [Queue]), TIMEOUT 1000;
END
COMMIT;
Other times I will see this pattern for receiving messages: Why do a RECEIVE TOP(1) instead of just a RECEIVE?
WAITFOR(RECEIVE TOP(1)
@conversationHandle = conversation_handle,
@messageTypeName = message_type_name,
@messageBody = message_body
FROM [Queue]), TIMEOUT 1000;
And other times I will see this pattern for receiving messages: What is the purpose of RECEIVING into an in-memory table when you can just process the message directly?
WAITFOR(RECEIVE
queuing_order,
conversation_handle,
message_type_name,
message_body
FROM [Queue]
INTO @tableMessages), TIMEOUT 1000;
IF (@@ROWCOUNT = 0)
BEGIN
COMMIT;
BREAK;
END
What is the difference between the three approaches from an architectural and performance perspective? I need to process messages as fast as possible and I'm not sure why or when each should be used. Also, does the timeout have any impact on how FAST messages will be processed, or is it exactly what it says - a timeout - if a message is not found within the period then the procedure will break?
View 5 Replies
View Related
Jul 5, 2007
HI
I am trying to set up a stored procedure to retrieve to 20 messages from a queue into a table to implement a batched process. I have the following code in a stored procedure.
WAITFOR (
RECEIVE top (20) -- get batched so that we can process same listid once
message_type_name,
message_body, -- the message contents
conversation_handle -- the identifier of the dialog this message was received on
FROM dbo.target
into @PayloadData
), TIMEOUT 3000 -- if the queue is empty for three second, give UPDATE and go away
However, the stored procedure is only retrieving 1 message at a time from the queue. Did I miss some other setting
thanks
P
View 4 Replies
View Related
Jan 26, 2004
Thats it
How do you receive the last item(row) in a table.
Thanks
View 11 Replies
View Related
Jan 31, 2007
Hello Guys,
I really need you help to debug this query.
OBJECTIVE:THE QUERY SHOULD GIVE ME THE FIELDS I MENTIONED IN THE FIRST QUERY WITH THE CONDITIONS BELOW.
CONDITION 1: RateReview field should have yesterday's date
CONDITION 2: Email will be send to customer only once so Customer_GUID is UniqueIdentifier
CONDITION 3: Customer shouldnt' have opted to get out from receiving any email so Termination field should be NULL
ONe Customer can have many transwactions
Is there any way i write the code specifying that no email should be sent more than once evereven if customer buys 10 tickets.
Only one email sent so i need to specify that if this email has gone to particulare CUSTOMER_GUID then Ignore that record and
do not send any email. This would be done by some tool known as StrongMail.
SELECT
CAST(a.Transaction_GUID AS varchar(36)) as Transaction_GUID,
CAST(a.Customer_GUID AS varchar(36)) as Customer_GUID,
Film_id as MovieId,
First_nm as FirstName,
Last_nm as LastName,
Email_nm as EmailAddress,
from
(
select
MIN(CAST(customer_guid AS varchar(36))) as Customer_GUID,
Transaction_GUID
from tblTransaction (nolock)
where RateReview_dm > DATEADD(dd,-1,GETDATE()) and RateReview_dm <
GETDATE()
and Terminate_dm is null
and customer_guid
not
in
(
select CAST(customer_guid AS varchar(36)) as Customer_GUID
from tblTransaction (nolock)
where RateReview_dm > DATEADD(dd,-1,GETDATE()) and RateReview_dm <
GETDATE()
and Terminate_dm is null
)
group by transaction_guid, customer_guid
)z
inner
jointblTransaction a
onz.Transaction_GUID = a.Transaction_GUID
View 8 Replies
View Related
Jul 20, 2005
Hai ,I created a table with primary key clustered. I have entered the datathru E.Manager . If a close the table and open it again , Ii shows therows with the (default) ascending order. Is, there any way to get therows in the user entered order(neither asc or dec order)With ThanksRaghu
View 2 Replies
View Related
Sep 19, 2007
How can I have my email download automatically instead of clicking send/receive all the time?
View 1 Replies
View Related
Feb 1, 2007
I built a system where I am sending batches of messages using a single conversation. I want to pull these messages out of my queue using Service Broker. I may have more than one batch sitting in the queue waiting to be picked up, so....
In my SSIS package i started by getting a unique list of conversation_handles where the message type is my end of batch message ( should only be one per batch). Then I used the foreach loop construct thinking I could pass the conversation_handles around and into the data flow.
In the data flow I want to pull all of the messages at once. It looks like the receive statement is designed to do this with the concept of using a table variable.
So I built this SQL to use in for the SQL Command of my OLE DB Source. It gives me this error "Syntax error, permission violation, or other nonspecific errorr"
declare @messages table ( conversation_handle uniqueidentifier, message_type_name sysname, message_body xml );
receive conversation_handle, message_type_name, message_body
from dm.[consultant queue]
into @messages
where conversation_handle = ?
select conversation_handle, message_type_name, message_body
from @messages
If I change it to this, by removing the passed parameter and looking up what should be the same value that I am passing in then it works.
declare @ch uniqueidentifier;
declare @messages table ( conversation_handle uniqueidentifier, message_type_name sysname, message_body xml );
select top 1 @ch = conversation_handle
from dm.[consultant queue]
where message_type_name = 'BatchEnd'
order by queuing_order;
-- select conversation_handle, message_type_name, message_body
receive conversation_handle, message_type_name, message_body
from dm.[consultant queue]
into @messages
where conversation_handle = @ch
select conversation_handle, message_type_name, message_body
from @messages
I have tried sneaking the parameter into the SQL in other ways, but always get the same I have tried sneaking the parameter into the SQL in other ways, but always get the same error message. It just seems that SSIS, or OLE DB, don't want to pass parameters into a block of SQL that is executing this receive command. Has anyone else done something similar to what I am doing here? Any ideas on how to resolve this?
Obviously by using SSIS I want to work on the whole batch at once and not iterate message by message. Right now I just don't like the idea that I am getting the conversation_handle twice and possibly getting a different batch of messages to process.
Thanks!
View 7 Replies
View Related
Nov 19, 2007
I followed an example using the AdventureWorks database to set up a simple messaging test on one database:
Code Block
-- We will use adventure works as the sample database
USE AdventureWorks
GO
-- First, we need to create a message type. Note that our message type is
-- very simple and allowed any type of content
CREATE MESSAGE TYPE JobRequest
VALIDATION = NONE
GO
-- Once the message type has been created, we need to create a contract
-- that specifies who can send what types of messages
CREATE CONTRACT JobRequestor
(JobRequest SENT BY INITIATOR)
GO
-- The communication is between two endpoints. Thus, we need two queues to
-- hold messages
CREATE QUEUE RequestorQueue
CREATE QUEUE ReceiverQueue
GO
-- Create the required services and bind them to be above created queues
CREATE SERVICE Requestor
ON QUEUE RequestorQueue
CREATE SERVICE Receiver
ON QUEUE ReceiverQueue (JobRequestor)
GO
-- At this point, we can begin the conversation between the two services by
-- sending messages
DECLARE @conversationHandle UNIQUEIDENTIFIER
DECLARE @message NVARCHAR(100)
BEGIN
BEGIN TRANSACTION;
BEGIN DIALOG @conversationHandle
FROM SERVICE Requestor
TO SERVICE 'Receiver'
ON CONTRACT JobRequestor
WITH ENCRYPTION=OFF, LIFETIME= 600;
-- Send a message on the conversation
SET @message = N'Hello, World';
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE JobRequest (@message)
COMMIT TRANSACTION
END
GO
-- Receive a message from the queue
RECEIVE CONVERT(NVARCHAR(max), message_body) AS message
FROM ReceiverQueue
-- Cleanup
DROP SERVICE Sender
DROP SERVICE Receiver
DROP QUEUE SenderQueue
DROP QUEUE ReceiverQueue
DROP CONTRACT HelloContract
DROP MESSAGE TYPE HelloMessage
GO
This all works fine but if I run the section that creates the message and then copy the RECEIVE section to a new query window and execute it, nothing is returned. If I run the RECEIVE section within the same query window it returns the 'Hello World' message as expected. I am new to Service Broker and so am assuming that I am missing something obvious!!
View 5 Replies
View Related
Apr 27, 2007
Dear all,
I have set up service broker to work between two instances of SQL server with Dialog Security (implemented using certificates). The initiator queue has a activation procedure attached to process the return messages.
I'm receiving the messages from inside a SSIS package using Receive statement. Once I recive the message, I store the conversation handle, message type and message body in variables and execute the remaining ETL package based on the input.
Towards the end of the package, I send a message back to the Initiator for the same conversation to indicate sucess or failure.
Code Snippet
declare @conversation_handle UNIQUEIDENTIFIER
select @conversation_handle = <<SSIS User Variable>>;
SEND ON CONVERSATION @conversation_handle MESSAGE TYPE [/OLAP/Error] (N'<Error>My custom error</Error>');
END CONVERSATION @conversation_handle ;
The problem now is that, the initiator queue receives only the "http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog" message. I would expect it to recieve "/OLAP/Error" first and then the "EndDialog" message.
Any idea on what's happening here? Any help is appreciated.
Cheers,
Arun
View 5 Replies
View Related
Sep 27, 2006
Hi There
My activation sp must be able to read of various queues.
I load a variable with the queue name that activated the sp btu i cannot get the syntax working to receive or get a conversation group of a queue name that is a variable.
I have tried:
WAITFOR
(
RECEIVE message_body, conversation_handle, message_type_name, message_sequence_number, conversation_group_id FROM @callingQueue INTO @msgTable WHERE conversation_group_id = @conversationGroup
), TIMEOUT 2000;
But i get this error:
Incorrect syntax near '@callingQueue'.
Looks like you cannot use a variable.
So i tried the following:
SELECT @SQL = N' WAITFOR
(
RECEIVE message_body, conversation_handle, message_type_name, message_sequence_number, conversation_group_id FROM @callingQueue INTO @msgTable WHERE conversation_group_id = @conversationGroup
), TIMEOUT 2000'
EXEC sp_executesql @SQL, N'@msgTable table output'
But i get the same error.
How do i receive of a queue using a vriable holding the queue name ?
Thanx
View 13 Replies
View Related
Dec 28, 2006
Is there a way to get more than one file with a single ftp task in SQL 2005??
I need to get 5 files from one server. They are in two different directories is that makes any difference. Right now I have a separate task for each but would like to have one task if possible.
Thanks
View 4 Replies
View Related
Feb 12, 2007
Hi i am trying to create a batch process then commit for all messages on the queue. The problem i am having is when i run my query (As below) I only receive the first message and the corresponding end dialog for the message although i have 2000 records sitting in the queue. It is my understanding that receive without any criteria i.e top(1) or where clause should select everything of the queue. I tried receive top(100) expecting 100 records but still only got 2 back.
any help appreciated.
WAITFOR(RECEIVE
queuing_order,
conversation_handle,
message_type_name,
message_body
FROM [RMIS_COMMS_Queue]
INTO @tableMessages), TIMEOUT 2000;
View 4 Replies
View Related
Feb 23, 2008
Hi,
My msdb grown up abnormally to 35 GB.
I used :
use msdb
go
SELECT TOP 10 OBJECT_NAME([object_id]), *
FROM sys.dm_db_partition_stats
WHERE index_id IN (0,1)
ORDER BY in_row_reserved_page_count DESC;
And i found queue_messages_407672500 table is occupying a lot of space.
When i tried to query :
select TOP 5 * FROM queue_messages_407672500 ;
I got error:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'queue_messages_407672500'.
Also , to clear the queued messages in msdb , i tried to use :
RECEIVE TOP (1) * FROM queue_messages_407672500 ;
But got the same error as above.
Please suggest , how can i shrink the msdb now, as without receving the messages i am not able to shrink it.
Many Thanks in advace.
Mohit
View 2 Replies
View Related
May 5, 2006
Hi everyone,
I want to design a FTP task to download all the xml files from a FTP site. And I don't know what the file's name is.
How can I design this task?
Thank you for your helps!
Tony
View 5 Replies
View Related
Feb 26, 2013
I am getting problem in unique row in database table, but not getting unique row because I have used Distinct keyword but not getting unique row so how can we do?
I have two table one table information another table Id. But second table in two code same but I am using distinct keyword i get some row unique but second table in two row in same code but when i am fetching row same auto_id render same id create duplicate row. But I am getting only unique row.
View 1 Replies
View Related
Oct 31, 2006
I have a set of service broker services setup that rely on external activation to process messages. I'm using the GotDotNet ExternalActivator, and it launches console applications that do the actual retrieval from the queues. The console applications are written to run continuously to avoid the cost of starting up .NET based console apps over and over again.
I am observing very odd timing behavior. With the receive queues empty and the external activator configured to run a minimum and maximum of 5 instances, I observe in SQL Profiler that most of the receive operations finish in about the same amount of time as my WAITFOR command in my receive stored procedure. However, there is usually one receive command that consistently takes upwards of 30 seconds and often causes sql timeout exceptions to be thrown. I know that I could code around this, but I wasn't really expecting this behavior.
Does anyone have any thoughts on why it might be occurring? I would have expected to routinely see my receive operations taking 15 seconds, give or take, especially when the queue is empty. Also, I have observed this behaviour on both SQL 2k5 Express and Dev Editions, so I don't think it's a version thing.
The stored procedure I am using to do the receive is:
Create PROCEDURE [dbo].[P_RTD_MessageBase_Receive]
@receiving_queue_name varchar(255),
@receiving_time_out int
AS
Declare @receiveQuery nvarchar(300)
Set @receiveQuery = 'WAITFOR(RECEIVE * FROM [dbo].['+ @receiving_queue_name +']),
TIMEOUT ' + cast (@receiving_time_out as varchar)
Execute sp_executeSql @receiveQuery
View 6 Replies
View Related
Feb 19, 2008
Hi,
I have a problem using service broker, a send the message from server SSB1(initiator) and a receive this message on server SSB2(target), but I don't receive response to SSB1...
In my server SSB2 has this messages on Profiler:
- This message could not be delivered because it is a duplicate.
- Could not forward the message because forwarding is disabled in this SQL Server instance.
- The message could not be delivered because it could not be classified. Enable broker message classification trace to see the reason for the failure.
Message from SSB1 Profiler:
- This message was dropped because it could not be dispatched on time. State: 1
And the messages not end in both servers
Tks
Fernando Bueno
View 8 Replies
View Related
Jul 11, 2006
Hi,
I am getting SQLException when I connect one of SQL Server 2000 Integrated Security host. I would like to know how to correct this problem.
An exception occurred during the DBComms.receive method. Operation:An existing connection was forcibly closed by the remote host. Context:(1) [Thread[main,5,main], IO:adc97, Dbc:8460d]. PktNum:1. TotalReceived:173. PktSize:4,096.
Thanks.
View 44 Replies
View Related