SqlServer2008 点对点模式实例
来源:互联网 发布:全球肥胖死亡数据报道 编辑:程序博客网 时间:2024/05/13 03:56
------(一)、启用数据库的Service Broker活动
-- Enabling Databases for Service Broker Activity
USE master
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'SSB_Test')
CREATE DATABASE SSB_Test
GO
ALTER DATABASE SSB_Test SET ENABLE_BROKER
GO
ALTER DATABASE SSB_Test SET TRUSTWORTHY ON
GO
-----(二)、创建数据库主密钥
-- Creating the DatabaseMaster Key for Encryption
USE SSB_Test
GO
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'I5Q7w1d3'
GO
-------(三)、管理消息类型
-- Managing Message Types
Use SSB_Test
GO
-- 发送消息类型
CREATE MESSAGE TYPE [//SSB_Test/SendMessages]
VALIDATION = NONE
GO
--目标数据库发送的消息类型
CREATE MESSAGE TYPE [//SSB_Test/ReceivedMessages]
VALIDATION = NONE
GO
------(四)、创建契约(Contract)
-- Creating Contracts
Use SSB_Test
GO
CREATE CONTRACT
[//SSB_Test/SSBContract]
( [//SSB_Test/SendMessages]
SENT BY INITIATOR,
[//SSB_Test/ReceivedMessages]
SENT BY TARGET
)
GO
-----------(五)、创建队列
Use SSB_Test
GO
--保存BookDistribution过来的消息
CREATE QUEUE SSBSendQueue
WITH STATUS=ON
GO
USE SSB_Test
GO
--保存BookStore过来的消息
CREATE QUEUE SSBReceivedQueue
WITH STATUS=ON
GO
-------(六)、创建服务
-- Creating Services
Use SSB_Test
GO
CREATE SERVICE
[//SSB_Test/FromService]
ON QUEUE dbo.SSBSendQueue--指定的队列绑定到契约
([//SSB_Test/SSBContract])
GO
USE SSB_Test
GO
CREATE SERVICE [//SSB_Test/ToService]
ON QUEUE dbo.SSBReceivedQueue--指定的队列绑定到契约
([//SSB_Test/SSBContract])
GO
USE SSB_Test
GO
--创建一个表存放接收到的订单信息
CREATE TABLE dbo.SSBReceived
(ReceivedID int IDENTITY (1,1) NOT NULL,
conversation_handle uniqueidentifier NOT NULL,
conversation_group_id uniqueidentifier NOT NULL,
message_body VarBinary(max) NOT NULL)
GO
----1:
USE SSB_Test
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Send_Messages]
@sendMsgContext VarBinary(max),
@result int OUTPUT
AS
DECLARE @Conv_Handler uniqueidentifier
DECLARE @sendMsg VarBinary(max);
SET XACT_ABORT ON
BEGIN TRANSACTION
BEGIN DIALOG CONVERSATION @Conv_Handler
FROM SERVICE [//SSB_Test/FromService]
TO SERVICE '//SSB_Test/ToService'
ON CONTRACT [//SSB_Test/SSBContract]
---WITH LIFETIME = 200;
SET @sendMsg = @sendMsgContext;
----第二步:发起会话
SEND ON CONVERSATION @Conv_Handler
MESSAGE TYPE [//SSB_Test/SendMessages]
(@sendMsg);
END CONVERSATION @Conv_Handler WITH CLEANUP;
SET @result = 1
COMMIT TRANSACTION
RETURN @result;
USE SSB_Test
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Receive_Messages]
AS
DECLARE @Conv_Handler uniqueidentifier
DECLARE @Conv_Group uniqueidentifier
DECLARE @Receive_Msg VarBinary(max);
----DECLARE @TextResponseMsg varchar(8000)
----DECLARE @ResponseMsg VarBinary(max);
DECLARE @Message_Type_Name nvarchar(256);
SET XACT_ABORT ON
BEGIN TRAN;
--WHILE(1=1)
--BEGIN
---WAITFOR(
RECEIVE TOP(1) @Receive_Msg = message_body,
@Conv_Handler = conversation_handle,
@Conv_Group = conversation_group_id,
@Message_Type_Name = message_type_name
FROM dbo.SSBReceivedQueue
---),TIMEOUT 200
IF @Message_Type_Name = '//SSB_Test/SendMessages'
BEGIN
INSERT dbo.SSBReceived
(conversation_handle, conversation_group_id, message_body)
VALUES
(@Conv_Handler,@Conv_Group, @Receive_Msg)
END
IF @Message_Type_Name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
BEGIN
END CONVERSATION @Conv_Handler;
END
COMMIT TRAN
GO
二:程序调用发送存储过程
package com.dingli.json.util;
import java.nio.ByteBuffer;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
public class TestMutilServiceBroker {
/**
* @param args
*/
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(50);
exec.scheduleAtFixedRate(new ServiceBroker(), 1000, 1000,
TimeUnit.MILLISECONDS);
}
}
class ServiceBroker implements Runnable {
protected final Logger logger = Logger.getLogger(ServiceBroker.class);
final static String driver = "net.sourceforge.jtds.jdbc.Driver";
private static Connection conn = null;
private CallableStatement cStmt = null;
@Override
public void run() {
final ServiceBroker test = new ServiceBroker();
final Connection con = test.getConnection();
final long starttime = System.currentTimeMillis();
Send_Message(con);
// Mutil_Send_Message(con);
long endtime = System.currentTimeMillis();
logger.info("每次发送消息响应时间毫秒=" + (endtime - starttime));
}
private Connection getConnection() {
try {
Class.forName(driver);
final String url = "jdbc:jtds:sqlserver://172.16.0.10:1433;DatabaseName=SSB_Test";
// final String url =
// "jdbc:jtds:sqlserver://172.16.0.10:1433;DatabaseName=BookStore";
final String username = "sa";
final String password = "Fleet2011@DB.";
conn = DriverManager.getConnection(url, username, password);
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final SQLException e) {
e.printStackTrace();
}
return conn;
}
private void Send_Message(Connection con) {
try {
cStmt = con.prepareCall("{call [dbo].[Send_Messages](?,?)}");
final StringBuffer sb = new StringBuffer();
ByteBuffer buffer = ByteBuffer.allocate(5000);
sb.append("<order id=\"3439\" customer=\"22\" orderdate=\"2/15/2011\"><LineItem ItemNumber=\"1\" ISBN=\"1-59059-592-0\" Quantity=\"1\" /></order>");
buffer.put(sb.toString().getBytes());
cStmt.setBytes("@sendMsgContext", buffer.array());
// cStmt.setString("@sendMsgContext", buffer);
cStmt.setInt("@result", 0);
cStmt.execute();
sb.delete(0, sb.length());
} catch (final SQLException e) {
e.printStackTrace();
} finally {
try {
cStmt.close();
con.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
}
private void Mutil_Send_Message(Connection con) {
try {
cStmt = con
.prepareCall("{call [dbo].[sp_PublishOrSubscriptionMessages](?,?,?,?,?,?)}");
final StringBuffer sb = new StringBuffer();
// sb.append("<order id=\"3439\" customer=\"22\" orderdate=\"2/15/2011\"><LineItem ItemNumber=\"1\" ISBN=\"1-59059-592-0\" Quantity=\"1\" /></order>");
// cStmt.setString("@sendMsgContext", sb.toString());
// cStmt.setInt("@result", 0);
sb.append("<?xml version=\"1.0\"?><Publish xmlns=\"http://ssb.csharp.at/SSB_Book/c10/PublishSubscribe\"><Subject>Subject1</Subject></Publish>");
cStmt.setString("@FromServerName", "[AuthorService]");
cStmt.setString("@ToServerName", "PublisherService");
cStmt.setString("@ContractName",
"[http://ssb.csharp.at/SSB_Book/c10/PublishContract]");
cStmt.setString("@MessageType",
"[http://ssb.csharp.at/SSB_Book/c10/PublishMessage]");
cStmt.setString("@MessageBody", sb.toString());
cStmt.setInt("@result", 0);
cStmt.execute();
sb.delete(0, sb.length());
} catch (final SQLException e) {
e.printStackTrace();
} finally {
try {
cStmt.close();
con.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
}
}
三:程序接收消息调用存储过程
package com.dingli.json.util;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.Logger;
public class TestServiceBrokerTwo implements Serializable {
protected static Logger logger = Logger
.getLogger(TestServiceBrokerTwo.class);
/**
*
*/
private static final long serialVersionUID = -8531232416149283642L;
final String driver = "net.sourceforge.jtds.jdbc.Driver";
Connection conn = null;
CallableStatement cStmt = null;
/**
* @param args
*/
public static void main(String[] args) {
TestServiceBrokerTwo test = new TestServiceBrokerTwo();
Connection con = null;
while (true) {
con = test.getConnection();
long starttime = System.currentTimeMillis();
test.Receive_Messages(con);
long endtime = System.currentTimeMillis();
logger.info("每次接收消息响应时间毫秒=" + (endtime - starttime));
}
}
public Connection getConnection() {
try {
Class.forName(driver);
String url = "jdbc:jtds:sqlserver://172.16.0.10:1433;DatabaseName=SSB_Test";
String username = "sa";
String password = "Fleet2011@DB.";
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void Receive_Messages(Connection con) {
try {
cStmt = con
.prepareCall("{call [dbo].[Receive_Messages]}");
cStmt.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
ClearConnection(cStmt, con);
}
}
public void ClearConnection(CallableStatement cStmt, Connection con) {
try {
cStmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
四:检验数据
select * from dbo.SSBReceivedQueue;
select * from dbo.SSBSendQueue;
select * from dbo.SSBReceived;
- SqlServer2008 点对点模式实例
- SqlServer2008 Service Broker点对点模式应用
- jms 点对点模式实例
- JMS消息发送和接收实例 - 点对点模式
- JMS消息发送和接收实例 - 点对点模式
- SqlServer2008--建立触发器实例
- SqlServer2008--建立触发器实例
- SqlServer2008--建立触发器实例
- SqlServer2008--建立触发器实例
- SqlServer2008--建立触发器实例
- SQLServer2008 视图创建实例
- SqlServer2008--建立触发器实例
- Activemq点对点模式
- activemq点对点模式
- ActiveMQ 点对点模式
- peer to peer(点对点)实例
- websocket点对点聊天java实例
- SQLServer2008中报实例错误。
- Activiti学习资料(组件,API,部署)
- 关于UIWebView的一些事
- 彩色的log信息
- 自贬:灵魂之病
- NSBundle介绍
- SqlServer2008 点对点模式实例
- Ubuntu12.04下安装Matlab 2012a
- jsp获取当前目录下的文件和目录,获取windows盘符
- ABAP Modify 的用法
- linux命令brctl网桥的使用
- vector容器的清空(内存和对象)
- hdu 3415 后缀数组 长度不小于 k 的公共子串的个数
- java多线程总结
- magento核心类-Varien_Object