как зафиксировать или очистить ответ покоя в середине процесса - PullRequest
0 голосов
/ 06 ноября 2011

Я новичок и в джаве, и в джерси. Теперь я хочу использовать джерси для реализации REST-сервисов с дополнительной обработкой после отправки ответа (в частности, отложите фиксированное количество секунд, а затем запустите другой REST-запрос в том же контексте сервлета, поэтому он не похож на REST-прокси). Я некоторое время гуглил, но все, кажется, принимают это как должное, что неявно сбрасывает ответ в конце метода. Вот текущие коды с включенным JAXB, над которыми я изо всех сил стараюсь работать.

@Path("/chat")
public class LoadSimulator {

    @Context private UriInfo uriInfo;

    @Path("/outbound/{senderAddress}/requests")
    @POST
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response createOutboundSMSMessage(OutboundSMSMessageRequest inSmsReq, @PathParam("senderAddress") String senderAddress) throws JAXBException {
        String requestId = UUID.randomUUID().toString();
        URI uri = uriInfo.getAbsolutePathBuilder().path(requestId).build();

        ObjectFactory factory = new ObjectFactory();
        ResourceReference resourceReference = new ResourceReference();
        resourceReference.setResourceURL(uri.toString());
        JAXBElement<ResourceReference> inSmsResponse = factory.createResourceReference(resourceReference);
                return Response.created(uri).entity(inSmsResponse).build();
             //// want to flush or commit the response explicitly like:
              //        out.flush();
            //        out.close();
            //// Then sleep for a few second and fire a new REST request
            //        sleep(5);
            //          ....   
            // ClientConfig config = new DefaultClientConfig();
            // String response = r.path("translate").queryParams(params).get(String.class);



    }
}

1 Ответ

0 голосов
/ 06 ноября 2011

Если бы вы могли делать то, что пытались сделать, вы бы исчерпали ресурсы на вашем сервере, потому что каждый запрос занимал бы X секунд, и у вас было бы ограниченное количество потоков, доступных для того, чтобы ящик выкрикнул дядя.

Не комментируя , почему вы бы хотели это сделать; Если вы использовали аннотацию @Singleton для вашей LoadSimulator, вы могли бы создать поток, который прослушивает (параллельную) очередь в @PostConstruct public void init() - которая вызывается при запуске вашего сервлета.

@Singleton
@Path("/chat")
public class LoadSimulator {
    private Thread restCaller;
    private ConcurrentLinkedQueue<MyInfo> queue = new ConcurrentLinkedQueue<MyInfo>();

    ...
    @PostConstruct public void init()
    {
        restCaller = new Thread(new MyRunnable(queue));
        restCaller.start();
    }
    ...

Затем в своем вызове REST вы поместите любую информацию, необходимую для второго вызова REST в эту очередь, и получите вышеупомянутый поток, выполняющий его и выполняющий запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...