Author: andygumbrecht
Date: Mon Apr 15 13:44:22 2013
New Revision: 1468065
URL: http://svn.apache.org/r1468065
Log:
Reduce logging level and prevent runaway exception logging - i.e. Caused by a
rogue client that keeps attempting a bad call.
TODO - Currently limiting to 10 logged errors at warning level, but really need
to have a timer reset after a certain period.
Prevent service start if stop has already been called - Rare case where the
server needs to be killed aggressively during a startup, for example due to a
bad configuration.
Finals.
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
Mon Apr 15 13:44:22 2013
@@ -55,7 +55,7 @@ public class ActiveMQResourceAdapter ext
return Integer.parseInt(this.startupTimeout);
}
- public void setStartupTimeout(Duration startupTimeout) {
+ public void setStartupTimeout(final Duration startupTimeout) {
if (startupTimeout.getUnit() == null) {
startupTimeout.setUnit(TimeUnit.MILLISECONDS);
}
@@ -121,7 +121,7 @@ public class ActiveMQResourceAdapter ext
}
}
- private void createInternalBroker(String brokerXmlConfig, Properties
properties) {
+ private void createInternalBroker(final String brokerXmlConfig, final
Properties properties) {
ActiveMQFactory.setThreadProperties(properties);
try {
Modified:
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
(original)
+++
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
Mon Apr 15 13:44:22 2013
@@ -521,8 +521,8 @@ class EjbRequestHandler {
private void replyWithFatalError(final byte version, final
ObjectOutputStream out, final Throwable error, final String message) {
//This is fatal for the client, but not the server.
- if (logger.isWarningEnabled()) {
- logger.warning(message + " - Debug " + logger + " for stacktrace:
" + error);
+ if (logger.isInfoEnabled()) {
+ logger.info(message + " - Enable DEBUG for stacktrace: " + error);
} else if (logger.isDebugEnabled()) {
logger.debug(message, error);
}
@@ -536,8 +536,8 @@ class EjbRequestHandler {
} catch (Throwable t) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to write EjbResponse", t);
- } else if (logger.isWarningEnabled()) {
- logger.warning("Failed to write EjbResponse - Debug for
stacktrace: " + t);
+ } else if (logger.isInfoEnabled()) {
+ logger.info("Failed to write EjbResponse - Debug for
stacktrace: " + t);
}
}
}
Modified:
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
(original)
+++
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
Mon Apr 15 13:44:22 2013
@@ -34,6 +34,7 @@ import java.util.Properties;
@Managed
public class ServiceLogger extends ServerServiceFilter {
+ private volatile int errors = 0;
private Logger logger;
private boolean debug = false;
@@ -95,11 +96,12 @@ public class ServiceLogger extends Serve
this.logger.debug("[request] for '" + name + "' by '" +
address + "' took " + (System.nanoTime() - start) + "ns");
}
} catch (Exception e) {
- final String msg = "[Request failed] for '" + name + "' by '" +
address + "' : " + e.getMessage();
if (this.debug) {
- this.logger.error(msg, e);
- } else {
- this.logger.error(msg + " - Debug for StackTrace");
+ //Only log on debug else there is a DOS risk
+ this.logger.debug("[Request failed] for '" + name + "' by '" +
address + "' : " + e.getMessage(), e);
+ } else if (this.logger.isWarningEnabled() && (errors <
Integer.getInteger("openejb.max.log.socket.errors", 10))) {
+ errors++;
+ this.logger.warning("[Request failed] for '" + name + "' by '"
+ address + "' : " + e.getMessage());
}
}
}
Modified:
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
(original)
+++
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
Mon Apr 15 13:44:22 2013
@@ -55,7 +55,7 @@ public abstract class ServiceManager {
public ServiceManager() {
}
- public static ServiceManager getManager() {
+ public static synchronized ServiceManager getManager() {
if (manager == null) {
manager = new SimpleServiceManager();
}
@@ -63,11 +63,11 @@ public abstract class ServiceManager {
return manager;
}
- public static ServiceManager get() {
+ public static synchronized ServiceManager get() {
return manager;
}
- protected static void setServiceManager(final ServiceManager newManager) {
+ protected static synchronized void setServiceManager(final ServiceManager
newManager) {
manager = newManager;
}
@@ -307,10 +307,19 @@ public abstract class ServiceManager {
abstract public void init() throws Exception;
- public void start() throws ServiceException {
+ public final void start() throws ServiceException {
start(true);
}
+ /**
+ * Start the services managed by this instance.
+ * <p/>
+ * Services should not be started if {@link #stop()} has already been
called,
+ * in which case a ServiceException should be thrown
+ *
+ * @param block A request to block
+ * @throws ServiceException On error or if the manager has been stopped
already
+ */
abstract public void start(boolean block) throws ServiceException;
abstract public void stop() throws ServiceException;
Modified:
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
(original)
+++
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
Mon Apr 15 13:44:22 2013
@@ -43,7 +43,7 @@ public class SimpleServiceManager extend
private static ObjectName objectName = null;
private ServerService[] daemons;
- private boolean stop = false;
+ private volatile boolean stopped = false;
private final ServiceFinder serviceFinder;
public SimpleServiceManager() {
@@ -149,10 +149,16 @@ public class SimpleServiceManager extend
final List<ServerService> enabledServers =
initServers(availableServices);
daemons = enabledServers.toArray(new
ServerService[enabledServers.size()]);
+ stopped = false;
}
@Override
public synchronized void start(final boolean block) throws
ServiceException {
+
+ if(stopped){
+ throw new ServiceException("Stop has already been called on
ServiceManager");
+ }
+
final boolean display =
SystemInstance.get().getOptions().get("openejb.nobanner", (String) null) ==
null;
// starting then displaying to get a more relevant log
@@ -207,7 +213,7 @@ public class SimpleServiceManager extend
* which will set 'stop' to true and notify the user thread.
*/
try {
- while (!stop) {
+ while (!stopped) {
this.wait(Long.MAX_VALUE);
}
@@ -220,7 +226,7 @@ public class SimpleServiceManager extend
@Override
public synchronized void stop() throws ServiceException {
logger.info("Stopping server services");
- stop = true;
+ stopped = true;
final ServerService[] services = daemons.clone();
Modified:
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
---
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
(original)
+++
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
Mon Apr 15 13:44:22 2013
@@ -20,6 +20,7 @@ import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.DiscoveryRegistry;
import org.apache.openejb.server.ServerService;
+import org.apache.openejb.server.ServiceException;
import org.apache.openejb.server.ServiceManager;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
@@ -30,9 +31,7 @@ import org.osgi.framework.ServiceRegistr
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.BundleTrackerCustomizer;
-import java.io.BufferedInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -49,136 +48,145 @@ public class ServiceManagerExtender exte
static Logger logger =
Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE,
"org.apache.openejb.server.util.resources");
- private BundleContext bundleContext;
- private BundleTracker tracker;
- private Map<Bundle, List<Service>> serverMap = new HashMap<Bundle,
List<Service>>();
+ private final BundleContext bundleContext;
+ private BundleTracker tracker;
+ private final Map<Bundle, List<Service>> serverMap = new HashMap<Bundle,
List<Service>>();
private Boolean started;
-
- public ServiceManagerExtender(BundleContext bundleContext) {
+ private volatile boolean stopped = false;
+
+ public ServiceManagerExtender(final BundleContext bundleContext) {
setServiceManager(this);
-
+
this.bundleContext = bundleContext;
}
-
+
+ @Override
public void init() throws Exception {
if (started != null && started.equals(Boolean.TRUE)) {
throw new IllegalStateException("ServiceManager is already
initialized");
}
- DiscoveryRegistry registry = new DiscoveryRegistry();
+ final DiscoveryRegistry registry = new DiscoveryRegistry();
SystemInstance.get().setComponent(DiscoveryRegistry.class, registry);
-
+
started = Boolean.FALSE;
- ServerServiceTracker t = new ServerServiceTracker();
+ stopped = false;
+ final ServerServiceTracker t = new ServerServiceTracker();
tracker = new BundleTracker(bundleContext, Bundle.ACTIVE |
Bundle.STOPPING, t);
- tracker.open();
- }
-
- public synchronized void start(boolean block) {
- start();
+ tracker.open();
}
- public synchronized void start() {
+ @Override
+ public synchronized void start(final boolean block) throws
ServiceException {
+
+ //This implementaion ignores block
+
if (started == null) {
- throw new IllegalStateException("ServiceManager not initialized");
+ throw new ServiceException("ServiceManager not initialized");
+ }
+ if (stopped) {
+ throw new ServiceException("ServiceManager has already been
stopped");
}
+
started = Boolean.TRUE;
- for (Map.Entry<Bundle, List<Service>> entry : serverMap.entrySet()) {
- for (Service service : entry.getValue()) {
+ for (final Map.Entry<Bundle, List<Service>> entry :
serverMap.entrySet()) {
+ for (final Service service : entry.getValue()) {
service.start();
}
}
}
-
- private synchronized void startServers(Bundle bundle, List<Service>
services) {
+
+ private synchronized void startServers(final Bundle bundle, final
List<Service> services) {
serverMap.put(bundle, services);
- if (started == Boolean.TRUE) {
- for (Service service : services) {
+ if (started == Boolean.TRUE) {
+ for (final Service service : services) {
service.start();
}
}
}
-
- protected void addedServers(Bundle bundle, Map<String, Properties>
resources) {
- List<Service> services = new ArrayList<Service>();
- for (Map.Entry<String, Properties> entry : resources.entrySet()) {
+
+ protected void addedServers(final Bundle bundle, final Map<String,
Properties> resources) {
+ final List<Service> services = new ArrayList<Service>();
+ for (final Map.Entry<String, Properties> entry : resources.entrySet())
{
services.add(new Service(bundle, entry.getKey(),
entry.getValue()));
}
startServers(bundle, services);
}
-
+
+ @Override
public synchronized void stop() {
if (started == Boolean.TRUE) {
started = Boolean.FALSE;
- for (Map.Entry<Bundle, List<Service>> entry :
serverMap.entrySet()) {
- for (Service service : entry.getValue()) {
+ for (final Map.Entry<Bundle, List<Service>> entry :
serverMap.entrySet()) {
+ for (final Service service : entry.getValue()) {
service.stop();
}
}
}
}
-
- protected synchronized void removedServers(Bundle bundle) {
- List<Service> services = serverMap.remove(bundle);
+
+ protected synchronized void removedServers(final Bundle bundle) {
+ final List<Service> services = serverMap.remove(bundle);
if (services != null) {
- for (Service service : services) {
+ for (final Service service : services) {
service.stop();
}
}
}
-
+
protected void shutdown() {
if (tracker != null) {
tracker.close();
}
stop();
}
-
+
private class Service {
-
- private String name;
- private Properties description;
- private Bundle bundle;
-
+
+ private final String name;
+ private final Properties description;
+ private final Bundle bundle;
+
private ServiceRegistration registration;
private ServerService server;
-
- public Service(Bundle bundle, String name, Properties description) {
+
+ public Service(final Bundle bundle, final String name, final
Properties description) {
this.bundle = bundle;
this.name = name;
this.description = description;
}
-
+
public void start() {
try {
server = initServer(name, description);
} catch (IOException e) {
logger.error("Error initializing " + name + " service.", e);
}
-
+
if (server != null) {
try {
- server.start();
+ server.start();
} catch (Exception e) {
logger.error("Service Start Failed: " + name + " " +
server.getIP() + " " + server.getPort() + ". Exception: " + e.getMessage(), e);
}
-
- BundleContext context = bundle.getBundleContext();
- registration =
context.registerService(ServerService.class.getName(),
- server,
+
+ final BundleContext context = bundle.getBundleContext();
+ registration =
context.registerService(ServerService.class.getName(),
+ server,
getServiceProperties());
}
}
-
+
+ @SuppressWarnings({"UseOfObsoleteCollectionType", "unchecked"})
private Hashtable getServiceProperties() {
- Hashtable props = new Hashtable();
- for (Map.Entry<Object, Object> entry : description.entrySet()) {
+ final Hashtable props = new Hashtable();
+ for (final Map.Entry<Object, Object> entry :
description.entrySet()) {
if (entry.getKey() instanceof String) {
props.put(entry.getKey(), entry.getValue());
}
}
return props;
}
-
+
public void stop() {
if (server != null) {
try {
@@ -188,34 +196,41 @@ public class ServiceManagerExtender exte
}
}
if (registration != null) {
- try { registration.unregister(); } catch
(IllegalStateException ignore) {}
+ try {
+ registration.unregister();
+ } catch (IllegalStateException ignore) {
+ }
}
}
}
-
+
private class ServerServiceTracker implements BundleTrackerCustomizer {
- public Object addingBundle(Bundle bundle, BundleEvent event) {
+ @Override
+ public Object addingBundle(final Bundle bundle, final BundleEvent
event) {
return scan(bundle);
}
- public void modifiedBundle(Bundle bundle, BundleEvent event, Object
arg2) {
+ @Override
+ public void modifiedBundle(final Bundle bundle, final BundleEvent
event, final Object arg2) {
}
- public void removedBundle(Bundle bundle, BundleEvent event, Object
arg2) {
+ @Override
+ public void removedBundle(final Bundle bundle, final BundleEvent
event, final Object arg2) {
removedServers(bundle);
}
-
- private Object scan(Bundle bundle) {
- String basePath = "/META-INF/" + ServerService.class.getName() +
"/";
- Enumeration<URL> entries = bundle.findEntries(basePath, "*",
false);
- if (entries != null) {
- Map<String, Properties> resources = new HashMap<String,
Properties>();
+
+ @SuppressWarnings("unchecked")
+ private Object scan(final Bundle bundle) {
+ final String basePath = "/META-INF/" +
ServerService.class.getName() + "/";
+ final Enumeration<URL> entries = bundle.findEntries(basePath, "*",
false);
+ if (entries != null) {
+ final Map<String, Properties> resources = new HashMap<String,
Properties>();
while (entries.hasMoreElements()) {
- URL entry = entries.nextElement();
- String name = entry.getPath().substring(basePath.length());
+ final URL entry = entries.nextElement();
+ final String name =
entry.getPath().substring(basePath.length());
try {
- Properties props = loadProperties(entry);
+ final Properties props = loadProperties(entry);
setClass(props, bundle, ServerService.class);
setRawProperties(props, entry);
resources.put(name, props);
@@ -225,11 +240,11 @@ public class ServiceManagerExtender exte
}
addedServers(bundle, resources);
return bundle;
- }
+ }
return null;
}
-
- private void setClass(Properties properties, Bundle bundle, Class
interfase) throws ClassNotFoundException {
+
+ private void setClass(final Properties properties, final Bundle
bundle, final Class interfase) throws ClassNotFoundException {
String className = properties.getProperty("className");
if (className == null) {
className = properties.getProperty("classname");
@@ -238,20 +253,20 @@ public class ServiceManagerExtender exte
}
}
- Class impl = bundle.loadClass(className);
+ final Class impl = bundle.loadClass(className);
properties.put(interfase, impl);
}
- private void setRawProperties(Properties properties, URL entry) throws
IOException {
- String rawProperties = readContents(entry);
+ private void setRawProperties(final Properties properties, final URL
entry) throws IOException {
+ final String rawProperties = readContents(entry);
properties.put(Properties.class, rawProperties);
}
- private Properties loadProperties(URL resource) throws IOException {
+ private Properties loadProperties(final URL resource) throws
IOException {
return IO.readProperties(resource);
}
-
- private String readContents(URL resource) throws IOException {
+
+ private String readContents(final URL resource) throws IOException {
return IO.slurp(resource);
}