Hi Claus,

I tried the approach suggested by you to write a custom Idempotent
Repository. I did that and it worked
Thanks a lot

Regards
Deepak Anand




On Fri, Jul 12, 2019 at 2:09 PM Deepak Anand <deepakanand2...@gmail.com>
wrote:

> Hi Devs,
>
> As mentioned above to create a custom IdempotentRepository and generate
> the file checksum I need the file that is being processed inside the
> repository.  Was going through the documentation and it seems I can
> implement ExchangeIdempotentRepository and override the below mentioned
> methods in it
>
> boolean add(Exchange exchange, E key)
> boolean confirm(Exchange exchange, E key)
> boolean contains(Exchange exchange, E key)
> boolean remove(Exchange exchange, E key)
>
> The issue which I have is how to pass the exchange to the above repository
> . It seems while using  idempotentKey  I can only pass the information
> regarding the file like name, size, modification timestamp.
> It would be of great help if anyone can suggest how to pass the Exchange
> exchange, E key both to the  IdempotentRepository using idempotentKey
>
> Thanks and Regards
> Deepak Anand
>
> On Fri, Jul 12, 2019 at 1:58 PM Deepak Anand <deepakanand2...@gmail.com>
> wrote:
>
>> Hi Devs,
>>
>> As mentioned above to create a custom IdempotentRepository and generate
>> the file checksum I need the file that is being processed inside the
>> repository.  Was going through the documentation and it seems I can
>> implement ExchangeIdempotentRepository and override the below mentioned
>> methods in it
>> boolean *add
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html#add(org.apache.camel.Exchange,%20E)>*
>> (Exchange
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html>
>>  exchange, E
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html>
>>  key)
>> Adds the key to the repository.
>> boolean *confirm
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html#confirm(org.apache.camel.Exchange,%20E)>*
>> (Exchange
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html>
>>  exchange, E
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html>
>>  key)
>> Confirms the key, after the exchange has been processed successfully.
>> boolean *contains
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html#contains(org.apache.camel.Exchange,%20E)>*
>> (Exchange
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html>
>>  exchange, E
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html>
>>  key)
>> Returns true if this repository contains the specified element.
>> boolean *remove
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html#remove(org.apache.camel.Exchange,%20E)>*
>> (Exchange
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html>
>>  exchange, E
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html>
>>  key)
>> Removes the key from the repository.
>> The issue which I have is how to pass the exchange to the above repository
>> . It seems while using  idempotentKey  I can only pass the information
>> regarding the file like name, size, modification timestamp.
>> It would be of great help if anyone can suggest how to pass the Exchange
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html>
>>  exchange, E
>> <https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/ExchangeIdempotentRepository.html>
>>  key
>> both to the  IdempotentRepository using idempotentKey
>>
>> Thanks and Regards
>> Deepak Anand
>>
>>
>> On Thu, Jul 11, 2019 at 5:17 PM Deepak Anand <deepakanand2...@gmail.com>
>> wrote:
>>
>>> Thanks Claus for your response , will try to implement the way you
>>> suggested
>>>
>>> Regards
>>> Deepak Anand
>>>
>>>
>>> On Wed, Jul 10, 2019 at 8:34 PM Claus Ibsen <claus.ib...@gmail.com>
>>> wrote:
>>>
>>>> Hi
>>>>
>>>> You can likely try to build a custom IdempotentRepository that extends
>>>> the Redis, and then in all the methods, you get the key from Camel
>>>> which is the absolute file name, which you then use to calculate your
>>>> hash and then call the super method with the hash key instead.
>>>>
>>>> eg something like this:
>>>>
>>>> public boolean contains(exchange, key)
>>>>    string hashKey = ....
>>>>    return super.contains(exchange, hashKey);
>>>>
>>>>
>>>> On Wed, Jul 10, 2019 at 9:00 PM Claus Ibsen <claus.ib...@gmail.com>
>>>> wrote:
>>>> >
>>>> > Hi
>>>> >
>>>> > Yeah its a limitation that idempontentKey can only use the information
>>>> > from the file itself such as its name, size, modification timestamp
>>>> > etc. Not a custom hashcode.
>>>> >
>>>> > On Tue, Jul 9, 2019 at 7:22 PM Deepak Anand <
>>>> deepakanand2...@gmail.com> wrote:
>>>> > >
>>>> > > Thanks Claus for you response.
>>>> > > The same files can be present in different sub directory , so I need
>>>> > > checksum to identify them.
>>>> > > How in the file endpoint I can generate the checksum and add it to
>>>> the
>>>> > > idempotentRepository .
>>>> > > May be a silly question but I am new to Camel earlier I was
>>>> generating the
>>>> > > checksum of the file in the processor and adding it to the header
>>>> and
>>>> > > passing it to the idempotent consumer
>>>> > >
>>>> > > Thanks and Regards
>>>> > > Deepak Anand
>>>> > >
>>>> > >
>>>> > > On Tue, Jul 9, 2019 at 6:08 PM Claus Ibsen <claus.ib...@gmail.com>
>>>> wrote:
>>>> > >
>>>> > > > Set idempotentRepository on the file endpoint instead and remove
>>>> > > > idempotent consumer in the route.
>>>> > > >
>>>> > > > On Tue, Jul 9, 2019 at 7:01 PM Deepak Anand <
>>>> deepakanand2...@gmail.com>
>>>> > > > wrote:
>>>> > > > >
>>>> > > > > Hi Devs ,
>>>> > > > >
>>>> > > > > I have a requirement to read from a directory where there are
>>>> no of files
>>>> > > > > in the subdirectories of it . I am using the camel File
>>>> component for it
>>>> > > > .
>>>> > > > > I don't want to process the same file which has been processed
>>>> earlier
>>>> > > > > using an idempotentConsumer and using RedisCache for it.
>>>> > > > > In the cache I am adding the checksum to identify the duplicate
>>>> file. The
>>>> > > > > problem is that after reading more than 1000 files the same
>>>> files(which
>>>> > > > > were read earlier) are being read again and again which I don't
>>>> want .
>>>> > > > > Below is the snippet of the camel route
>>>> > > > >
>>>> > > > > from("file://" + sourceLoc + "/?recursive=true&noop=true"
>>>> > > > >
>>>> > > >
>>>> +"&idempotent=true&idempotentKey=${file:name}-${file:modified}&readLockRemoveOnCommit=false")
>>>> > > > >                         .log("the read file is
>>>> > > > > ${file:name}-${file:modified} ")
>>>> > > > >                 .filter()
>>>> > > > >                 .method(SourceMinAgeFilter.class, "accept")
>>>> > > > >                 .process("checksumprocessor")
>>>> > > > >                 .idempotentConsumer(header("fileCheckSum"),
>>>> > > > >
>>>> > > > >
>>>> RedisIdempotentRepository.redisIdempotentRepository(stringredisTemplate,
>>>> > > > > redisStoragename))
>>>> > > > >                 .eager(true)
>>>> > > > >                 .skipDuplicate(false)
>>>> > > > >                 .choice()
>>>> > > > >
>>>> > > > >
>>>> .when(exchangeProperty(Exchange.DUPLICATE_MESSAGE).isEqualTo(true))
>>>> > > > >                 .log("file  ${file:onlyname} is a duplicate and
>>>> hence
>>>> > > > > skipped.")
>>>> > > > >                 .otherwise()
>>>> > > > >                 .process("fileprocessor")
>>>> > > > >                 .log("processed file name from Source Folder" +
>>>> > > > > ("${file:onlyname}"))
>>>> > > > >                 .log("Total time to process a file : from
>>>> Source Folder
>>>> > > > " +
>>>> > > > > (System.currentTimeMillis() - starttime) + " ms").end();
>>>> > > > >
>>>> > > > > Could you please let me know what needs to be done so that the
>>>> same file
>>>> > > > is
>>>> > > > > not read again and again. Since I am using RedisCache it is not
>>>> getting
>>>> > > > > processed as the checksum is same but I don't want to read the
>>>> file again
>>>> > > > > that has been processed
>>>> > > > >
>>>> > > > > Thanks and Regards
>>>> > > > > Deepak Anand
>>>> > > >
>>>> > > >
>>>> > > >
>>>> > > > --
>>>> > > > Claus Ibsen
>>>> > > > -----------------
>>>> > > > http://davsclaus.com @davsclaus
>>>> > > > Camel in Action 2: https://www.manning.com/ibsen2
>>>> > > >
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> > Claus Ibsen
>>>> > -----------------
>>>> > http://davsclaus.com @davsclaus
>>>> > Camel in Action 2: https://www.manning.com/ibsen2
>>>>
>>>>
>>>>
>>>> --
>>>> Claus Ibsen
>>>> -----------------
>>>> http://davsclaus.com @davsclaus
>>>> Camel in Action 2: https://www.manning.com/ibsen2
>>>>
>>>

Reply via email to