Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-1868

Created a new Camel Cache component (based on ehCache) with an ability to put messages and receive notifications from a Cache.

    XMLWordPrintableJSON

    Details

    • Type: New Feature
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.1.0
    • Component/s: None
    • Labels:
      None
    • Environment:

      All UNIX and windows based environments...

    • Patch Info:
      Patch Available

      Description

      I have developed a Camel Caching component based on ehCache. I am submitting this new feature for your review and consideration for releasing this capability into the Camel mainstream.

      The Camel Caching component has the following abilities

      a> In Producer mode, the component provides the ability to direct payloads in exchanges to a stored in a pre-existing or created-on-demand Cache. The producer mode supports operations to ADD/UPDATE/DELETE/DELETEALL elements in a cache. (Examples goven below)

      b> In Consumer mode, the component provides the ability to listen on a pre-existing or created-on-demand Cache using an event Listener and receive automatic notifications when any cache activity take place (i.e ADD/UPDATE/DELETE/DELETEALL). Upon such an activity takng place, an exchange containing header elements describing the operation and cachekey and a body containing the just added/updated payload is placed and sent. In case of a DELETEALL operation the body of the exchanage is not populated.

      The cache itself may be created on demand or if a cache of that name already exists then it is simply utilized with its original settings. The URL itself may take the following form

      from ("cache://MyApplicationCache?maxElementsInMemory=1000&memoryStoreEvictionPolicy=MemoryStoreEvictionPolicy.LFU&overflowToDisk=true&eternal=true&timeToLiveSeconds=300&timeToIdleSeconds=true&diskPersistent=true&diskExpiryThreadIntervalSeconds=300")

      Note that all the attributes of the above URL are standard ehCache settings that may be set at Cache creation.

      Given below are examples of how to create/set routes:

      Producer Example 1: Adding keys to the cache with a body received from direct:start
      ----------------------------------------------------------------------------------------------------
      context.addRoutes(new RouteBuilder() {
      public void configure()

      { from("direct:start"). setHeader("CACHE_OPERATION", constant("ADD")). setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); }

      });
      context.start();

      Producer Example 2: Updating existing keys in a cache with a body received from direct:start
      ----------------------------------------------------------------------------------------------------

      context.addRoutes(new RouteBuilder() {
      public void configure()

      { from("direct:start"). setHeader("CACHE_OPERATION", constant("UPDATE")). setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); }

      });
      context.start();

      Producer Example 3: Deleting existing keys in a cache with a body received from direct:start
      ----------------------------------------------------------------------------------------------------

      context.addRoutes(new RouteBuilder() {
      public void configure()

      { from("direct:start"). setHeader("CACHE_OPERATION", constant("DELETE")). setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); }

      });
      context.start();

      Producer Example 4: Deleting all keys in a cache with a body received from direct:start
      ----------------------------------------------------------------------------------------------------

      context.addRoutes(new RouteBuilder() {
      public void configure()

      { from("direct:start"). setHeader("CACHE_OPERATION", constant("ADD")). setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); from("direct:start"). setHeader("CACHE_OPERATION", constant("ADD")). setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson2")). to("cache://TestCache1"); from("direct:start"). setHeader("CACHE_OPERATION", constant("DELETEALL")). to("cache://TestCache1"); }

      });
      context.start();

      Consumer Example 1: Notifying any changes registering in a Cache to Processors and other Producers
      ---------------------------------------------------------------------------------------------------------------------------------------------
      Note: in this example the consumer is created first and then 3 routes send different message as Cache Producers

      // Cache Notification Consumer
      context.addRoutes(new RouteBuilder() {
      public void configure() {
      from("cache://TestCache1").
      process(new Processor() {
      public void process(Exchange exchange) throws Exception

      { String operation = (String) exchange.getIn().getHeader("CACHE_OPERATION"); String key = (String) exchange.getIn().getHeader("CACHE_KEY"); Object body = exchange.getIn().getBody(); // Do something }

      });

      // Cache Producer1
      from("direct:start").
      setHeader("CACHE_OPERATION", constant("ADD")).
      setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
      to("cache://TestCache1");

      // Cache Producer2
      from("direct:start").
      setHeader("CACHE_OPERATION", constant("UPDATE")).
      setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
      to("cache://TestCache1");

      // Cache Producer3
      from("direct:start").
      setHeader("CACHE_OPERATION", constant("DELETE")).
      setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")).
      to("cache://TestCache1");
      }
      });
      context.start();

        Attachments

        1. camel-cache.patch
          94 kB
          Ashwin J. Karpe
        2. camel-cache.zip
          38 kB
          Ashwin J. Karpe
        3. camel-cache-with-processors.patch
          134 kB
          Ashwin J. Karpe
        4. camel-cache-with-processors.zip
          49 kB
          Ashwin J. Karpe

          Activity

            People

            • Assignee:
              njiang Willem Jiang
              Reporter:
              akarpe Ashwin J. Karpe
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: