public void releaseLock() { try { KeyValueClient kv = consul.keyValueClient(); Optional<Value> value = kv.getValue(path); if (value.isPresent()) { Optional<String> session = value.get().getSession(); if (session.isPresent()) { kv.releaseLock(path, session.get()); } } } finally { destroySession(); } } }
@Override protected void doStop() throws Exception { if (sessionId.get() != null) { if (keyValueClient.releaseLock(this.path, sessionId.get())) { LOGGER.debug("Successfully released lock on path '{}' with id '{}'", path, sessionId.get()); } synchronized (sessionId) { sessionClient.destroySession(sessionId.getAndSet(null)); localMember.setMaster(false); } } }
@Override public void onFailure(Throwable throwable) { LOGGER.debug("", throwable); if (sessionId.get() != null) { keyValueClient.releaseLock(configuration.getRootPath(), sessionId.get()); } localMember.setMaster(false); watch(); }
public boolean releaseLockForService(final String serviceName) { final String key = getServiceKey(serviceName); KeyValueClient kv = client.keyValueClient(); Optional<Value> value = kv.getValue(key); if(value.isPresent() && value.get().getSession().isPresent()) { return kv.releaseLock(key, value.get().getSession().get()); } else { return true; } }
@InvokeOnHeader(ConsulKeyValueActions.UNLOCK) protected void unlock(Message message) throws Exception { message.setHeader(ConsulConstants.CONSUL_RESULT, getClient().releaseLock( getMandatoryHeader(message, ConsulConstants.CONSUL_KEY, getConfiguration().getKey(), String.class), getMandatoryHeader(message, ConsulConstants.CONSUL_SESSION, String.class) ) ); } }
public void remove(String key) { // create session to avoid conflicts (not sure if that is safe enough) SessionClient sessionClient = consul.sessionClient(); String sessionName = "session_" + UUID.randomUUID().toString(); SessionCreatedResponse response = sessionClient .createSession(ImmutableSession.builder().name(sessionName).build()); String sessionId = response.getId(); kvClient = consul.keyValueClient(); String lockKey = "lock_" + key; kvClient.acquireLock(lockKey, sessionName, sessionId); Object object = lookupByName(key); if (object == null) { String msg = "Bean with key '" + key + "' did not exist in Consul Registry."; throw new NoSuchBeanException(msg); } kvClient.deleteKey(key); kvClient.deleteKey(object.getClass().getName() + "/" + key); kvClient.releaseLock(lockKey, sessionId); }
public void put(String key, Object object) { // Substitute $ character in key key = key.replaceAll("\\$", "/"); // create session to avoid conflicts // (not sure if that is safe enough, again) SessionClient sessionClient = consul.sessionClient(); String sessionName = "session_" + UUID.randomUUID().toString(); SessionCreatedResponse response = sessionClient .createSession(ImmutableSession.builder().name(sessionName).build()); String sessionId = response.getId(); kvClient = consul.keyValueClient(); String lockKey = "lock_" + key; kvClient.acquireLock(lockKey, sessionName, sessionId); // Allow only unique keys, last one wins if (lookupByName(key) != null) { remove(key); } Object clone = ConsulRegistryUtils.clone((Serializable) object); byte[] serializedObject = ConsulRegistryUtils.serialize((Serializable) clone); // pre-encode due native encoding issues String value = ConsulRegistryUtils.encodeBase64(serializedObject); // store the actual class kvClient.putValue(key, value); // store just as a bookmark kvClient.putValue(object.getClass().getName().replaceAll("\\$", "/") + "/" + key, "1"); kvClient.releaseLock(lockKey, sessionId); }