Serivce Broker 简单实用

简介:
复制代码
-- 创建要使用的数据库
Create Database HelloWorldDB
go
Use HelloWorldDB
go
-- 创建要使用的两种消息类型。我们要使用的消息将是
--
字符串而不是 XML - 因此无需进行验证
CREATE MESSAGE TYPE [HelloWorldRequest] VALIDATION = NONE
CREATE MESSAGE TYPE [HelloWorldResponse] VALIDATION = NONE
-- 创建一个限制此对话框中消息类型
--
的规范。请求由对话框的初始化程序发出
--
响应消息由对话框目标发送。
CREATE CONTRACT [HelloWorldContract]
(
[HelloWorldRequest] SENT BY initiator,
[HelloWorldResponse] SENT BY target
)
-- 创建对话框在其间通信的两个队列。A
--
对话框请求两个队列。
CREATE QUEUE [HelloWorldTargetQueue]
CREATE QUEUE [HelloWorldInitiatorQueue]
-- 创建命名对话框端点的服务。服务会将
--
会话端点连接到队列。
CREATE SERVICE [HelloWorldRequestService] ON QUEUE [HelloWorldTargetQueue]
(
[HelloWorldContract]
)
CREATE SERVICE [HelloWorldResponseService] ON QUEUE [HelloWorldInitiatorQueue]
go





Use HelloWorldDB
go
SET NOCOUNT ON
DECLARE @conversationHandle uniqueidentifier
Begin Transaction
-- 开始 Hello World 服务的对话
BEGIN DIALOG @conversationHandle
FROM SERVICE [HelloWorldResponseService]
TO SERVICE 'HelloWorldRequestService'
ON CONTRACT [HelloWorldContract]
WITH ENCRYPTION = OFF, LIFETIME = 600;
-- 发送消息
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [HelloWorldRequest] (N'Hello World')
commit





Use HelloWorldDB
go
-- 检查目标队列以确认消息已送达
select * from [HelloWorldTargetQueue]
go
-- 将消息主体转换为字符串,以便我们查看其中包含的内容
select cast(message_body as nvarchar(MAX)) from [HelloWorldTargetQueue]
go



-- 使用 Receive 命令可从队列接收消息
--
声明变量以存储接收到的数据
SET NOCOUNT ON
DECLARE @conversationHandle uniqueidentifier
declare @message_body nvarchar(MAX)
declare @message_type_name sysname;

-- Service Broker 命令总是位于事务中
Begin Transaction;

-- Receive 命令的格式类似于一个选择列表。首先列出
--
要获取的列,然后指定要从中获取消息
--
的队列
RECEIVE top(1) -- 只接收一条消息,因此我们可以直接保存到变量中。
@message_type_name=message_type_name,
-- 接收的消息类型
@conversationHandle=conversation_handle,
-- 对话的标识符
--
我们通过下列语句接收该消息
@message_body=message_body
-- 作为
--
varbinary(MAX) blob 的消息内容
FROM [HelloWorldTargetQueue]

print @message_body

-- 如果这是一条 hello world 消息,则用相应的问候语回答
if @message_type_name = N'HelloWorldRequest'
Begin
SEND ON CONVERSATION @conversationHandle
-- 使用下列消息接收语句的相同会话
MESSAGE TYPE [HelloWorldResponse]
(N'Hello From '+@@servername )
-- 这是我们希望从初始化程序接收的唯一消息,因此
--
现在可以安全地结束对话。
END CONVERSATION @conversationHandle
End
-- 提交事务
--
如果此时我们回滚,所有内容将退回到
--
我们开始时的状态 – 消息会返回到队列,并且没有发送响应
Commit
go
-- 确认我们从队列中删除了消息
select cast(message_body as nvarchar(MAX)) from [HelloWorldTargetQueue]
go






Use HelloWorldDB
go

select cast(message_body as nvarchar(MAX)) from [HelloWorldInitiatorQueue]
go



RECEIVE
cast(message_body as nvarchar(MAX))
FROM [HelloWorldInitiatorQueue]
复制代码




相关文章
|
消息中间件 Java Shell
RocketMQ的broker启动失败解决
RocketMQ的broker启动失败解决
1220 0
|
8天前
|
消息中间件 Kafka 网络安全
Kafka. Broker not available
Kafka. Broker not available
17 0
|
11天前
|
消息中间件 监控 Kafka
【Kafka】Kafka 分区Leader选举策略
【4月更文挑战第7天】【Kafka】Kafka 分区Leader选举策略
|
7月前
|
消息中间件 负载均衡 Kafka
kafka rebalance你真的了解吗
今天主要分享一下 kafka 的 rebalance,在 kafka 中,rebalance 是一个十分重要的概念,很多时候引发的一些问题可能都是由于 rebalance 引起的,rebalance 也就是再均衡,顾名思义,再均衡就是再次负载均衡,下面会对再均衡进行一个详细的描述。
381 3
|
消息中间件 算法 Java
Kafka生产者
生产者创建消息。在其他基于发布与订阅的消息系统中,生产者可能被称为发布者 或 写入者。
|
存储 消息中间件 RocketMQ
RocketMQ给broker发送消息确定Commitlog的写入的位置
问题 有一个疑问,当client给broker发送消息的时候,怎么知道在commitlog的第几个字节开始写呢?
153 0
RocketMQ给broker发送消息确定Commitlog的写入的位置
Broker 启动
Broker 启动
123 0
|
消息中间件 存储 缓存
初识 Kafka Producer 生产者
初识 Kafka Producer 生产者
初识 Kafka Producer 生产者
|
消息中间件 缓存 关系型数据库
Kafka生产者是如何发送消息的?
当有数据要从生产者发往消费者的时候,在kafka底层有这样一套流程。首先生产者调用send方法发送消息后,会先经过一层拦截器,接着进入序列化器。序列化器主要用于对消息的Key和Value进行序列化。接着进入分区器选择消息的分区。
|
消息中间件 Kafka
《kafka问答100例 -4》 如果我手动在zk中添加/brokers/topics/{TopicName}节点会怎么样?
《kafka问答100例 -4》 如果我手动在zk中添加/brokers/topics/{TopicName}节点会怎么样?
《kafka问答100例 -4》 如果我手动在zk中添加/brokers/topics/{TopicName}节点会怎么样?