Giter Site home page Giter Site logo

Comments (2)

knocknarea avatar knocknarea commented on June 7, 2024 1

Anyone interested in a workaround for this while waiting, I put this together:

public class FastFailDeepstreamClient extends DeepstreamClient implements DeepstreamRuntimeErrorHandler {
	
	private static final Logger logger = LoggerFactory.getLogger(FastFailDeepstreamClient.class);

	private volatile Thread callingThread;
	
	/**
	 * @param url
	 * @throws URISyntaxException
	 */
	public FastFailDeepstreamClient(String url) throws URISyntaxException {
		super(url);
		this.setRuntimeErrorHandler(this);
	}

	/**
	 * @param url
	 * @param options
	 * @throws URISyntaxException
	 * @throws InvalidDeepstreamConfig
	 */
	public FastFailDeepstreamClient(String url, Map<ConfigOptions, Object> options) throws URISyntaxException, InvalidDeepstreamConfig {
		super(url, options);
		this.setRuntimeErrorHandler(this);
	}

	@Override
	public LoginResult login(JsonElement data) {
		
		//
		// Internal to the login method of DeepstreamClient is a countdown latch that does not get
		// set to ZERO if the deepstream host is unavailable. The login method performs an indefinite
		// await() on this latch leading to a thread hang.
		// We capture the calling thread on the way into the login method. We also have a runtime handler installed
		// if we receive a CONNECTION_ERROR and the calling thread is not null, then we interrupt it so the login method continues
		// to failure.
		//
		this.callingThread = Thread.currentThread();
		
		LoginResult result = null;
		
		try {
			result = super.login(data);
			logger.debug("Login to Deepstream was a {}", result != null ? (result.loggedIn() ? "SUCCESS" : "FAILURE") : "FAILURE" );
		}
		finally {
			try {
				Thread.interrupted();
			}
			catch(Exception e) {}
			finally {
				this.callingThread = null;	
			}
		}
		return result;
	}

	/* (non-Javadoc)
	 * @see io.deepstream.DeepstreamRuntimeErrorHandler#onException(io.deepstream.Topic, io.deepstream.Event, java.lang.String)
	 */
	@Override
	public void onException(Topic topic, Event event, String arg) {
		switch(event) {
		case CONNECTION_ERROR:
			logger.warn("Received Connection Error on Deepstream");
			//
			// This is to get around a bug in DS client 
			// https://github.com/deepstreamIO/deepstream.io-client-java/issues/120
			// 
			if(this.callingThread != null) {
				//
				// Interrupt the code that will lock if there is no connection to deepstream at all (connection refused)
				//
				this.callingThread.interrupt();
			}
			break;
		default:
			break;
		}
	}
}

from deepstream.io-client-java.

StephanSchuster avatar StephanSchuster commented on June 7, 2024

Same problem here! Any plans on fixing this (critical) issue?

from deepstream.io-client-java.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.