Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eclipse RCP: How to prevent multiple instances of RCP from launching?

I read on http://eclipse.geekyramblings.net/2010/12/14/preventing-multiple-instances/ on how to prevent multiple instances of your RCP from being launched. But when I made my RCP(It's a simple RCP based on the "Hello RCP" Template) executable and tried launching it, it throws me this error

java.io.IOException: The location has not been set.
    at org.eclipse.core.runtime.internal.adaptor.BasicLocation.lock(BasicLocation.java:174)
    at testrcp.Application.start(Application.java:43)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1407)

I am using Eclipse Java EE IDE for Web Developers.

Version: Helios Service Release 1 Build id: 20100917-0705

Here is the code which is in my Application.java file

package testrcp;

import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;

/**
 * This class controls all aspects of the application's execution
 */
public class Application implements IApplication {

    /* (non-Javadoc)
     * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
     */

    public Object start(IApplicationContext context) throws Exception {
        Display display = PlatformUI.createDisplay();

        int exitCode = IApplication.EXIT_OK;

        Location instanceLocation = Platform.getInstanceLocation();

        if (!instanceLocation.lock()) {
            MessageDialog.openError(new Shell(display), "App Title",
            "Another instance of the Application is currently running.");
        } else {

            int returnCode = PlatformUI.createAndRunWorkbench(display,
                    new ApplicationWorkbenchAdvisor());
            switch (returnCode) {
            case PlatformUI.RETURN_RESTART :
                exitCode = IApplication.EXIT_RESTART;
                break;
            default :
                exitCode = IApplication.EXIT_OK;
            }
        }

        instanceLocation.release();

        display.dispose();

        return exitCode;
    }
    /* (non-Javadoc)
     * @see org.eclipse.equinox.app.IApplication#stop()
     */
    public void stop() {
        if (!PlatformUI.isWorkbenchRunning())
            return;
        final IWorkbench workbench = PlatformUI.getWorkbench();
        final Display display = workbench.getDisplay();
        display.syncExec(new Runnable() {
            public void run() {
                if (!display.isDisposed())
                    workbench.close();
            }
        });
    }
}

Any help on resolving this issue or any suggestion, would be really appreciated.

Thanks,

Abbas

like image 203
Abbas Avatar asked Aug 18 '11 08:08

Abbas


2 Answers

I was able to make it work by adding this line

instanceLocation.getURL();

after

Location instanceLocation = Platform.getInstanceLocation();

But be aware, this will however not prevent it from being launched from a different folder where the RCP executable exists... Is there any way to keep a check on that ?

like image 80
Abbas Avatar answered Sep 30 '22 08:09

Abbas


You can also open a server socket when you launch your application. If you open another instance, communicate with the server. If you can communicate, that running instance can be opened leaving one instance of the application.

More in detail here

like image 31
Kathir Avatar answered Sep 30 '22 07:09

Kathir