gpt4 book ai didi

java - 后续 REST 调用将被阻止,直到前一个调用完成

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:17 24 4
gpt4 key购买 nike

我有 REST 服务

@Path("/rest")
@Component
public class MyRestService
{
@Inject
private MyBean bean;

@GET
@Path("/do")
public String start()
{
this.logger.info("Before do " + Thread.currentThread().getId());
String result = this.bean.do();
this.logger.info("After do " + Thread.currentThread().getId());

return result;
}
}

它调用注入(inject)的 Spring 单例 bean 的方法(内部有一些状态)

@Service
public class MyBean
{
public String do()
{
// do something big...
}
}

当我在浏览器中调用“.../rest/do”时,第一个调用按预期进行,但如果我在另一个选项卡中进行相同的调用,则此调用会等到第一个调用完成以处理同一线程中的第二个调用。

如果我以“.../rest/do?async=true”进行第二次调用,它不会等待并在新线程中处理第二个请求,但如果我以“.../rest/do? async=true"- 第二个再次等待第一个完成。

这种行为的原因可能是什么?它实际上是预期的吗?

我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

<display-name>My REst</display-name>

<!-- spring configuration by annotations -->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<!-- spring configuration class -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>app.Config</param-value>
</context-param>

<!-- to return data according to extension -->
<context-param>
<param-name>resteasy.media.type.mappings</param-name>
<param-value>json : application/json, xml : application/xml</param-value>
</context-param>

<!-- this has to match with resteasy-servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>

<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>

<!-- resteasy spring connector (to use DI in rest-resources) -->
<listener>
<listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>

<!-- this has to match with resteasy-servlet url-pattern -->
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<!-- Bind Jboss's TransactionManager (EntityManagerFactory) to JNDI -->
<persistence-unit-ref>
<persistence-unit-ref-name>persistence/ReferenceDataDS</persistence-unit-ref-name>
<persistence-unit-name>ReferenceDataDS</persistence-unit-name>
</persistence-unit-ref>
</web-app>

最佳答案

您可以在 Debug模式下运行您的应用程序服务器来解决这个问题。使用两个不同的客户端进行测试,例如Firefox, Chrome, IE, Opera, ... 在等待答案时暂停所有线程。

  • 如果您看到只有一个工作线程处于 Activity 状态,则说明应用服务器的设置有问题。
  • 如果您看到多个工作线程处于 Activity 状态,但其中一个正在等待信号量,则您遇到了多个线程访问同一资源的问题
  • 如果您有多个工作线程处于 Activity 状态,但其中一个正在等待与持久性存储的连接,那么您的数据源没有连接池。

关于java - 后续 REST 调用将被阻止,直到前一个调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com