| /* |
| * 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.examples.datastructures; |
| |
| import java.util.UUID; |
| import org.apache.ignite.Ignite; |
| import org.apache.ignite.IgniteException; |
| import org.apache.ignite.IgniteSet; |
| import org.apache.ignite.Ignition; |
| import org.apache.ignite.configuration.CollectionConfiguration; |
| import org.apache.ignite.examples.ExampleNodeStartup; |
| import org.apache.ignite.lang.IgniteRunnable; |
| |
| import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; |
| import static org.apache.ignite.cache.CacheMode.PARTITIONED; |
| |
| /** |
| * Ignite cache distributed set example. |
| * <p> |
| * Remote nodes should always be started with special configuration file which |
| * enables P2P class loading: {@code 'ignite.{sh|bat} examples/config/example-ignite.xml'}. |
| * <p> |
| * Alternatively you can run {@link ExampleNodeStartup} in another JVM which will |
| * start node with {@code examples/config/example-ignite.xml} configuration. |
| */ |
| public class IgniteSetExample { |
| /** Set instance. */ |
| private static IgniteSet<String> set; |
| |
| /** |
| * Executes example. |
| * |
| * @param args Command line arguments, none required. |
| * @throws Exception If example execution failed. |
| */ |
| public static void main(String[] args) throws Exception { |
| try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) { |
| System.out.println(); |
| System.out.println(">>> Ignite set example started."); |
| |
| // Make set name. |
| String setName = UUID.randomUUID().toString(); |
| |
| set = initializeSet(ignite, setName); |
| |
| writeToSet(ignite); |
| |
| clearAndRemoveSet(); |
| } |
| |
| System.out.println("Ignite set example finished."); |
| } |
| |
| /** |
| * Initialize set. |
| * |
| * @param ignite Ignite. |
| * @param setName Name of set. |
| * @return Set. |
| * @throws IgniteException If execution failed. |
| */ |
| private static IgniteSet<String> initializeSet(Ignite ignite, String setName) throws IgniteException { |
| CollectionConfiguration setCfg = new CollectionConfiguration(); |
| |
| setCfg.setAtomicityMode(TRANSACTIONAL); |
| setCfg.setCacheMode(PARTITIONED); |
| |
| // Initialize new set. |
| IgniteSet<String> set = ignite.set(setName, setCfg); |
| |
| // Initialize set items. |
| for (int i = 0; i < 10; i++) |
| set.add(Integer.toString(i)); |
| |
| System.out.println("Set size after initializing: " + set.size()); |
| |
| return set; |
| } |
| |
| /** |
| * Write items into set. |
| * |
| * @param ignite Ignite. |
| * @throws IgniteException If failed. |
| */ |
| private static void writeToSet(Ignite ignite) throws IgniteException { |
| final String setName = set.name(); |
| |
| // Write set items on each node. |
| ignite.compute().broadcast(new SetClosure(setName)); |
| |
| System.out.println("Set size after writing [expected=" + (10 + ignite.cluster().nodes().size() * 5) + |
| ", actual=" + set.size() + ']'); |
| |
| System.out.println("Iterate over set."); |
| |
| // Iterate over set. |
| for (String item : set) |
| System.out.println("Set item: " + item); |
| |
| // Set API usage examples. |
| if (!set.contains("0")) |
| throw new RuntimeException("Set should contain '0' among its elements."); |
| |
| if (set.add("0")) |
| throw new RuntimeException("Set should not allow duplicates."); |
| |
| if (!set.remove("0")) |
| throw new RuntimeException("Set should correctly remove elements."); |
| |
| if (set.contains("0")) |
| throw new RuntimeException("Set should not contain '0' among its elements."); |
| |
| if (!set.add("0")) |
| throw new RuntimeException("Set should correctly add new elements."); |
| } |
| |
| /** |
| * Clear and remove set. |
| * |
| * @throws IgniteException If execution failed. |
| */ |
| private static void clearAndRemoveSet() throws IgniteException { |
| System.out.println("Set size before clearing: " + set.size()); |
| |
| // Clear set. |
| set.clear(); |
| |
| System.out.println("Set size after clearing: " + set.size()); |
| |
| // Remove set. |
| set.close(); |
| |
| System.out.println("Set was removed: " + set.removed()); |
| |
| // Try to work with removed set. |
| try { |
| set.contains("1"); |
| } |
| catch (IllegalStateException expected) { |
| System.out.println("Expected exception - " + expected.getMessage()); |
| } |
| } |
| |
| /** |
| * Closure to populate the set. |
| */ |
| private static class SetClosure implements IgniteRunnable { |
| /** Set name. */ |
| private final String setName; |
| |
| /** |
| * @param setName Set name. |
| */ |
| SetClosure(String setName) { |
| this.setName = setName; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override public void run() { |
| IgniteSet<String> set = Ignition.ignite().set(setName, null); |
| |
| UUID locId = Ignition.ignite().cluster().localNode().id(); |
| |
| for (int i = 0; i < 5; i++) { |
| String item = locId + "_" + Integer.toString(i); |
| |
| set.add(item); |
| |
| System.out.println("Set item has been added: " + item); |
| } |
| } |
| } |
| } |