2
respostas

Cenário diferente

Boa noite. Com o camel, estou tentando disponibilizar um endpoint Rest. O problema é que eu setei esse endpoint no from() depois eu preciso pegar uns arquivos .json num bucket s3 ( me parece que tenho que usar o to() )

e finalmente realizar as transformações para devolver um json.

A pergunta é: Há um jeito correto de fazer isso? Afinal eu tenho uma requisição e uma fonte de dados. Há duas entradas, mas não há dois from()

2 respostas

o meu código está assim (kotlin)

override fun process(exchange: Exchange?) {

        val start_date = exchange!!.getIn().getHeader("start_date") as String
        val end_date = exchange.getIn().getHeader("end_date") as String

        val formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
        val start = LocalDate.parse(start_date).format(formatter)
        val end = LocalDate.parse(end_date).format(formatter)

        val objectsNames = exchange!!.getIn().body as LinkedList<String>
        for (objectName in objectsNames) {
            if(objectName.contains(start) && objectName.contains(end) && objectName.contains(".json")) {
                exchange.getIn() to "aws-s3://publish-schedule-events?amazonS3Client=#s3Client&operation=getObject&fileName=$objectName"
            }
        }
    }

Mas eu queria acumular os objetos (arquivos.json) que passam no if para conseguir enviar à próxima rota.

Mas o retorno do to() não é um S3Object, e não estou sabendo como fazer um casting ou outra coisa que me ajude.

Alguém tem uma dica?

Olá Marcos, tudo bem?

Para acumular os objetos (arquivos .json) que atendem às condições do seu if e enviá-los para a próxima rota no Apache Camel, você pode usar a função aggregate para agrupar esses objetos em uma lista.

Por exemplo:

from("rest:GET:/seu-endpoint")
    .process(object : Processor {
        override fun process(exchange: Exchange?) {
            val start_date = exchange!!.getIn().getHeader("start_date") as String
            val end_date = exchange.getIn().getHeader("end_date") as String

            val formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
            val start = LocalDate.parse(start_date).format(formatter)
            val end = LocalDate.parse(end_date).format(formatter)

            val objectsNames = exchange!!.getIn().body as LinkedList<String>
            val filteredObjects = ArrayList<String>()

            for (objectName in objectsNames) {
                if (objectName.contains(start) && objectName.contains(end) && objectName.contains(".json")) {
                    filteredObjects.add(objectName)
                }
            }

            exchange.setProperty("filteredObjects", filteredObjects)
        }
    })
    .split().property("filteredObjects")
    .to("aws-s3://publish-schedule-events?amazonS3Client=#s3Client&operation=getObject")
    .aggregate(constant(true)).completionSize(1000) // Ajuste o tamanho de acordo com suas necessidades
    .completionTimeout(5000) // Ajuste o tempo limite de acordo com suas necessidades
    .marshal().json(JsonLibrary.Jackson)
    .to("rest:POST:/outra-rota")

A função aggregate acumula os objetos novamente em uma lista com um tamanho de conclusão especificado (neste exemplo, completionSize(1000) significa que a lista será completada quando atingir 1000 objetos, mas você pode ajustar esse valor conforme necessário).