Caros amigos,
Tenho uma rota realiza um SELECT em um banco de dados e cria um arquivo JSON em uma pasta (arquivo este que em média gera algo em torno de 100k a 150k de registros).
Em seguida é disparada outra rota que envia os dados deste arquivo para um endpoint utilizando o component HTTP4 e realizando um POST (o endpoint já esta preparado para realizar batch processing).
Notei algo curioso, que em determinados casos o Camel envia os dados, o Web Services esta processando corretamente, mas após alguns segundos o Camel me retorna uma DeadLetterChannel, com algumas exceptions:
"org.apache.http.wire" "http-outgoing-5" "end of stream"
"org.apache.http.nohttpresponseexception" "failed to respond"
"h.i.c.DefaultManagedHttpClientConnection" "http-outgoing-5" "Close connection"
- "h.i.c.DefaultManagedHttpClientConnection" "http-outgoing-5" "Shutdown connection"
- "o.a.http.impl.execchain.MainClientExec" "Connection discarded" "Connection released"
Porém o processo continua normalmente, ele tenta reenviar novamente, mas da o erro de novo, mas no web services na AWS esta processando normalmente e verifiquei que ele retorna os status code normal.
Pesquisando na documentação do Camel e encontrei httpClient. Fiz a configuração aumentando o timeout, mas nada adiantou, parece que ele ignora essas configurações (httpClient.socketTimeout=300000).
Estou pensando na possibilidade de dividir o arquivo JSON, com alguma regra como a cada 1000 registros gerar 1 arquivo JSON. Assim vou ter vários arquivos menores que vão ser processados mais rápido e com isso obter a resposta do servidor, evitando esse erro.
Sinceramente não sei se é a melhor solução para este caso, gostaria da opinião de vocês.
Caso essa seja a melhor alternativa, utilizando o EIP patterns - Splitter, tem algum options do split() que realiza essa divisão a cada 1000 registros?
Minha rota atual que busca os registros no banco de dados e cria um arquivo json é a seguinte:
from("timer://query?fixedRate=true&delay=5s&period=10800s")
.routeId("route-produtos")
.setBody(constant(new ProdutoQuery().getProdutoSelect()))
.to("jdbc:myDataSource")
.marshal()
.json(JsonLibrary.Gson)
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.setHeader(Exchange.HTTP_CHARACTER_ENCODING, constant("UTF-8"))
.setHeader("CamelFileName", constant("produtos.json"))
.to("file:produtos");