Search in sources :

Example 1 with PermanentlyUnavailableException

use of com.oracle.bedrock.deferred.PermanentlyUnavailableException in project oracle-bedrock by coherence-community.

the class LocalJavaApplicationLauncher method launch.

@Override
public A launch(Platform platform, MetaClass<A> metaClass, OptionsByType optionsByType) {
    // establish the diagnostics output table
    Table diagnosticsTable = new Table();
    diagnosticsTable.getOptions().add(Table.orderByColumn(0));
    if (platform != null) {
        diagnosticsTable.addRow("Target Platform", platform.getName());
    }
    // ----- establish the launch Options for the Application -----
    // add the platform options
    OptionsByType launchOptions = OptionsByType.of(platform.getOptions().asArray());
    // add the meta-class options
    metaClass.onLaunching(platform, launchOptions);
    // add the launch specific options
    launchOptions.addAll(optionsByType);
    // ----- establish an identity for the application -----
    // add a unique runtime id for expression support
    launchOptions.add(Variable.with("bedrock.runtime.id", UUID.randomUUID()));
    // ----- establish default Profiles for this Platform (and Builder) -----
    // java applications can automatically detect the following profiles
    launchOptions.get(RemoteDebugging.class);
    launchOptions.get(CommercialFeatures.class);
    // auto-detect and add externally defined profiles
    launchOptions.addAll(Profiles.getProfiles());
    for (Profile profile : launchOptions.getInstancesOf(Profile.class)) {
        profile.onLaunching(platform, metaClass, launchOptions);
    }
    // ----- give the MetaClass a last chance to manipulate any options -----
    metaClass.onLaunch(platform, launchOptions);
    // ----- determine the display name for the application -----
    DisplayName displayName = getDisplayName(launchOptions);
    // ----- establish the underlying ProcessBuilder -----
    // determine the Executable, defaulting to "java" if not defined
    Executable executable = launchOptions.getOrSetDefault(Executable.class, Executable.named("java"));
    // we'll use the native operating system process builder to create
    // and manage the local application process
    LocalProcessBuilder processBuilder = createProcessBuilder(executable.getName());
    // ----- establish the working directory -----
    // set the working directory for the Process
    WorkingDirectory workingDirectory = launchOptions.getOrSetDefault(WorkingDirectory.class, WorkingDirectory.currentDirectory());
    File directory = workingDirectory.resolve(platform, launchOptions);
    // set the resolved working directory back into the options
    launchOptions.add(WorkingDirectory.at(directory));
    if (directory != null) {
        processBuilder.directory(directory);
        diagnosticsTable.addRow("Working Directory", directory.toString());
    }
    // ----- establish environment variables -----
    EnvironmentVariables environmentVariables = launchOptions.get(EnvironmentVariables.class);
    switch(environmentVariables.getSource()) {
        case Custom:
            processBuilder.environment().clear();
            diagnosticsTable.addRow("Environment Variables", "(cleared)");
            break;
        case ThisApplication:
            Map<String, String> map = System.getenv();
            processBuilder.environment().clear();
            processBuilder.environment().putAll(map);
            diagnosticsTable.addRow("Environment Variables", "(based on parent process)");
            break;
        case TargetPlatform:
            diagnosticsTable.addRow("Environment Variables", "(based on platform defaults)");
            break;
    }
    // add the optionally defined environment variables
    Properties variables = environmentVariables.realize(platform, launchOptions.asArray());
    for (String variableName : variables.stringPropertyNames()) {
        processBuilder.environment().put(variableName, variables.getProperty(variableName));
    }
    if (variables.size() > 0) {
        Table table = Tabularize.tabularize(variables);
        diagnosticsTable.addRow("", table.toString());
    }
    // ----- establish java specific environment variables -----
    // by default we use the java home defined by the schema.  if that's not
    // defined we'll attempt to use the java home defined by this builder.
    JavaHome javaHome = launchOptions.get(JavaHome.class);
    // (using the system property)
    if (javaHome == null) {
        javaHome = JavaHome.at(System.getProperty("java.home", null));
    }
    if (javaHome != null) {
        processBuilder.environment().put("JAVA_HOME", StringHelper.doubleQuoteIfNecessary(javaHome.get()));
    }
    // ----- establish the command to start java -----
    String javaExecutable;
    if (javaHome == null) {
        // when we don't have a java home we just use the defined executable
        javaExecutable = StringHelper.doubleQuoteIfNecessary(executable.getName());
    } else {
        // when we have a java home, we prefix the executable name with the java.home/bin/
        String javaHomePath = javaHome.get();
        javaHomePath = javaHomePath.trim();
        diagnosticsTable.addRow("Java Home", javaHomePath);
        if (!javaHomePath.endsWith(File.separator)) {
            javaHomePath = javaHomePath + File.separator;
        }
        javaExecutable = StringHelper.doubleQuoteIfNecessary(javaHomePath + "bin" + File.separator + executable.getName());
    }
    processBuilder.command(javaExecutable);
    diagnosticsTable.addRow("Java Executable", javaExecutable);
    // ----- establish the class path -----
    JavaModules modular = launchOptions.get(JavaModules.class);
    boolean useModules = modular.isEnabled();
    // determine the predefined class path based on the launch options
    ClassPath classPath = launchOptions.get(ClassPath.class);
    try {
        // include the ClassPath of the Platform
        classPath = new ClassPath(classPath, ClassPath.ofClass(platform.getClass()));
        // include the ClassPath of each of the Options
        for (Option option : launchOptions.getInstancesOf(Option.class)) {
            classPath = new ClassPath(classPath, ClassPath.ofClass(option.getClass()));
        }
        // include the application runner (if defined)
        BedrockRunner bedrockRunner = optionsByType.get(BedrockRunner.class);
        if (bedrockRunner != null && bedrockRunner.isEnabled()) {
            // include the JavaApplicationLauncher
            classPath = new ClassPath(classPath, ClassPath.ofClass(bedrockRunner.getClassOfRunner()));
        }
        // add the updated ClassPath back into the launch options
        launchOptions.add(classPath);
    } catch (IOException e) {
        throw new RuntimeException("Failed to locate required classes for the class path", e);
    }
    processBuilder.command().add(useModules ? "--module-path" : "-cp");
    processBuilder.command().add(classPath.toString(launchOptions.asArray()));
    if (useModules) {
        Table modulePathTable = classPath.getTable();
        modulePathTable.getOptions().add(Cell.Separator.of(""));
        diagnosticsTable.addRow("Module Path", modulePathTable.toString());
        ClassPath path = modular.getClassPath();
        if (path != null && !path.isEmpty()) {
            processBuilder.command().add("-cp");
            processBuilder.command().add(path.toString(launchOptions.asArray()));
            Table classPathTable = path.getTable();
            classPathTable.getOptions().add(Cell.Separator.of(""));
            diagnosticsTable.addRow("Class Path", classPathTable.toString());
        }
    } else {
        Table classPathTable = classPath.getTable();
        classPathTable.getOptions().add(Cell.Separator.of(""));
        diagnosticsTable.addRow("Class Path", classPathTable.toString());
    }
    String applicationName = displayName.resolve(launchOptions);
    // ----- establish Bedrock specific system properties -----
    // configure a server channel to communicate with the native process
    final SocketBasedRemoteChannelServer server = new SocketBasedRemoteChannelServer(applicationName);
    // register the defined RemoteEventListeners with the server so that when the application starts
    // the listeners can immediately start receiving RemoteEvents
    RemoteEvents remoteEvents = launchOptions.get(RemoteEvents.class);
    remoteEvents.forEach((remoteEventListener, listenerOptions) -> server.addListener(remoteEventListener, listenerOptions));
    try {
        // NOTE: this listens on the wildcard address on an ephemeral port
        server.open();
    } catch (IOException e) {
        throw new RuntimeException("Failed to create remote execution server for the application", e);
    }
    // add Bedrock specific System Properties
    // NOTE: the Bedrock parent address for locally created applications is always "loopback" as
    // i). they are always running locally,
    // ii). they only need to connect locally, and
    // iii). the "loopback" interface should work regardless of the network we're on.
    InetAddress parentAddress;
    IPv4Preferred iPv4Preferred = launchOptions.get(IPv4Preferred.class);
    if (iPv4Preferred.isPreferred()) {
        // we have to provide the schema with an IPv4 address!
        try {
            parentAddress = InetAddress.getByName("127.0.0.1");
        } catch (UnknownHostException e) {
            // TODO: log that we couldn't determine the loopback address!
            parentAddress = InetAddress.getLoopbackAddress();
        }
    } else {
        // when the schema doesn't care, we can default to what this platform chooses
        parentAddress = InetAddress.getLoopbackAddress();
    }
    Table systemPropertiesTable = new Table();
    systemPropertiesTable.getOptions().add(Table.orderByColumn(0));
    systemPropertiesTable.getOptions().add(Cell.Separator.of(""));
    // establish the URI for this (parent) process
    String parentURI = "//" + parentAddress.getHostAddress() + ":" + server.getPort();
    systemPropertiesTable.addRow(Settings.PARENT_URI, parentURI.toString());
    processBuilder.command().add("-D" + Settings.PARENT_URI + "=" + parentURI);
    // add Orphanable configuration
    Orphanable orphanable = launchOptions.get(Orphanable.class);
    processBuilder.command().add("-D" + Settings.ORPHANABLE + "=" + orphanable.isOrphanable());
    systemPropertiesTable.addRow(Settings.ORPHANABLE, Boolean.toString(orphanable.isOrphanable()));
    // ----- establish the system properties for the java application -----
    // define the system properties based on those defined by the launch options
    Properties systemProperties = launchOptions.get(SystemProperties.class).resolve(platform, launchOptions);
    for (String propertyName : systemProperties.stringPropertyNames()) {
        String propertyValue = systemProperties.getProperty(propertyName);
        // (we don't want to have "parents" applications effect child applications
        if (propertyName.startsWith("bedrock.profile.") || !propertyName.startsWith("bedrock")) {
            processBuilder.command().add("-D" + propertyName + (propertyValue.isEmpty() ? "" : "=" + propertyValue));
            systemPropertiesTable.addRow(propertyName, propertyValue);
        }
    }
    diagnosticsTable.addRow("System Properties", systemPropertiesTable.toString());
    // ----- establish Java Virtual Machine options -----
    StringBuilder jvmOptions = new StringBuilder();
    for (JvmOption jvmOption : launchOptions.getInstancesOf(JvmOption.class)) {
        for (String value : jvmOption.resolve(launchOptions)) {
            processBuilder.command().add(value);
            if (jvmOptions.length() > 0) {
                jvmOptions.append(" ");
            }
            jvmOptions.append(value);
        }
    }
    if (jvmOptions.length() > 0) {
        diagnosticsTable.addRow("Java Options", jvmOptions.toString());
    }
    for (String propertyName : System.getProperties().stringPropertyNames()) {
        if (propertyName.startsWith("bedrock.runtime.inherit.")) {
            // resolve the property value
            String propertyValue = System.getProperty(propertyName);
            // evaluate any expressions in the property value
            ExpressionEvaluator evaluator = new ExpressionEvaluator(launchOptions.get(Variables.class));
            propertyValue = evaluator.evaluate(propertyValue, String.class);
            processBuilder.command().add(propertyValue);
        }
    }
    // ----- establish the application command line to execute -----
    // use the launcher to launch the application
    // (we don't start the application directly itself)
    String applicationLauncherClassName = JavaApplicationRunner.class.getName();
    if (useModules) {
        applicationLauncherClassName = "com.oracle.bedrock.runtime/" + applicationLauncherClassName;
        processBuilder.command().add("-m");
    }
    processBuilder.command().add(applicationLauncherClassName);
    // set the Java application class name we need to launch
    ClassName className = launchOptions.get(ClassName.class);
    if (className == null) {
        throw new IllegalArgumentException("Java Application ClassName not specified");
    }
    String applicationClassName = className.getName();
    processBuilder.command().add(applicationClassName);
    diagnosticsTable.addRow("Application Launcher", applicationLauncherClassName);
    diagnosticsTable.addRow("Application Class", applicationClassName);
    diagnosticsTable.addRow("Application", applicationName);
    // ----- included the java arguments to the command -----
    List<String> argList = launchOptions.get(Arguments.class).resolve(platform, launchOptions);
    // Set the actual arguments used back into the options
    launchOptions.add(Arguments.of(argList));
    String arguments = "";
    for (String argument : argList) {
        processBuilder.command().add(argument);
        arguments += argument + " ";
    }
    if (arguments.length() > 0) {
        diagnosticsTable.addRow("Application Arguments", arguments);
    }
    // should the standard error be redirected to the standard out?
    ErrorStreamRedirection redirection = launchOptions.get(ErrorStreamRedirection.class);
    processBuilder.redirectErrorStream(redirection.isEnabled());
    diagnosticsTable.addRow("Standard Error Device", redirection.isEnabled() ? "stdout" : "stderr");
    diagnosticsTable.addRow("Application Launch Time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    // TODO: add all of the Profile options to the table
    // ----- start the local process -----
    boolean launchLogging = optionsByType.get(LaunchLogging.class).isEnabled();
    if (launchLogging && LOGGER.isLoggable(Level.INFO)) {
        LOGGER.log(Level.INFO, "Oracle Bedrock " + Bedrock.getVersion() + ": Starting Application...\n" + "------------------------------------------------------------------------\n" + diagnosticsTable.toString() + "\n" + "------------------------------------------------------------------------\n");
    }
    // create and start the native process
    Process process;
    try {
        process = processBuilder.start(launchOptions);
    } catch (IOException e) {
        throw new RuntimeException("Failed to build the underlying native process for the application", e);
    }
    // ----- create the local process and application -----
    // establish a LocalJavaProcess to represent the underlying Process
    LocalJavaApplicationProcess localJavaProcess = new LocalJavaApplicationProcess(process, server, systemProperties);
    // determine the application class that will represent the running application
    Class<? extends A> applicationClass = metaClass.getImplementationClass(platform, launchOptions);
    A application;
    try {
        // attempt to find a constructor(Platform, JavaApplicationProcess, Options)
        Constructor<? extends A> constructor = ReflectionHelper.getCompatibleConstructor(applicationClass, platform.getClass(), localJavaProcess.getClass(), launchOptions.getClass());
        // create the application
        application = constructor.newInstance(platform, localJavaProcess, launchOptions);
    } catch (Exception e) {
        throw new RuntimeException("Failed to instantiate the Application class specified by the MetaClass:" + metaClass, e);
    }
    if (JmxFeature.isSupportedBy(application)) {
        application.add(new JmxFeature());
    }
    // ----- wait for the application to start -----
    // ensure that the launcher process connects back to the server to
    // know that the application has started
    WaitToStart waitToStart = launchOptions.get(WaitToStart.class);
    if (waitToStart.isEnabled()) {
        Timeout timeout = launchOptions.get(Timeout.class);
        ensure(new AbstractDeferred<Boolean>() {

            @Override
            public Boolean get() throws TemporarilyUnavailableException, PermanentlyUnavailableException {
                if (!server.getRemoteChannels().iterator().hasNext()) {
                    throw new TemporarilyUnavailableException(this);
                } else {
                    return true;
                }
            }
        }, within(timeout));
    }
    // ----- notify the MetaClass that the application has been launched -----
    metaClass.onLaunched(platform, application, launchOptions);
    for (Profile profile : launchOptions.getInstancesOf(Profile.class)) {
        profile.onLaunched(platform, application, launchOptions);
    }
    // notify the ApplicationListener-based Options that the application has been launched
    for (ApplicationListener listener : launchOptions.getInstancesOf(ApplicationListener.class)) {
        listener.onLaunched(application);
    }
    return application;
}
Also used : JmxFeature(com.oracle.bedrock.runtime.java.features.JmxFeature) LocalApplicationProcess(com.oracle.bedrock.runtime.LocalApplicationProcess) ErrorStreamRedirection(com.oracle.bedrock.runtime.options.ErrorStreamRedirection) IPv4Preferred(com.oracle.bedrock.runtime.java.options.IPv4Preferred) Executable(com.oracle.bedrock.runtime.options.Executable) JvmOption(com.oracle.bedrock.runtime.java.options.JvmOption) WorkingDirectory(com.oracle.bedrock.runtime.options.WorkingDirectory) Timeout(com.oracle.bedrock.options.Timeout) Arguments(com.oracle.bedrock.runtime.options.Arguments) WaitToStart(com.oracle.bedrock.runtime.java.options.WaitToStart) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) Option(com.oracle.bedrock.Option) JvmOption(com.oracle.bedrock.runtime.java.options.JvmOption) File(java.io.File) InetAddress(java.net.InetAddress) RemoteEvents(com.oracle.bedrock.runtime.java.options.RemoteEvents) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) JavaModules(com.oracle.bedrock.runtime.java.options.JavaModules) SystemProperties(com.oracle.bedrock.runtime.java.options.SystemProperties) Properties(java.util.Properties) ExpressionEvaluator(com.oracle.bedrock.lang.ExpressionEvaluator) Profile(com.oracle.bedrock.runtime.Profile) EnvironmentVariables(com.oracle.bedrock.runtime.options.EnvironmentVariables) Variables(com.oracle.bedrock.options.Variables) EnvironmentVariables(com.oracle.bedrock.runtime.options.EnvironmentVariables) LaunchLogging(com.oracle.bedrock.options.LaunchLogging) DisplayName(com.oracle.bedrock.runtime.options.DisplayName) ClassName(com.oracle.bedrock.runtime.java.options.ClassName) SocketBasedRemoteChannelServer(com.oracle.bedrock.runtime.concurrent.socket.SocketBasedRemoteChannelServer) Table(com.oracle.bedrock.table.Table) BedrockRunner(com.oracle.bedrock.runtime.java.options.BedrockRunner) UnknownHostException(java.net.UnknownHostException) JavaHome(com.oracle.bedrock.runtime.java.options.JavaHome) IOException(java.io.IOException) Date(java.util.Date) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) Orphanable(com.oracle.bedrock.runtime.options.Orphanable) SystemProperties(com.oracle.bedrock.runtime.java.options.SystemProperties) ApplicationListener(com.oracle.bedrock.runtime.ApplicationListener) OptionsByType(com.oracle.bedrock.OptionsByType) SimpleDateFormat(java.text.SimpleDateFormat)

