| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.ignite.scalar.examples |
| |
| import org.apache.ignite.events.Event |
| import org.apache.ignite.events.EventType._ |
| import org.apache.ignite.lang.IgnitePredicate |
| import org.apache.ignite.scalar.scalar |
| import org.apache.ignite.scalar.scalar._ |
| |
| import scala.collection.JavaConversions._ |
| |
| /** |
| * Demonstrates basic In-Memory Data Ignite Cluster operations with Scalar. |
| * <p/> |
| * Remote nodes should always be started with special configuration file which |
| * enables P2P class loading: `'ignite.{sh|bat} examples/config/example-ignite.xml'`. |
| * <p/> |
| * Alternatively you can run `ExampleNodeStartup` in another JVM which will |
| * start node with `examples/config/example-ignite.xml` configuration. |
| */ |
| object ScalarCacheExample extends App { |
| /** Configuration file name. */ |
| private val CONFIG = "examples/config/example-ignite.xml" |
| |
| /** Name of cache specified in spring configuration. */ |
| private val NAME = ScalarCacheExample.getClass.getSimpleName |
| |
| scalar(CONFIG) { |
| val cache = createCache$[String, Int](NAME) |
| |
| try { |
| registerListener() |
| |
| basicOperations() |
| } |
| catch { |
| case e: Throwable => |
| e.printStackTrace(); |
| } |
| finally { |
| cache.destroy() |
| } |
| } |
| |
| /** |
| * Demos basic cache operations. |
| */ |
| def basicOperations() { |
| val c = cache$[String, Int](NAME).get |
| |
| // Add few values. |
| c += (1.toString -> 1) |
| c += (2.toString -> 2) |
| |
| // Update values. |
| c += (1.toString -> 11) |
| c += (2.toString -> 22) |
| |
| c += (1.toString -> 31) |
| c += (2.toString -> 32) |
| c += ((2.toString, 32)) |
| |
| // Remove couple of keys (if any). |
| c -= (11.toString, 22.toString) |
| |
| // Put one more value. |
| c += (3.toString -> 11) |
| |
| try { |
| c.opt(44.toString) match { |
| case Some(v) => sys.error("Should never happen.") |
| case _ => println("Correct") |
| } |
| } |
| catch { |
| case e: Throwable => |
| e.printStackTrace() |
| } |
| |
| |
| // Print all values. |
| println("Print all values.") |
| c.iterator() foreach println |
| } |
| |
| /** |
| * This method will register listener for cache events on all nodes, |
| * so we can actually see what happens underneath locally and remotely. |
| */ |
| def registerListener() { |
| val g = ignite$ |
| |
| g *< (() => { |
| val lsnr = new IgnitePredicate[Event] { |
| override def apply(e: Event): Boolean = { |
| println(e.shortDisplay) |
| |
| true |
| } |
| } |
| |
| if (g.cluster().nodeLocalMap[String, AnyRef].putIfAbsent("lsnr", lsnr) == null) { |
| g.events().localListen(lsnr, |
| EVT_CACHE_OBJECT_PUT, |
| EVT_CACHE_OBJECT_READ, |
| EVT_CACHE_OBJECT_REMOVED) |
| |
| println("Listener is registered.") |
| } |
| }, null) |
| } |
| } |