C# 当多个连接可用时,无法处理连接问题(DB或外部系统)

C# 当多个连接可用时,无法处理连接问题(DB或外部系统),c#,error-handling,connection,integration-testing,ems,C#,Error Handling,Connection,Integration Testing,Ems,我对处理多个连接有疑问。这些连接可以是DB连接、SOA连接、EMS连接等 假设我有一个数据库连接,其中我拉取数据,我有两个EMS连接,都有不同的数据和独立的数据。数据被发送到EMS并更新状态,无论数据是否成功发送 1) 当我们无法访问数据库时,如果数据库连接断开或出现任何其他问题 2) 任何一个EMS连接断开,应用程序应继续处理另一个EMS连接。 3) 如果我们能够向EMS发送数据,但无法更新数据库问题的数据库状态bcos,会发生什么情况?我们应该如何处理内存中所有需要发送到EMS的消息。 4)

我对处理多个连接有疑问。这些连接可以是DB连接、SOA连接、EMS连接等

假设我有一个数据库连接,其中我拉取数据,我有两个EMS连接,都有不同的数据和独立的数据。数据被发送到EMS并更新状态,无论数据是否成功发送

1) 当我们无法访问数据库时,如果数据库连接断开或出现任何其他问题 2) 任何一个EMS连接断开,应用程序应继续处理另一个EMS连接。 3) 如果我们能够向EMS发送数据,但无法更新数据库问题的数据库状态bcos,会发生什么情况?我们应该如何处理内存中所有需要发送到EMS的消息。 4) 无法建立与1个EMS的连接,但另一个EMS能够建立连接,因此应用程序应处理该EMS消息


这些是我必须处理的一些-ve测试用例。请随时告诉我,如果我必须解决的任何其他问题,到不同来源的多个连接,听起来是系统事务的好解决方案(如果EMS支持)

试着这样做,这样所有3个操作都可以作为一个工作单元成功或失败

        try
        {
            using (TransactionScope tran = new TransactionScope())
            {
                Method1Save(); //DB
                Method2Save(); //EMS1
                Method3Save(); //EMS2
                tran.Complete();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Problem " + ex.ToString());
        }

如果EMS不支持TransactionScope,那么您将不得不手动处理它,可能是将事务放在连接本身上,然后在操作成功后提交所有事务,这意味着为每个数据源保持连接打开的时间更长。

我已经在使用TransactionScope。让我给你举个例子。我们从数据库中读取数据。假设我们有500条记录,我们运行5个线程来处理数据并发送到EMS。如果EMS无法接受消息,或者队列已满,或者存在一些连接问题,我们该怎么办?我们是否需要重新启动应用程序,或者等待,或者等待一段时间再试一次。如果重试多少次,其他线程又如何,如果我们已经知道它失败了,我们是让其他线程尝试发送消息,还是让所有线程等待一段时间然后重试。另一种情况。如果要将状态更新为DB,则消息发送成功或失败。如果我们将消息发送到EMS,但无法更新问题的DB BCO,会发生什么情况。我们是否允许将其他消息发送到EMS,或者等待DB连接解决,bcos如果状态未更新,则它将尝试再次发送与我们已发送的消息相同的消息。@Bunny-对于线程失败,可能在取消所有其他线程之前设置线程失败数的阈值。如果出现轻微的故障(可以将故障重新排队),您不希望停止,但如果数据库已关闭,则无需纠缠它。另外,您可以更仔细地查看数据库错误,看看是否将连接错误与非连接错误分开。@Bunny-如果您将消息发送到BMS,而数据库关闭,则需要将消息存储在临时存储中,直到数据库备份。可能这是内存中的文件,或者以XML或其他格式保存到文件系统中。然后,一旦数据库备份,您将在处理任何新消息之前,首先在临时存储中处理发送的消息。基本上,您需要一个辅助存储系统来处理这种情况,以临时保存消息,直到它可以保存到DB。我必须将消息发送到2个EMS队列。假设第一个队列已关闭,第二个队列正在工作。如果线程数为3。所有3个线程都将消息发送到第一个队列,该队列已关闭。我正在使用辅助存储,但这仅适用于失败的消息,失败的消息将在另一个线程上重试,该线程是单线程的,以维护顺序。因此,每次完成任何EMS时,都会处理所有其他EMS消息。当所有消息完成后,我们会收到除失败消息之外的新消息,bcos必须首先处理失败消息。