当前位置: 首页 > 知识库问答 >
问题:

使异步Web服务调用在Java中同步

滕璞瑜
2023-03-14

我是web服务开发的初学者。我们正在使用Spring3用java构建RESTWeb应用程序。

我们正在使用的Web服务具有异步登录方法。我们为他们提供了一个回调监听器URL,他们的服务在其中发回响应。

因此,当我们发送登录请求时,我们会收到一个空白响应作为确认。和服务发送一个响应,其中包含侦听器URL上的实际数据。

请帮助,我应该如何设计/实现调用登录服务作为同步调用?谢谢

编辑:下面是回发消息的监听器/控制器,它提取令牌并设置为对象。

@Controller
public class PostbackController {

    @Autowried
    public LoginResponse loginRS;

    @RequestMapping(value = "/callbacklistener", method = RequestMethod.POST)
    @ResponseBody
    public String postbackHandler(@RequestParam("postback") String requestMessage) {
        //We extract the token value from requestMessage.
        String token = requestMessage;
        loginRS.setToken(token);
        return "<Confirm/>";
    }
}

下面是一个调用登录服务并等待10秒的线程。每隔2秒,它会检查对象的状态。

public class LoginService extends Thread {

    @Autowried
    public LoginResponse loginRS;

    public LoginService() {
        this.start();
    }

    @Override
    public void run() {
        try {
            System.out.println("Thread Start.");
            this.login();
            System.out.println("Thread Complete.");
        } catch (InterruptedException e) {}
    }

    public LoginResponse login() {
        String loginXML = "";
        String response = "";//by calling REST web service using RESTtemplate we get blank response.

        for(i=0; i < 6; i++) {
            if(loginRS.getToken().length > 0))  {
                //Got the response exit from thread
                break;
            }
            else {
                //Wait for 2 second
                Thread.sleep(2000)
            }
        }
        return loginRS;
    }
}

如果你需要更多信息,请告诉我。谢谢

共有1个答案

元英朗
2023-03-14

一些伪代码,让你的想法

Login request sender Thread{

    acknowledgement = sendLoginRequest

    sleep() or wait on some lock

}


ListenerThread{

    response received = listenForResponse

    lock.notifyAll() or interrupt Login Thread

}

这样做可以使其同步。

更新:

public class PostbackController {

        @Autowried
        public LoginResponse loginRS;
        //instance 1 injected by Spring where you set the token
}



public class LoginService extends Thread {

    @Autowried
    public LoginResponse loginRS;

    //a NEW instance will be created here also by Spring which will not have that token you set, as this is a new instance. So Thread will keep sleeping always.
}

制作PostbackControllerLoginService嵌套类,并使用相同的PostbackController

 类似资料:
  • 我有一个链接生成器服务,它能够生成到特定内容类型的链接(用户的详细信息页面,内容项目的详细信息页面等)。 这个服务真的很好用,而且有同步功能: 现在,我必须为登录用户引入单独的路由,以便将更改为。 我需要添加到链接生成器服务中的唯一更改是检查并返回不同的路由URL。这不是一个问题,只要我的登录用户的信息将是同步可用的。但这不是... 我有一个返回一个承诺。第一次调用它时,它实际上发出了一个服务器请

  • 问题内容: 我有一个作为常规SOAP Web服务公开的接口。该接口的一种方法包括让客户端将文件发送到服务器,然后服务器处理该文件并返回结果文件。处理文件可能需要一些时间,因此我认为使用异步调用此方法是一个更好的主意。我考虑了以下流程: 客户端调用异步方法,并使用附件(MTOM)发送文件。服务器接收到文件后,会将响应发送回客户端,表明已接收到该文件,并将在不久后对其进行处理。处理完文件后,会将响应发

  • 我使用jmeter调用异步fire并忘记SOAP webservice,并在表中显示结果。 如果我使用WebService(SOAP)请求采样器,它会将调用结果记录为警告,即使状态码为200,也会导致ws响应为空消息。 对于SOAP/XML-RPC请求,日志表显示te请求已结束。 可以告诉WebService(SOAP)请求将空响应理解为有效响应吗? 谢了。

  • 关于是否使用RMQ / Kafka / Http等进行微服务之间通信的讨论,我有点不知所措。我希望对此有所了解。首先,我的客户端是一个移动应用程序,它进行同步调用并等待响应。 凭直觉,我不希望java服务器和Python分类器之间的内部通信是同步的,因为我希望有高吞吐量,因为我可以让数千或数百万(希望如此)客户机同时发送请求。 如何进行非阻塞请求-响应,并将请求检索到同一客户端? 客户

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?

  • 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能。它的简单性、易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择。然而,Tornado受到最多关注的功能是其异步取得和提供内容的能力,它有着很好的理由:它使得处理非阻塞请求更容易,最终导致更高效的处理以及更好的可扩展性。在本章中,我们将看到Tornado异步请求的基础,以及一些推送技术,这种技术可以使你使用更