2016-11-17 2 views
1

inputstream을 응답으로 반환하는 Java REST 서비스를 만들어야합니다. 내 문제는 클라이언트가 전체 스트림을받은 후 스트림을 닫는 방법을 모른다는 것입니다. 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 서블릿의 인터페이스를 사용하여 클라이언트로 전송됩니다. 그것은 용기의 Responsibility는, 당신은 당신이 닫 스트림이있는 경우

도 참조 Is is necessary to close the input stream returned from HttpServletRequest?

+0

이것은 완벽하게 작동했습니다. 감사합니다 –

+0

도와 드리겠습니다. 제발,이 답변이 맞다면 (또는 다른 어떤 것도) 나중에 사용하기 위해 받아 들일 수 있다는 것을 잊지 마십시오. – pedrofb

0

당신은 더 많은 정보를 원하시면 CXF Apache Custom Transport를 참조 에 '도관'를 사용하고자 할 수 있습니다. 하지만 조심 , 문서 상태 : 물리적 프로토콜을 지원하는 경우 강력하게, 도관 및 대상 구현에서 스트리밍을 중단하지 않는 것이 좋습니다

. 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 이상이 필요합니다. 그것은 또한 굉장합니다!

자바 6을 사용 중이면 스트림을 닫는 것을 기억하기 위해 자신 만의 블록을 만들어야합니다.