views:

135

answers:

2

I have a plugin module that goes into a web application. If the module does not load correctly, it does not make sense for the web application to go on, and the web application should probably not load at all, we would prefer this module to initialize correctly always. If I were to throw a runtime exception, it would get into the logs, and just get ignored since the application will continue anyway, and the end users would never know... I know that errors are meant to be thrown only under exceptional conditions, and they generally have to do with situations that the system cannot recover from, but what would you do in such a situation?

+1  A: 

Not sure how exactly but OSGi got a dependency management of bundles (=similar to plugins). One bundle don't load until another bundle is ready. Maybe you can use this same mechanism (or simply use OSGi itself ;)) to wait for one plugin/application until another plugin is ready. Or you shutdown the application during startup if it cannot find/load your plugin correctly.

Progman
Seems like the hammer of all nails, however being fond of OSGi, I tend to approvde. Besides, any kind of dependency management mechanism should work (IoC, you name it).
Riduidel
+3  A: 

The only Error which I've regularly used in business code is ExceptionInInitializerError. You have no other choice in static initializer blocks.

But even if you throw that inside a webapplication, the webapplication would still continue listening on HTTP requests. Your best bet is to do the module loading or initialization inside a Filter listening on an url-pattern of /* and let the Filter block the HTTP requests accordingly. E.g.

private boolean allModulesAreLoaded;

@Override
public void init(FilterConfig config) {
    try {
        // Load modules.
        allModulesAreLoaded = true;
    } catch (Exception e) {
        // Handle.
    }
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (allModulesAreLoaded) {
        chain.doFilter(request, response);
    } else {
        throw new ServletException("Not all modules are loaded.");
    }
}

This would yield a HTTP 500 error with the given message.

BalusC