Author: antelder
Date: Fri Apr 9 12:35:22 2010
New Revision: 932387
URL: http://svn.apache.org/viewvc?rev=932387&view=rev
Log:
Synchronize shutdown to avoid exceptions when things happen concurently
Modified:
tuscany/sca-java-2.x/trunk/modules/endpoint-hazelcast/src/main/java/org/apache/tuscany/sca/endpoint/hazelcast/HazelcastEndpointRegistry.java
Modified:
tuscany/sca-java-2.x/trunk/modules/endpoint-hazelcast/src/main/java/org/apache/tuscany/sca/endpoint/hazelcast/HazelcastEndpointRegistry.java
URL:
http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/endpoint-hazelcast/src/main/java/org/apache/tuscany/sca/endpoint/hazelcast/HazelcastEndpointRegistry.java?rev=932387&r1=932386&r2=932387&view=diff
==============================================================================
---
tuscany/sca-java-2.x/trunk/modules/endpoint-hazelcast/src/main/java/org/apache/tuscany/sca/endpoint/hazelcast/HazelcastEndpointRegistry.java
(original)
+++
tuscany/sca-java-2.x/trunk/modules/endpoint-hazelcast/src/main/java/org/apache/tuscany/sca/endpoint/hazelcast/HazelcastEndpointRegistry.java
Fri Apr 9 12:35:22 2010
@@ -69,6 +69,7 @@ public class HazelcastEndpointRegistry e
private Map<String, Endpoint> localEndpoints = new
ConcurrentHashMap<String, Endpoint>();
protected MultiMap<String, String> endpointOwners;
private AssemblyFactory assemblyFactory;
+ private Object shutdownMutex = new Object();
public HazelcastEndpointRegistry(ExtensionPointRegistry registry,
Map<String, String> attributes,
@@ -103,10 +104,12 @@ public class HazelcastEndpointRegistry e
public void stop() {
if (hazelcastInstance != null) {
- hazelcastInstance.shutdown();
- hazelcastInstance = null;
- endpointMap = null;
- endpointOwners = null;
+ synchronized (shutdownMutex) {
+ hazelcastInstance.shutdown();
+ hazelcastInstance = null;
+ endpointMap = null;
+ endpointOwners = null;
+ }
}
}
@@ -215,20 +218,25 @@ public class HazelcastEndpointRegistry e
}
public void removeEndpoint(Endpoint endpoint) {
- String localMemberAddr =
hazelcastInstance.getCluster().getLocalMember().getInetSocketAddress().toString();
- String endpointURI = endpoint.getURI();
- Transaction txn = hazelcastInstance.getTransaction();
- txn.begin();
- try {
- endpointMap.remove(endpointURI);
- endpointOwners.remove(localMemberAddr, endpointURI);
- txn.commit();
- } catch (Throwable e) {
- txn.rollback();
- throw new ServiceRuntimeException(e);
+ if (hazelcastInstance == null) {
+ return;
+ }
+ synchronized (shutdownMutex) {
+ String localMemberAddr =
hazelcastInstance.getCluster().getLocalMember().getInetSocketAddress().toString();
+ String endpointURI = endpoint.getURI();
+ Transaction txn = hazelcastInstance.getTransaction();
+ txn.begin();
+ try {
+ endpointMap.remove(endpointURI);
+ endpointOwners.remove(localMemberAddr, endpointURI);
+ txn.commit();
+ } catch (Throwable e) {
+ txn.rollback();
+ throw new ServiceRuntimeException(e);
+ }
+ localEndpoints.remove(endpointURI);
+ logger.info("Removed endpoint - " + endpoint);
}
- localEndpoints.remove(endpointURI);
- logger.info("Removed endpoint - " + endpoint);
}
@@ -280,17 +288,19 @@ public class HazelcastEndpointRegistry e
try {
String memberAddr =
event.getMember().getInetSocketAddress().toString();
if (endpointOwners.containsKey(memberAddr)) {
- ILock lock = hazelcastInstance.getLock("EndpointOwners/" +
memberAddr);
- lock.lock();
- try {
- if (endpointOwners.containsKey(memberAddr)) {
- Collection<String> keys =
endpointOwners.remove(memberAddr);
- for (Object k : keys) {
- endpointMap.remove(k);
+ synchronized (shutdownMutex) {
+ ILock lock = hazelcastInstance.getLock("EndpointOwners/" +
memberAddr);
+ lock.lock();
+ try {
+ if (endpointOwners.containsKey(memberAddr)) {
+ Collection<String> keys =
endpointOwners.remove(memberAddr);
+ for (Object k : keys) {
+ endpointMap.remove(k);
+ }
}
+ } finally {
+ lock.unlock();
}
- } finally {
- lock.unlock();
}
}
} catch (Exception e) {