Example 2 with PermanentlyUnavailableException

use of com.oracle.bedrock.deferred.PermanentlyUnavailableException in project oracle-bedrock by coherence-community.

the class Repetitively method assertThat.

/**
 * Asserts that a {@link Deferred} value, when available, repetitively satisfies
 * the specified {@link Matcher} over the {@link Timeout}
 * and other constraints defined by the provided {@link Option}s.
 *
 * @param <T>       the type of the value
 *
 * @param message   the message for the AssertionError (<code>null</code> ok)
 * @param deferred  the {@link Deferred} value
 * @param matcher   the {@link Matcher} for the value
 * @param options   the {@link Option}s
 *
 * @throws AssertionError if the assertion fails
 */
public static <T> void assertThat(String message, Deferred<T> deferred, Matcher<? super T> matcher, Option... options) throws AssertionError {
    // determine the time-out and retry constraints
    OptionsByType optionsByType = OptionsByType.of(options);
    long initialDelayDurationMS = optionsByType.getOrDefault(InitialDelay.class, InitialDelay.none()).to(TimeUnit.MILLISECONDS);
    long maximumRetryDurationMS = optionsByType.getOrDefault(Timeout.class, Timeout.after(DeferredHelper.getDefaultEnsuredMaximumRetryDuration())).to(TimeUnit.MILLISECONDS);
    long maximumPollingDurationMS = optionsByType.getOrDefault(MaximumRetryDelay.class, MaximumRetryDelay.of(DeferredHelper.getDefaultEnsuredMaximumPollingDuration())).to(TimeUnit.MILLISECONDS);
    Iterator<Duration> retryDurations = optionsByType.getOrDefault(RetryFrequency.class, RetryFrequency.of(DeferredHelper.getDefaultEnsuredRetryDurationsIterable())).get().iterator();
    // the number of times successfully matched
    int matchCount = 0;
    // the number of matches attempted
    int attemptCount = 0;
    // determine the maximum time we can wait
    long remainingRetryDurationMS = maximumRetryDurationMS;
    do {
        // wait the initial duration
        if (initialDelayDurationMS > 0) {
            try {
                Thread.sleep(initialDelayDurationMS);
            } catch (InterruptedException e) {
                throw new AssertionError("Interrupted while resolving " + deferred, e);
            }
            // reduce the remaining time
            remainingRetryDurationMS -= initialDelayDurationMS;
        // NOTE: even if there's no time remaining we'll at least
        // attempt to acquire the object reference just once!
        }
        // the time the most recent acquisition took
        long acquisitionDurationMS = 0;
        try {
            long started = System.currentTimeMillis();
            // set the remaining timeout
            optionsByType.add(Timeout.after(Math.min(remainingRetryDurationMS, 0), TimeUnit.MILLISECONDS));
            T object = DeferredHelper.ensure(deferred, optionsByType.asArray());
            long stopped = System.currentTimeMillis();
            // the time spent trying to access the resource
            // is considered as part of the remaining time
            acquisitionDurationMS = stopped - started;
            remainingRetryDurationMS -= acquisitionDurationMS < 0 ? 0 : acquisitionDurationMS;
            // count this attempt
            attemptCount++;
            if (matcher.matches(object)) {
                // continue matching!
                matchCount++;
            } else {
                // generate a description for the match failure
                StringDescription description = new StringDescription();
                matcher.describeMismatch(object, description);
                // throw an assertion with the error
                throw new AssertionError(description.toString() + " (attempted " + attemptCount + " time(s), succeeded " + matchCount + " time(s))");
            }
        } catch (PermanentlyUnavailableException e) {
            // give up immediately!
            throw new AssertionError("Failed to resolve value for " + deferred, e);
        } catch (UnsupportedOperationException e) {
            // give up immediately when an operation is not supported
            throw new AssertionError("Failed to resolve value for " + deferred, e);
        } catch (TemporarilyUnavailableException e) {
        // SKIP: we will retry if the instance is temporarily unavailable
        } catch (RuntimeException e) {
        // SKIP: we assume all other runtime exceptions
        // simply means that we should retry
        }
        // determine if we need to retry
        if (maximumRetryDurationMS < 0 || remainingRetryDurationMS > 0) {
            // we can only retry while we have retry durations
            if (retryDurations.hasNext()) {
                try {
                    Duration duration = retryDurations.next();
                    long durationMS = duration.to(TimeUnit.MILLISECONDS);
                    // ensure we don't wait longer than the maximum polling duration
                    if (durationMS > maximumPollingDurationMS) {
                        durationMS = maximumPollingDurationMS;
                    }
                    // ensure we don't wait longer that the remaining duration
                    if (remainingRetryDurationMS - durationMS < 0) {
                        durationMS = remainingRetryDurationMS;
                    }
                    // only wait if we have a duration
                    if (durationMS > 0) {
                        TimeUnit.MILLISECONDS.sleep(durationMS);
                    }
                    // reduce the remaining time
                    remainingRetryDurationMS -= durationMS;
                } catch (InterruptedException e) {
                    // if we're interrupted, we give up immediately
                    throw new AssertionError("Interrupted while resolving " + deferred, e);
                }
            } else {
                // if we run out of retry durations, we give up immediately
                throw new AssertionError("Exhausted retry time-out durations");
            }
        }
    } while (maximumRetryDurationMS < 0 || remainingRetryDurationMS > 0);
    if (matchCount == 0) {
        throw new AssertionError("Failed to resolve a value for " + deferred);
    }
}
Also used : InitialDelay(com.oracle.bedrock.deferred.options.InitialDelay) Timeout(com.oracle.bedrock.options.Timeout) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) Duration(com.oracle.bedrock.util.Duration) StringDescription(org.hamcrest.StringDescription) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) OptionsByType(com.oracle.bedrock.OptionsByType) MaximumRetryDelay(com.oracle.bedrock.deferred.options.MaximumRetryDelay)

