2

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);

            }
        }
    }

前もって感謝します、

アレックス

4

0 に答える 0