diff --git a/org.adempiere.base/src/org/compiere/util/CacheMgt.java b/org.adempiere.base/src/org/compiere/util/CacheMgt.java index a42a76470f..9d808e947a 100644 --- a/org.adempiere.base/src/org/compiere/util/CacheMgt.java +++ b/org.adempiere.base/src/org/compiere/util/CacheMgt.java @@ -142,19 +142,23 @@ public class CacheMgt if (service != null) { ResetCacheCallable callable = new ResetCacheCallable(tableName, recordId); Future> future = service.execute(callable, service.getMembers()); - int total = 0; - try { - Collection results = future.get(); - for(Integer i : results) - { - total += i.intValue(); + if (future != null) { + int total = 0; + try { + Collection results = future.get(); + for(Integer i : results) + { + total += i.intValue(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); } - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); + return total; + } else { + return resetLocalCache(tableName, recordId); } - return total; } else { return resetLocalCache(tableName, recordId); } @@ -172,7 +176,9 @@ public class CacheMgt IClusterService service = holder.getService(); if (service != null) { CacheNewRecordCallable callable = new CacheNewRecordCallable(tableName, recordId); - service.execute(callable, service.getMembers()); + if (service.execute(callable, service.getMembers()) == null) { + localNewRecord(tableName, recordId); + } } else { localNewRecord(tableName, recordId); } diff --git a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java index b84fc63eba..ad748f021e 100644 --- a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java +++ b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/Activator.java @@ -17,10 +17,11 @@ import java.io.File; import java.io.FileNotFoundException; import java.net.MalformedURLException; import java.net.URL; +import java.text.DateFormat; +import java.util.Date; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.atomic.AtomicReference; import org.compiere.Adempiere; import org.compiere.model.ServerStateChangeEvent; @@ -46,7 +47,7 @@ public class Activator implements BundleActivator { } private volatile static HazelcastInstance hazelcastInstance; - private static AtomicReference> futureRef = new AtomicReference>(); + private static Future future; /* * (non-Javadoc) @@ -68,10 +69,10 @@ public class Activator implements BundleActivator { } } - private void createHazelCastInstance() { + private static synchronized void createHazelCastInstance() { ScheduledThreadPoolExecutor executor = Adempiere.getThreadPoolExecutor(); - Future future = executor.submit(new Runnable() { + future = executor.submit(new Runnable() { @Override public void run() { String dataArea = System.getProperty("osgi.install.area"); @@ -92,11 +93,9 @@ public class Activator implements BundleActivator { hazelcastInstance = Hazelcast.newHazelcastInstance(null); } }); - futureRef.set(future); } - public static HazelcastInstance getHazelcastInstance() { - Future future = futureRef.get(); + public static synchronized HazelcastInstance getHazelcastInstance() { if (future != null && !future.isDone()) { try { future.get(); @@ -105,6 +104,26 @@ public class Activator implements BundleActivator { } } + if (hazelcastInstance != null) { + if (!hazelcastInstance.getLifecycleService().isRunning()) { + System.err.println(DateFormat.getDateTimeInstance().format(new Date()) + " Hazelcast instance is down!"); + //recreate + try { + hazelcastInstance = Hazelcast.newHazelcastInstance(null); + if (!hazelcastInstance.getLifecycleService().isRunning()) { + hazelcastInstance = null; + System.err.println(DateFormat.getDateTimeInstance().format(new Date()) + " Failed to re-create Hazelcast instance!"); + } else { + System.err.println(DateFormat.getDateTimeInstance().format(new Date()) + " Hazelcast instance re-created!"); + } + } catch (Throwable t) { + t.printStackTrace(); + hazelcastInstance = null; + System.err.println(DateFormat.getDateTimeInstance().format(new Date()) + " Failed to re-create Hazelcast instance!"); + } + } + } + return hazelcastInstance; } @@ -114,13 +133,13 @@ public class Activator implements BundleActivator { */ public void stop(BundleContext bundleContext) throws Exception { Activator.context = null; - Future future = futureRef.get(); - if (future != null && !future.isDone()) { - future.cancel(true); - } else if (hazelcastInstance != null) { - hazelcastInstance.getLifecycleService().shutdown(); - hazelcastInstance = null; + synchronized (Activator.class) { + if (future != null && !future.isDone()) { + future.cancel(true); + } else if (hazelcastInstance != null) { + hazelcastInstance.getLifecycleService().shutdown(); + hazelcastInstance = null; + } } - futureRef.set(null); } } diff --git a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/ClusterServiceImpl.java b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/ClusterServiceImpl.java index 5ae7bdc0cf..42988b5b28 100644 --- a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/ClusterServiceImpl.java +++ b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/ClusterServiceImpl.java @@ -23,6 +23,7 @@ import org.idempiere.distributed.IClusterMember; import org.idempiere.distributed.IClusterService; import com.hazelcast.core.DistributedTask; +import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.Member; import com.hazelcast.core.MultiTask; @@ -37,10 +38,13 @@ public class ClusterServiceImpl implements IClusterService { */ @Override public Collection getMembers() { - Set members = Activator.getHazelcastInstance().getCluster().getMembers(); + HazelcastInstance instance = Activator.getHazelcastInstance(); Set clusterMembers = new HashSet(); - for(Member member : members) { - clusterMembers.add(new ClusterMember(member.getUuid(), member.getInetSocketAddress().getAddress(), member.getInetSocketAddress().getPort())); + if (instance != null) { + Set members = instance.getCluster().getMembers(); + for(Member member : members) { + clusterMembers.add(new ClusterMember(member.getUuid(), member.getInetSocketAddress().getAddress(), member.getInetSocketAddress().getPort())); + } } return clusterMembers; } @@ -50,8 +54,13 @@ public class ClusterServiceImpl implements IClusterService { */ @Override public IClusterMember getLocalMember() { - Member member = Activator.getHazelcastInstance().getCluster().getLocalMember(); - return new ClusterMember(member.getUuid(), member.getInetSocketAddress().getAddress(), member.getInetSocketAddress().getPort()); + HazelcastInstance instance = Activator.getHazelcastInstance(); + if (instance != null) { + Member member = instance.getCluster().getLocalMember(); + return new ClusterMember(member.getUuid(), member.getInetSocketAddress().getAddress(), member.getInetSocketAddress().getPort()); + } else { + return null; + } } /* (non-Javadoc) @@ -59,12 +68,15 @@ public class ClusterServiceImpl implements IClusterService { */ @Override public Future execute(Callable task, IClusterMember clusterMember) { - Set members = Activator.getHazelcastInstance().getCluster().getMembers(); - for(Member member : members) { - if (member.getUuid().equals(clusterMember.getId())) { - DistributedTask distributedTask = new DistributedTask(task, member); - Activator.getHazelcastInstance().getExecutorService().execute(distributedTask); - return distributedTask; + HazelcastInstance instance = Activator.getHazelcastInstance(); + if (instance != null) { + Set members = instance.getCluster().getMembers(); + for(Member member : members) { + if (member.getUuid().equals(clusterMember.getId())) { + DistributedTask distributedTask = new DistributedTask(task, member); + Activator.getHazelcastInstance().getExecutorService().execute(distributedTask); + return distributedTask; + } } } return null; @@ -81,17 +93,20 @@ public class ClusterServiceImpl implements IClusterService { for(IClusterMember clusterMember : clusterMembers) { selectedIds.add(clusterMember.getId()); } - Set members = Activator.getHazelcastInstance().getCluster().getMembers(); - Set selectedMembers = new HashSet(); - for(Member member : members) { - if (selectedIds.contains(member.getUuid())) { - selectedMembers.add(member); + HazelcastInstance instance = Activator.getHazelcastInstance(); + if (instance != null) { + Set members = instance.getCluster().getMembers(); + Set selectedMembers = new HashSet(); + for(Member member : members) { + if (selectedIds.contains(member.getUuid())) { + selectedMembers.add(member); + } + } + if (selectedMembers.size() > 0) { + MultiTask multiTask = new MultiTask(task, selectedMembers); + Activator.getHazelcastInstance().getExecutorService().execute(multiTask); + return multiTask; } - } - if (selectedMembers.size() > 0) { - MultiTask multiTask = new MultiTask(task, selectedMembers); - Activator.getHazelcastInstance().getExecutorService().execute(multiTask); - return multiTask; } return null; } diff --git a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/MessageServiceImpl.java b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/MessageServiceImpl.java index a42fdffbb0..19888efcff 100644 --- a/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/MessageServiceImpl.java +++ b/org.idempiere.hazelcast.service/src/org/idempiere/hazelcast/service/MessageServiceImpl.java @@ -16,6 +16,8 @@ package org.idempiere.hazelcast.service; import org.idempiere.distributed.IMessageService; import org.idempiere.distributed.ITopic; +import com.hazelcast.core.HazelcastInstance; + /** * @author hengsin * @@ -30,7 +32,12 @@ public class MessageServiceImpl implements IMessageService { @Override public ITopic getTopic(String name) { - com.hazelcast.core.ITopic topic = Activator.getHazelcastInstance().getTopic(name); - return new TopicImpl(topic); + HazelcastInstance instance = Activator.getHazelcastInstance(); + if (instance != null) { + com.hazelcast.core.ITopic topic = instance.getTopic(name); + return new TopicImpl(topic); + } else { + return null; + } } }