Example 3 with PermanentlyUnavailableException

use of com.oracle.bedrock.deferred.PermanentlyUnavailableException in project oracle-bedrock by coherence-community.

the class EventuallyTest method shouldWaitDefaultTimeout.

/**
 * Ensure that a {@link Eventually#assertThat(Object, Matcher, Option...)}
 * waits at least the default amount of time before throwing an exception when
 * a {@link Deferred} is {@link NotAvailable}.
 */
@Test
public void shouldWaitDefaultTimeout() {
    StopWatch stopWatch = new StopWatch();
    try {
        stopWatch.start();
        Eventually.assertThat(valueOf(new NotAvailable<String>(String.class)), is("hello world"));
    } catch (AssertionError e) {
        Assert.assertTrue("Failed to throw an PermanentlyUnavailableException as expected", e.getCause() instanceof PermanentlyUnavailableException);
        stopWatch.stop();
        Assert.assertTrue(String.format("Failed to wait for the default duration of %d seconds.  Waited %s seconds", DeferredHelper.BEDROCK_DEFERRED_RETRY_TIMEOUT_SECS, stopWatch.getElapsedTimeIn(TimeUnit.SECONDS)), stopWatch.getElapsedTimeIn(TimeUnit.SECONDS) >= DeferredHelper.BEDROCK_DEFERRED_RETRY_TIMEOUT_SECS * 0.95);
    } catch (Exception e) {
        Assert.fail("Unexpected Exception:" + e);
    }
}
Also used : NotAvailable(com.oracle.bedrock.deferred.NotAvailable) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) StopWatch(com.oracle.bedrock.util.StopWatch) Test(org.junit.Test)

