JBoss AS 7.1.2 で RestEasy を使用して jax-rs サービスを実装しています。ここで説明されているように、非同期 HTTP 処理を使用したいと考えています: http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide /html/Asynchronous_HTTP_Request_Processing.html
AsynchronousResponse については、10 秒のタイムアウトを定義します。この期間が過ぎると、リクエストは 200 OK と空の本文で応答されます。この動作を変更したいので、タイムアウト イベントについて通知を受ける必要があります。
私の解決策では、当分の間 AsycnhronousResponse を保持する NotificationManager オブジェクトでタイムアウト イベントを処理したいと考えています。詳細については、以下のコードを参照してください。
これまでのところ、私はそれを行う方法を理解できませんでした。RestEasy 非同期 HTTP 処理の経験がある人はいますか?
@POST
@Path("/blabla")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void subscribeLongPolling (
final @Suspend(10000) AsynchronousResponse response,
JAXBElement<LongPollingRequestParameters> rqParam,
@Context HttpServletRequest req) throws Exception {
//do some stuff with req
Thread t = new Thread("ThreadSubscribeTo:" + channelID)
{
@Override
public void run() {
//hand over to Notification Manager to return notifications in case some exist
try {
NotificationManager nm = new NotificationManager();
nm.setAsyncResponseObject(response);
logger.info("Response object registered in NotificationManager");
}catch (Exception e){
e.printStackTrace();
}
}
};
t.start();
logger.info("Releasing Thread");
}
public class NotificationManager {
private AsynchronousResponse response;
private NotificationList nList;
public synchronized void setAsyncResponseObject(AsynchronousResponse response) {
this.response = response;
if (nList.getAny().size() > 0) {
logger.info("Stored notification send to web client: " + nList.getAny().get(0).toString());
sendNotification(nList.getAny().remove(0));
}
}
public synchronized void sendNotification(Object message){
if (response != null){
logger.info("Response object found. Send notification immediately: " + message.toString());
Response responseObject = Response.ok(message, MediaType.APPLICATION_XML).build();
response.setResponse(responseObject);
response = null;
}else{
logger.info("Response object not found notification will be stored");
addNotification(message);
}
}
}
前もって感謝します、
アレックス