私は非同期に実行したいREST Webサービスに問題があります。この例は、私がしたいことを示しています。主な問題は、Webサービスが古いものが終了するまで新しい要求を受け入れていないことです。私はアプリケーションサーバーとそのRESTeasy実装としてWildfly 10を使用しています。非同期REST Webサービス
WebApplication.java
@ApplicationPath("rest")
public class WebApplication extends Application
{
public WebApplication()
{
super();
}
}
TestService.java
@Path("test")
public class TestService
{
@Inject
private TestBean bean;
@GET
@Produces(MediaType.APPLICATION_JSON)
public void getDateTime(@Suspended final AsyncResponse response)
{
CompletableFuture.supplyAsync(() -> response.resume(bean.getResult()))
.exceptionally((ex) -> (response.resume(ex)));
}
}
TestBean.java
@Stateless
public class TestBean
{
public TestTO getResult()
{
Logger.getLogger(Thread.currentThread().getName()).log(Level.INFO, "Entering REST service");
for (long l = 0; l < Long.MAX_VALUE; l++)
{
// just for simulating a veeeery heavy operation
}
return new TestTO();
}
}
TestTOは単純なPOJOなので、特別なものはありません。何が間違っているのか想像できない。私はGoogleでさまざまなアプローチを見て検索しましたが、何も機能しませんでした。
私はresponse.resume()コールの後にループを置き、以前のものを残さずに新しい要求を受け入れました(デバッグするために単純なロギングステートメントを使用しました)。
So ... 2番目のリクエストをブロックするのは何ですか?私は本当にそれを得ることはできません、または何かばかげた行方不明ですか?
ありがとうございます!
TestBeanを '@ RequestScoped'にします。一度に1つのスレッドだけがEJBインスタンスにアクセスできます。 –
TestBeanは '@ Stateless'アノテートされているので、コンテナはリクエストごとに新しいインスタンスを作成します(プールサイズと再利用を無視すると)?だから、すべてのスレッドが独自のインスタンスを持っている...私が間違っている場合私を修正します。 – 2ChRisPY5
それは起こると思う理由はありません。私はデフォルトで@Dependentと信じており、事実上シングルトンであるJAX-RSサービスにそれを注入しています –