2016-11-17 2 views
1

Мне нужно сделать службу REST Java, которая вернет входной поток в качестве ответа. Моя проблема в том, что я не знаю, как закрыть поток после того, как клиент получит весь поток. Я использую Java и CXF. БлагодаряКак закрыть поток службы REST?

@GET 
@Path("/{uuid}") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response getAttachmentByUuid(@PathParam("uuid")String uuid) 
{ 
//getting inputstream from AWS S3 
InpputSream is=getStreamFromS3(uuid); 
return Response.status(Response.Status.OK).entity(is).build(); 
// will this "is" stream causes memory leak,, do I have to close it. Client side is not controlled by me 
} 
+0

Почему не просто 'close()' поток? Как вы обрабатываете поток на стороне клиента? У вас есть ошибки? Пожалуйста, разместите код и следы исключений – pedrofb

+0

Просьба представить код, который вы разработали до сих пор. – mangotang

+0

Я только что обновил вопрос –

ответ

1

JAX-RS реализован с использованием сервлетов Java. В случае использования CXF CXFServlet. Ваш поток будет отправлен клиенту, используя HttpServletResponse сервлета интерфейс

public void doGet(HttpServletRequest request, HttpServletResponse response) 

Вы не должны закрывать источник потока (HttpServletResponse), если вы не создали его. Это ОТВЕТСТВЕННОСТЬ контейнера, и вы можете влиять на жизненный цикл запроса

Смотрите также Is is necessary to close the input stream returned from HttpServletRequest?

+0

Это отлично сработало для меня. Спасибо –

+0

Счастливые, чтобы помочь. Пожалуйста, если этот ответ правильный (или любой другой), не забывайте, что вы можете принять его для использования в будущем – pedrofb

0

Вы можете искать, чтобы использовать «Conduit» См CXF Apache Custom Transport для получения дополнительной информации. Будьте Осторожны, документация гласит:

настоятельно рекомендуются не ломается потоковыми в кабелепроводных и Destination реализаций, если физический протокол поддерживает его. CXF полностью ориентирован на потоки - он обеспечивает высокую производительность и масштабируемость.

1

Если у вас есть поток, чтобы закрыть, рассмотреть попробовать с ресурсами:

@GET 
@Path("/{uuid}") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response getAttachmentByUuid(@PathParam("uuid")String uuid) 
{ 
//getting inputstream from AWS S3 
// the try block opens the stream and guarantees to close it 
try (InputStream is=getStreamFromS3(uuid)) { 
    return Response.status(Response.Status.OK).entity(from(is)).build(); 
} 
} 

Этот требует Java 7 и далее. Это также потрясающе!

Если вы находитесь на Java 6, вам придется сделать свой собственный блок finally, чтобы не забудьте закрыть поток для вас.

Смежные вопросы