Example 4 with PermanentlyUnavailableException

use of com.oracle.bedrock.deferred.PermanentlyUnavailableException in project oracle-bedrock by coherence-community.

the class DeferredJMXConnector method get.

@Override
public JMXConnector get() throws TemporarilyUnavailableException, PermanentlyUnavailableException {
    String username = "";
    String password = "";
    Map<String, Object> env = new HashMap<String, Object>();
    String[] credentials = new String[] { username, password };
    env.put(JMXConnector.CREDENTIALS, credentials);
    try {
        JMXConnector connector;
        connector = jmxConnectorBuilder.realize(new JMXServiceURL(jmxConnectionURL), env);
        connector.connect();
        return connector;
    } catch (IOException e) {
        throw new PermanentlyUnavailableException(this, e);
    } catch (Exception e) {
        // we assume any exception means we should retry
        throw new TemporarilyUnavailableException(this, e);
    }
}
Also used : JMXServiceURL(javax.management.remote.JMXServiceURL) HashMap(java.util.HashMap) JMXConnector(javax.management.remote.JMXConnector) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) IOException(java.io.IOException) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) IOException(java.io.IOException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException)

Example 5 with PermanentlyUnavailableException

use of com.oracle.bedrock.deferred.PermanentlyUnavailableException in project oracle-bedrock by coherence-community.

