2015-11-14 3 views
1

В качестве последующей меры по отношению к Using Camel to stream output from a POST to a URL Мне нужно передать файл из HTTP-запроса POST с использованием CAMEL, не дожидаясь завершения загрузки. Я попробовал uri: stream uri: файл и uri: компоненты bean и все не удалось передать в файл побайтно, а вместо этого ждали завершения всей полезной нагрузки. Я считаю, что я должен делать неправильную конфигурацию, потому что, пока файл загружается в конце концов, это не делается (как судить по выходному сигналу сервлета) до конца вывода. Это проблема, потому что полезная нагрузка огромна. Я считаю, что я должен видеть вывод в файле, как только флеш сделан из сервлета, но это не то, что происходит.Потоковая передача в файл по запросу HTTP POST в CAMEL

Вот маршрут:

<route> 
    <from uri="file:inputsDir?fileName=input.json&amp;noop=true" /> 
    <log loggingLevel="INFO" message="${body}"/> 
    <to uri="http://localhost:8080/ServingSource/FileServlet" /> 
    <to uri="bean:dloadBean?method=downloadFile" /> 
    <to uri="stream:out" /> 
</route> 

Вот сервлет называется:

import java.io.IOException; 
import java.io.StringWriter; 
import java.nio.charset.StandardCharsets; 
import java.util.Random; 

import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

import org.apache.commons.lang3.RandomStringUtils; 

import com.fasterxml.jackson.databind.ObjectMapper; 

/** 
* Servlet implementation class FileServlet 
*/ 
@WebServlet("/FileServlet") 
public class FileServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public FileServlet() { 
     super(); 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
    *  response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
    *  response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     ServletOutputStream out = response.getOutputStream(); 
     ObjectMapper mapper = new ObjectMapper(); 
     Staff input = mapper.readValue(request.getInputStream(), Staff.class); 
     String prolog = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"; 
     out.write(prolog.getBytes()); 
     String wrapperStart = "<wrapper>"; 
     out.write(wrapperStart.getBytes()); 
     JAXBContext jaxbContext = null; 
     Marshaller jaxbMarshaller = null; 
     try { 
      jaxbContext = JAXBContext.newInstance(User.class); 
      jaxbMarshaller = jaxbContext.createMarshaller(); 
     } catch (JAXBException e1) { 
      e1.printStackTrace(); 
     } 

     try { 
      Random random = new Random(); 
      for (int i = 0; i < 10000000; i++) { 
       int id = random.nextInt(300000000); 
       User user = new User(id, input.getName() + "." + input.getSalary() + RandomStringUtils.randomAlphanumeric(10)); 
       jaxbMarshaller.setProperty("jaxb.fragment", Boolean.TRUE); 
       StringWriter writer = new StringWriter(); 
       jaxbMarshaller.marshal(user, writer); 
       String marshalled = writer.toString() + "\n"; 
       out.write(marshalled.getBytes(StandardCharsets.UTF_8)); 
       System.out.print("," + i); 
       if (i % 60 == 0) { 
        System.out.println(""); 
       } 
        out.flush(); 
      } 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 

     String wrapperEnd = "</wrapper>"; 
     out.write(wrapperEnd.getBytes()); 
     out.close(); 
    } 

} 

Вот загрузчик боб:

package download; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

public class DownloaderBean { 
    private static final int BUFFER_SIZE = 4096; 

    public String downloadFile(InputStream inputStream) throws IOException { 
     String fileName = "findAll.xml"; 

     String saveDir = "saveDir"; 
     String saveFilePath = saveDir + File.separator + fileName; 

     FileOutputStream outputStream = new FileOutputStream(saveFilePath); 

     int bytesRead = -1; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outputStream.write(buffer, 0, bytesRead); 
     } 

     outputStream.close(); 
     inputStream.close(); 

     return "File downloaded"; 
    } 

} 

ответ

0

Почему бы вам не использовать camel- netty, чтобы загрузить файл? Он работает исключительно с потоками. http://camel.apache.org/netty-http.html

+0

Интересно. Пробовал, но получал одинаковые результаты: запись в поток: выход не запускается, пока весь полезный груз не будет выписан сервлетом. Установка disableStreamCache = true не помогла. Запись в файл даже не запускается долгое время, возможно, до тех пор, пока вся полезная нагрузка не будет кэширована Camel? –

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