
create database test
go

use test
go

alter database test set honor_broker_priority on
go

select name, is_honor_broker_priority_on from sys.databases;
go

-- local service, remote service, and contract ALL is implied
CREATE BROKER PRIORITY foo FOR CONVERSATION SET ( PRIORITY_LEVEL = 4 ) 
go

-- can't have more than one default
CREATE BROKER PRIORITY foo2 FOR CONVERSATION SET ( PRIORITY_LEVEL = 6 )
go

-- but you can change the default
ALTER BROKER PRIORITY foo FOR CONVERSATION SET ( PRIORITY_LEVEL = 6 )
go

-- metadata
select * from sys.conversation_priorities;

-- create queues and services
CREATE QUEUE receiveq
go

CREATE SERVICE receiver
	ON QUEUE receiveq
	([DEFAULT])
go

-- RECEIVER CREATED

CREATE QUEUE senderq 
go

CREATE SERVICE sender
	ON QUEUE senderq
go

-- SENDER CREATED

DECLARE @h UNIQUEIDENTIFIER;
BEGIN TRY
    BEGIN TRANSACTION;
	BEGIN DIALOG CONVERSATION @h
	FROM SERVICE sender
	TO SERVICE 'receiver'
	WITH ENCRYPTION = OFF;

	SEND ON CONVERSATION @h
	('Hello World');
    COMMIT;
END TRY
BEGIN CATCH
	PRINT ERROR_MESSAGE();
    ROLLBACK;
END CATCH
go

-- MESSAGE SENT

-- priority appears at the endpoint level
select priority, * from sys.conversation_endpoints;
-- and the message level
select * from receiveq
go

DECLARE @h UNIQUEIDENTIFIER;
DECLARE @m VARCHAR(MAX);
BEGIN TRAN;
RECEIVE TOP(1) @h=conversation_handle, 
		@m=CAST(message_body as VARCHAR(MAX)) FROM receiveq;
PRINT @m;
SEND ON CONVERSATION @h ('Goodbye')
END CONVERSATION @h;
COMMIT;
go

-- MESSAGE RECEIVED

-- same on this side, priority appears
select * from senderq

DECLARE @h UNIQUEIDENTIFIER;
DECLARE @m VARCHAR(MAX);
BEGIN TRAN;
RECEIVE TOP(1) @h=conversation_handle, 
		@m=CAST(message_body as VARCHAR(MAX)) FROM senderq;
PRINT @m;
END CONVERSATION @h;
COMMIT;
go

-- this one will hang in sys.transmission_queue 
-- because it needs database master key

DECLARE @h UNIQUEIDENTIFIER;
BEGIN TRY
    BEGIN TRANSACTION;
	BEGIN DIALOG CONVERSATION @h
	FROM SERVICE sender
	TO SERVICE 'receiver'
	WITH ENCRYPTION = ON;

	SEND ON CONVERSATION @h
	('Hello World');
    COMMIT;
END TRY
BEGIN CATCH
	PRINT ERROR_MESSAGE();
    ROLLBACK;
END CATCH
go

-- priority here too
select priority, * from sys.transmission_queue