В качестве последующей меры по отношению к 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&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";
}
}
Интересно. Пробовал, но получал одинаковые результаты: запись в поток: выход не запускается, пока весь полезный груз не будет выписан сервлетом. Установка disableStreamCache = true не помогла. Запись в файл даже не запускается долгое время, возможно, до тех пор, пока вся полезная нагрузка не будет кэширована Camel? –