Java tutorial
/* * Copyright 2011 the original author or authors. * * Licensed 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 com.gigaspaces.blueprint.frauddetection.feeder; import com.gigaspaces.blueprint.frauddetection.common.Data; import com.gigaspaces.blueprint.frauddetection.common.Payment; import org.openspaces.core.GigaSpace; import org.openspaces.core.GigaSpaceConfigurer; import org.openspaces.core.SpaceInterruptedException; import org.openspaces.core.context.GigaSpaceContext; import org.openspaces.core.space.UrlSpaceConfigurer; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Logger; /** * A feeder bean starts a scheduled task that writes a new Data objects to the space * (in an unprocessed state). * * <p>The space is injected into this bean using OpenSpaces support for @GigaSpaceContext * annotation. * * <p>The scheduling uses the java.util.concurrent Scheduled Executor Service. It * is started and stopped based on Spring life cycle events. * * @author kimchy */ public class Feeder implements InitializingBean, DisposableBean { Logger log = Logger.getLogger(this.getClass().getName()); private ScheduledExecutorService executorService; private ScheduledFuture<?> sf; private long numberOfTypes = 10; private long defaultDelay = 1000; private FeederTask feederTask; private Random rnd = new Random(); private AtomicLong paymentCounter = new AtomicLong(); @GigaSpaceContext private GigaSpace gigaSpace; /** * Sets the number of types that will be used to set {@link org.openspaces.example.data.common.Data#setType(Long)}. * * <p>The type is used as the routing index for partitioned space. This will affect the distribution of Data * objects over a partitioned space. */ public void setNumberOfTypes(long numberOfTypes) { this.numberOfTypes = numberOfTypes; } public void setDefaultDelay(long defaultDelay) { this.defaultDelay = defaultDelay; } public void afterPropertiesSet() throws Exception { log.info("--- STARTING FEEDER WITH CYCLE [" + defaultDelay + "]"); executorService = Executors.newScheduledThreadPool(1); feederTask = new FeederTask(); sf = executorService.scheduleAtFixedRate(feederTask, defaultDelay, defaultDelay, TimeUnit.MILLISECONDS); } public void destroy() throws Exception { sf.cancel(false); sf = null; executorService.shutdown(); } public long getFeedCount() { return feederTask.getCounter(); } public class FeederTask implements Runnable { private long counter = 1; public void run() { try { long time = System.currentTimeMillis(); //Data data = new Data((counter++ % numberOfTypes), "FEEDER " + Long.toString(time)); //creating users Long userId = rnd.nextLong(); Integer amount = rnd.nextInt(50000); String merchant = "Merchant" + rnd.nextInt(1000); //Integer Payment payment = new Payment(); payment.setId(paymentCounter.getAndIncrement()); payment.setTimestamp(time); payment.setUserId(userId); payment.setMerchant(merchant); payment.setPaymentStatus(Payment.PaymentStatus.New); payment.setCardId(rnd.nextLong()); GigaSpace gigaSpace = new GigaSpaceConfigurer(new UrlSpaceConfigurer("jini://*/*/user")) .gigaSpace(); gigaSpace.write(payment); log.info("--- FEEDER WROTE " + payment); } catch (SpaceInterruptedException e) { // ignore, we are being shutdown } catch (Exception e) { e.printStackTrace(); } } public long getCounter() { return counter; } } }