the class DeferredMBeanAttribute method get.

@Override
public T get() throws TemporarilyUnavailableException, PermanentlyUnavailableException {
    try {
        JMXConnector connector = deferredJMXConnector.get();
        if (connector == null) {
            throw new TemporarilyUnavailableException(this);
        } else {
            MBeanServerConnection connection = connector.getMBeanServerConnection();
            Object attribute = connection.getAttribute(objectName, attributeName);
            return attributeClass.cast(attribute);
        }
    } catch (IOException e) {
        // the previous connection has now failed and so must this mbean
        throw new PermanentlyUnavailableException(this, e);
    } catch (NullPointerException e) {
        // we can retry
        throw new TemporarilyUnavailableException(this, e);
    } catch (ClassCastException e) {
        // the result
        throw new PermanentlyUnavailableException(this, e);
    } catch (InstanceNotFoundException e) {
        // so we should be able to retry
        throw new TemporarilyUnavailableException(this, e);
    } catch (UnavailableException e) {
        // when the connector is unavailable, so is the attribute
        throw e;
    } catch (RuntimeException e) {
        throw new TemporarilyUnavailableException(this, e);
    } catch (Exception e) {
        throw new TemporarilyUnavailableException(this, e);
    }
}
Also used : JMXConnector(javax.management.remote.JMXConnector) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) InstanceNotFoundException(javax.management.InstanceNotFoundException) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) UnavailableException(com.oracle.bedrock.deferred.UnavailableException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException) IOException(java.io.IOException) MBeanServerConnection(javax.management.MBeanServerConnection) PermanentlyUnavailableException(com.oracle.bedrock.deferred.PermanentlyUnavailableException) UnavailableException(com.oracle.bedrock.deferred.UnavailableException) IOException(java.io.IOException) InstanceNotFoundException(javax.management.InstanceNotFoundException) TemporarilyUnavailableException(com.oracle.bedrock.deferred.TemporarilyUnavailableException)

