Как переопределить параметр соединения dtsx в шаге задания sql-сервера

У меня есть задача веб-службы в пакете dtsx, разработанном в Visual Studio. Он имеет http-соединение с тайм-аутом в 30 секунд. Пакет включен как шаг в работе агента сервера sql (2008 r2). Когда я развернул пакет, я настроил его для хранения в SQL Server.

Я хотел бы иметь возможность изменять только параметр Timeout на этапе работы sql, но я не уверен, как это сделать или даже если это возможно. На данный момент я меняю настройку в VS, а затем перераспределяя пакет каждый раз.

Кто-нибудь может мне помочь, как это сделать? Какую вкладку на шаге задания следует установить?

0

4 ответы

Одна вещь, о которой нужно знать, - это свойство тайм-аута в диспетчере соединений HTTP, но для управления фактическим подключением к веб-службе. Он не управляет фактическим временем для вызова конкретного метода, если это имеет смысл.

У меня был пакет 2005 года, который использовал веб-сервис для очистки адресов. Webservice был размещен внутри, поэтому HTTP-соединение было как скорость LAN, без проблем. Сама услуга может довольно быстро стандартизировать один адрес. Когда мне нужно начистить несколько сотен тысяч штук, то это займет не несущественное количество времени. Задача xml имеет встроенный, начиная с 2008 R2, неизменяемый тайм-аут по умолчанию в течение 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
добавлено
Да - использование задачи сценария и настройка времени ожидания службы. Единственное различие заключалось в том, что я установил его так, чтобы он вообще не уходил (svc.Timeout = System.Threading.Timeout.Infinite), как описано здесь: msdn.microsoft.com/en-us/library/… . Спасибо за вашу помощь, это решило мою проблему.

Одна вещь, о которой нужно знать, - это свойство тайм-аута в диспетчере соединений HTTP, но для управления фактическим подключением к веб-службе. Он не управляет фактическим временем для вызова конкретного метода, если это имеет смысл.

У меня был пакет 2005 года, который использовал веб-сервис для очистки адресов. Webservice был размещен внутри, поэтому HTTP-соединение было как скорость LAN, без проблем. Сама услуга может довольно быстро стандартизировать один адрес. Когда мне нужно начистить несколько сотен тысяч штук, то это займет не несущественное количество времени. Задача xml имеет встроенный, начиная с 2008 R2, неизменяемый тайм-аут по умолчанию в течение 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
добавлено
Да - использование задачи сценария и настройка времени ожидания службы. Единственное различие заключалось в том, что я установил его так, чтобы он вообще не уходил (svc.Timeout = System.Threading.Timeout.Infinite), как описано здесь: msdn.microsoft.com/en-us/library/… . Спасибо за вашу помощь, это решило мою проблему.

Во-первых, если у вас все еще есть контроль над исходным кодом, я бы указал вам на конфигурации пакетов. Затем вы можете редактировать эти параметры в файле xml или таблице данных.

Предполагая, что вы этого не сделаете, вы можете вставить некоторые значения в пакет, используя вкладку «Установить значения» на шаге задания. Жесткая часть - правильная трактовка свойств. Опять же, используя Visual Studio и функцию конфигурации пакета, вы должны иметь возможность найти правильное имя.

Try this for the property path: \Package.Connections[myHttpConnection].Properties[Timeout].Value

0
добавлено
Спасибо за ваш ответ. Я попробовал метод Set Values, так как это казалось самым быстрым способом выполнить немного экспериментов (для информации вам не нужен .Value в конце пути). К сожалению, вы, похоже, не можете отменить максимальный тайм-аут в 300 секунд. Я попытался установить его на 600, и он ошибся, но установив его на 300, он работал нормально. Я подозреваю, что использование задачи сценария будет таким, как нужно, так как нам нужно планировать выполнение задания с регулярными интервалами, но не хотите, чтобы он перезапустился, если служба по-прежнему идет из предыдущего запуска.
добавлено автор Crelp, источник

Один из способов сделать это - использовать выражения и передать значение таймаута из задания агента sql. Ниже приведены шаги высокого уровня:

Создайте переменную в вашем пакете SSIS, чтобы сохранить значение таймаута. В окне свойств HTTP-соединения нажмите кнопку Eclipse. Разверните раскрывающийся список свойств в редакторе выражения свойств. Выберите Время ожидания. И используйте переменную таймаута, которую вы создали ранее. Что-то вроде: @ [User :: Timeout]

В SQL Agent используйте командную строку как тип задания и используйте DTEXEC для выполнения пакета SSIS.

В команде DTEXEC вы можете передавать значения в переменные. Ниже приведен пример: dtexec/f C: \ SSIS \ Package.dtsx/set \ package.variables [Timeout] .Value; 45

Поэтому, когда вы хотите изменить значение тайм-аута, просто измените его в задании агента SQL вместо повторного развертывания пакета.

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)