http - 检测服务器上的 HTTP 请求失败

标签 http jakarta-ee transactions client-server distributed-system

我正在开发一个 HTTP 服务器,它处理来自客户端的事务请求。他们将通过高度不可靠的无线网络进行通信,所以我担心服务器数据库上数据的一致性。以下是我处理 POST 请求的方式:

void doPost(request, response)
{
    transaction = newTransaction();
    processBody(request);
    transaction.commit();
}

当我从未收到请求时,没有问题。客户端只是收到超时错误,并且没有执行任何事务。但是,如果响应 在网络上丢失会怎样?当然,客户端仍然会收到超时错误,但这次交易将在客户端不知道的情况下在服务器上完成!这是我需要处理的不幸案例。

因此,我的问题是:如何检测响应是否已送达并回滚事务?

我使用 JavaEE 编写我的服务器应用程序并将其托管在 Glassfish 上。

最佳答案

好的,我想出了这个。 HTTP/TCP 协议(protocol)栈没有检测响应丢弃的工具。但是,它可以很好地处理请求丢弃,因此我只需要将 POST 请求从服务器发送到客户端,就像这样:

void doPost(request, response)
{
    transaction = newTransaction();
    try {
        var result = processBody(request);
        sendPOSTToClient(result);
        transaction.commit();
    catch (IOException e) {
        transaction.rollback(); // network partition occured
    }
}

关于http - 检测服务器上的 HTTP 请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164452/

相关文章:

jakarta-ee - 如何调整 persistence.xml 文件以将 JPA 连接到 Java EE 环境中的 JDBC/MySQL 数据库(Tomcat + JSF)

c# - NHibernate:单个事务上的多次提交

entity-framework - Entity Framework 中的异步提交?

java - Android 使用 reSTLet 绕过配置文件代理

HTTP 1.1 到 HTTP/2 : what about headers?

json - 使用 Go 通过 HTTP 发送连续数据

java - 在使用 apache http 客户端发送请求之前修改请求 URI

java - 如何将表行值传递给 servlet?

java - Spring Security 动态登录

sql - 如果成功提交嵌套事务,父事务是否有可能失败