| /* |
| * 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.openjpa.persistence.datacache; |
| |
| import java.util.Calendar; |
| import java.util.Date; |
| |
| import org.apache.openjpa.conf.OpenJPAConfiguration; |
| import org.apache.openjpa.datacache.ClearableScheduler; |
| import org.apache.openjpa.datacache.ConcurrentDataCache; |
| import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI; |
| import org.apache.openjpa.persistence.test.SingleEMFTestCase; |
| |
| public class TestClearableScheduler extends SingleEMFTestCase { |
| |
| private static String getMinutesString() { |
| StringBuffer buf = new StringBuffer(); |
| for (int i = 0; i < 60; i++) { |
| if (i % 2 == 0) |
| buf.append(i).append(','); |
| } |
| return buf.toString(); |
| } |
| |
| @Override |
| public void setUp() { |
| setUp( |
| "openjpa.DataCache", "true(EvictionSchedule=+1)" |
| , "openjpa.QueryCache", "true" |
| ,"openjpa.RemoteCommitProvider", "sjvm" |
| ,CachedPerson.class, CLEAR_TABLES |
| ); |
| } |
| |
| public void testBasic() throws Exception { |
| OpenJPAEntityManagerSPI em = emf.createEntityManager(); |
| OpenJPAConfiguration conf = ((OpenJPAEntityManagerSPI) em).getConfiguration(); |
| ClearableScheduler scheduler = new ClearableScheduler(conf); |
| // Make the scheduler run every 1 minute |
| scheduler.setInterval(1); |
| DummyCache cache1 = new DummyCache(); |
| DummyCache cache2 = new DummyCache(); |
| |
| Calendar cal = Calendar.getInstance(); |
| cal.setTime(new Date()); |
| int currMin = cal.get(Calendar.MINUTE); |
| int plusOne = currMin+1; |
| int plusTwo = plusOne+1; |
| if(plusOne>=60){ |
| plusOne-=60; |
| } |
| if(plusTwo>=60){ |
| plusTwo-=60; |
| } |
| // Schedule eviction to happen the next two minutes |
| scheduler.scheduleEviction(cache2, plusOne+","+plusTwo+" * * * *"); |
| |
| // Schedule eviction to happen every mintue on cache 1 |
| scheduler.scheduleEviction(cache1, ("+1")); |
| |
| Thread.currentThread(); |
| Thread.sleep(61000); |
| assertEquals(1,cache1.getClearCount()); |
| assertEquals(1,cache2.getClearCount()); |
| |
| Thread.currentThread(); |
| Thread.sleep(60000); |
| assertEquals(2,cache1.getClearCount()); |
| assertEquals(2,cache2.getClearCount()); |
| |
| Thread.currentThread(); |
| Thread.sleep(60000); |
| assertEquals(3,cache1.getClearCount()); |
| assertEquals(2,cache2.getClearCount()); |
| } |
| |
| // Comment this test out while investigating OPENJPA-1692 |
| // public void testMultithreadedInitialization() throws Exception { |
| // final OpenJPAConfiguration conf = emf.getConfiguration(); |
| // final List<DataCacheManager> dcms = new Vector<DataCacheManager>(); |
| // Runnable r = new Runnable(){ |
| // public void run() { |
| // dcms.add(conf.getDataCacheManagerInstance()); |
| // } |
| // }; |
| // List<Thread> workers = new ArrayList<Thread>(); |
| // for(int i = 0;i<20;i++){ |
| // workers.add(new Thread(r)); |
| // } |
| // for(Thread t : workers){ |
| // t.start(); |
| // } |
| // for(Thread t : workers){ |
| // t.join(); |
| // } |
| // DataCacheManager prev = dcms.get(0); |
| // for(DataCacheManager dcm : dcms){ |
| // assertTrue(prev == dcm); |
| // prev = dcm; |
| // } |
| // |
| // } |
| |
| /** |
| * Pass in 4 out of 5 tokens. |
| */ |
| // private void doTest(String valid, String invalid) throws Exception { |
| // |
| // OpenJPAEntityManagerFactory emf = (OpenJPAEntityManagerFactory) getEmf(); |
| // OpenJPAConfiguration conf = ((OpenJPAEntityManagerFactorySPI) |
| // OpenJPAPersistence.cast(emf)).getConfiguration(); |
| // |
| // DataCacheScheduler scheduler = new DataCacheScheduler(conf); |
| // scheduler.setInterval(1); |
| // |
| // Calendar cal = Calendar.getInstance(); |
| // cal.setTime(new Date()); |
| // String sched = ((cal.get(Calendar.MINUTE) + 1) % 60) + " "; |
| // DummyCache validCache = new DummyCache(); |
| // scheduler.scheduleEviction(validCache, sched + valid); |
| // DummyCache invalidCache = new DummyCache(); |
| // scheduler.scheduleEviction(invalidCache, sched + invalid); |
| // Thread thread = new Thread(scheduler); |
| // thread.setDaemon(true); |
| // thread.start(); |
| // // test that it did not run yet... |
| // Thread.currentThread().sleep(70 * 1000); // 70 seconds |
| // scheduler.stop(); |
| // // assertEquals(2, validCache.clearCount); |
| // assertTrue("Wrong invocation count: " + validCache.clearCount, validCache.clearCount == 1 |
| // || validCache.clearCount == 2); |
| // assertEquals(0, invalidCache.clearCount); |
| // } |
| private class DummyCache extends ConcurrentDataCache { |
| |
| |
| private static final long serialVersionUID = 1L; |
| int clearCount = 0; |
| |
| public synchronized int getClearCount(){ |
| return clearCount; |
| } |
| @Override |
| public synchronized void clear() { |
| clearCount++; |
| } |
| } |
| } |