我在Visual Studio中开发的dtsx包中有一个Web服务任务。它有一个http连接,超时设置为30秒。该包作为sql server(2008 r2)代理作业中的一个步骤包含在内。当我部署包时,我将其设置为存储在SQL Server中。
我希望能够在sql作业步骤中仅更改Timeout设置,但我不确定如何执行此操作,即使可能。目前我正在更改VS中的设置,然后每次重新部署包。
任何人都可以帮我解决这个问题吗?应该设置哪个工作步骤选项卡?
答案 0 :(得分:1)
有一件事需要注意,HTTP连接管理器上有超时属性,但是用于控制与Web服务的实际连接。如果有意义的话,它不控制调用特定方法的实际时间。
我有一个2005软件包,它使用了一个用于清理地址的Web服务。 Web服务是在内部托管的,因此HTTP连接就像LAN速度一样,没有问题。服务本身可以非常快速地标准化一个地址。当我需要大量清理几十万时,那需要花费不少的时间。从2008 R2开始,XML任务内置了6分钟的不可变默认超时。如果您需要3601秒或永不超时,那就不那么方便了。我无法找到调用该文档的文档,但您可以通过打开一个睡眠时间超过6分钟的服务来验证行为。
我们的解决方案是使用脚本任务来处理实际的服务调用,以便我们可以覆盖服务调用的Timeout
属性。
Public Sub Main()
Dim url As String
Dim inboundFile As String
Dim success As Boolean
Dim timeoutMs As Integer
' 1 hour = 60min * 60 sec * 1000 milliseconds
timeoutMs = 60 * 60 * 1000
inboundFile = CStr(Dts.Variables("NetworkShareInput").Value)
url = CStr(Dts.Variables("WebService").Value)
Try
Dim svc As New AddressCleanerService(url)
' Explicitly provide a timeout for the web service connection
svc.Timeout = timeoutMs
svc.Credentials = System.Net.CredentialCache.DefaultCredentials
success = svc.CleanBulkAddresses(inboundFile)
Catch ex As Exception
Dts.Events.FireError(0, "Address cleaning", "Something failed in the address component stuff", String.Empty, 0)
Dts.Events.FireError(0, "Address cleaning", ex.ToString(), String.Empty, 0)
End Try
If (success) Then
Dts.TaskResult = ScriptResults.Success
Else
Dts.TaskResult = ScriptResults.Failure
End If
End Sub
答案 1 :(得分:0)
一种方法是使用表达式并从sql代理作业传递超时值。以下是高级步骤:
在SSIS包中创建一个变量以保存超时值。 在HTTP连接的属性窗口中,单击表达式eclipse按钮。 展开属性表达式编辑器中的属性下拉列表。选择超时。 并使用您之前创建的超时变量。例如:@ [User :: Timeout]
在SQL Agent中,使用命令行作为作业类型,并使用DTEXEC执行SSIS包。
在DTEXEC命令中,您可以将值传递给变量。以下是一个逗号示例: dtexec / f C:\ SSIS \ Package.dtsx / set \ package.variables [Timeout] .Value; 45
因此,当您想要更改超时值时,只需在SQL代理作业中更改它,而不是重新部署包。
答案 2 :(得分:0)
首先,如果你仍然可以控制源代码,我会指出你的包配置。然后,您可以在XML文件或数据表中编辑这些设置。
假设您没有,可以使用作业步骤的“设置值”选项卡将一些值推入包中。困难的部分是使属性路径正确。同样,使用Visual Studio和包配置功能,您应该能够找到正确的名称。
尝试使用此属性路径:\Package.Connections[myHttpConnection].Properties[Timeout].Value