Aggregations

PermanentlyUnavailableException (com.oracle.bedrock.deferred.PermanentlyUnavailableException)9 TemporarilyUnavailableException (com.oracle.bedrock.deferred.TemporarilyUnavailableException)9 Timeout (com.oracle.bedrock.options.Timeout)3 StopWatch (com.oracle.bedrock.util.StopWatch)3 IOException (java.io.IOException)3 OptionsByType (com.oracle.bedrock.OptionsByType)2 NotAvailable (com.oracle.bedrock.deferred.NotAvailable)2 SocketBasedRemoteChannelServer (com.oracle.bedrock.runtime.concurrent.socket.SocketBasedRemoteChannelServer)2 JmxFeature (com.oracle.bedrock.runtime.java.features.JmxFeature)2 WaitToStart (com.oracle.bedrock.runtime.java.options.WaitToStart)2 JMXConnector (javax.management.remote.JMXConnector)2 Test (org.junit.Test)2 Option (com.oracle.bedrock.Option)1 NeverAvailable (com.oracle.bedrock.deferred.NeverAvailable)1 UnavailableException (com.oracle.bedrock.deferred.UnavailableException)1 InitialDelay (com.oracle.bedrock.deferred.options.InitialDelay)1 MaximumRetryDelay (com.oracle.bedrock.deferred.options.MaximumRetryDelay)1 ExpressionEvaluator (com.oracle.bedrock.lang.ExpressionEvaluator)1 LaunchLogging (com.oracle.bedrock.options.LaunchLogging)1 Variables (com.oracle.bedrock.options.Variables)1