为什么 BizTalk 2016 会杀死自定义管道组件线程?

问题描述

我有一个 BizTalk 自定义管道组件,用于写入 SFTP 文件(使用 SSH.net),由 SFTP (WinSCP) 接收位置触发。

重试中的代码偶尔(大约有一半的时间)既未命中“成功”,也未命中日志捕获块,并且管道内不会发生进一步的处理。我认为这意味着线程已被销毁。

我稍后添加了 Retry 代码以使其尝试几次,但随着线程被破坏,我并不总是成功或 3 次失败。

什么可能导致 BizTalk 2016 出现这种行为?

public void Archive(byte[] content,string archivePath,string userName,string password,string serverAddress,string sshHostKeyFingerprint)
        {
            Retry(3,() =>
            {
                try
                {
                    using (var sftpClient = new SftpClient(serverAddress,userName,password))
                    {
                        if (!string.IsNullOrWhiteSpace(sshHostKeyFingerprint))
                        {
                            sshHostKeyFingerprint = sshHostKeyFingerprint.Split(' ').Last();
                            sftpClient.HostKeyReceived += delegate (object sender,HostKeyEventArgs e)
                            {
                                if (e.FingerPrint.SequenceEqual(ConvertFingerprintToByteArray(sshHostKeyFingerprint)))
                                    e.CanTrust = true;
                                else
                                    e.CanTrust = false;
                            };
                        }
                        sftpClient.Connect();
                        sftpClient.WriteallBytes(archivePath,content);
                        sftpClient.disconnect();
                        LogInfo($"Success");
                    }
                }
                catch (Exception exception)
                {
                    // show the bad path for "No such file" errors
                    throw new InvalidOperationException($"Failed to create file '{archivePath}'",exception);
                }
            });
        }

private void Retry(int maxAttempts,Action action)
        {
            int attempt = 1;
            while (attempt <= maxAttempts)
            {
                try
                {
                    action();
                    break; // success
                }
                catch (Exception exception)
                {
                    LogWarning($"Attempt {attempt} Error: {exception.ToString()}");
                    if (attempt == maxAttempts)
                        throw; // final attempt exception propagated
                }
                finally
                {
                    attempt++;
                }
            }
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...