Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.monitoring.DynamicMBeanWrapper;
import org.apache.openejb.monitoring.LocalMBeanServer;
import org.apache.openejb.monitoring.MBeanPojoWrapper;
import org.apache.openejb.monitoring.ObjectNameBuilder;
import org.apache.openejb.monitoring.remote.RemoteResourceMonitor;
import org.apache.openejb.observer.Observes;
Expand Down Expand Up @@ -178,11 +179,7 @@
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.DefinitionException;
import javax.enterprise.inject.spi.DeploymentException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.*;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
Expand Down Expand Up @@ -2128,9 +2125,14 @@ private void doResourceDestruction(final String name, final String className, fi
ExecutorService.class.cast(resourceAdapter.pool).shutdownNow();
}
resourceAdapter.ra.stop();

// remove associated JMX object
} catch (final Throwable t) {
logger.fatal("ResourceAdapter Shutdown Failed: " + name, t);
}

removeResourceMBean(name, "ResourceAdapter");

} else if (object instanceof ResourceAdapter) {
final ResourceAdapter resourceAdapter = (ResourceAdapter) object;
try {
Expand All @@ -2144,6 +2146,9 @@ private void doResourceDestruction(final String name, final String className, fi
} catch (final Throwable t) {
logger.fatal("ResourceAdapter Shutdown Failed: " + name, t);
}

removeResourceMBean(name, "ResourceAdapter");

} else if (DataSourceFactory.knows(object)) {
logger.info("Closing DataSource: " + name);

Expand All @@ -2162,14 +2167,41 @@ private void doResourceDestruction(final String name, final String className, fi
} catch (final Exception e) {
logger.debug("Not processing resource on destroy: " + className, e);
}

removeResourceMBean(name, "ConnectionFactory");

} else if (DestroyableResource.class.isInstance(object)) {
try {
DestroyableResource.class.cast(object).destroyResource();
} catch (final RuntimeException e) {
logger.error(e.getMessage(), e);
}
} else if (logger.isDebugEnabled() && !DataSource.class.isInstance(object)) {
logger.debug("Not processing resource on destroy: " + className);

removeResourceMBean(name, "Resource");
} else if (!DataSource.class.isInstance(object)) {
removeResourceMBean(name, "Resource");

if (logger.isDebugEnabled()) {
logger.debug("Not processing resource on destroy: " + className);
}
}
}

private void removeResourceMBean(String name, String type) {
final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
jmxName.set("J2EEServer", "openejb");
jmxName.set("J2EEApplication", null);
jmxName.set("j2eeType", "");
jmxName.set("name",name);

final MBeanServer server = LocalMBeanServer.get();
try {
final ObjectName objectName = jmxName.set("j2eeType", type).build();
if (server.isRegistered(objectName)) {
server.unregisterMBean(objectName);
}
} catch (final Exception e) {
logger.error("Unable to unregister MBean ", e);
}
}

Expand Down Expand Up @@ -3218,6 +3250,7 @@ public synchronized boolean containsKey(final Object key) {
unset.remove("threadPoolSize");
logUnusedProperties(unset, serviceInfo);

registerAsMBean(serviceInfo.id, "ResourceAdapter", resourceAdapter);
service = new ResourceAdapterReference(resourceAdapter, threadPool, OPENEJB_RESOURCE_JNDI_PREFIX + serviceInfo.id);
} else if (service instanceof ManagedConnectionFactory) {
final ManagedConnectionFactory managedConnectionFactory = (ManagedConnectionFactory) service;
Expand Down Expand Up @@ -3245,6 +3278,19 @@ public synchronized boolean containsKey(final Object key) {

// create the connection manager
final ConnectionManager connectionManager = (ConnectionManager) connectionManagerRecipe.create();


String txSupport = "xa";
try {
txSupport = (String) connectionManagerRecipe.getProperty("transactionSupport");
} catch (Exception e) {
// ignore
}

if (txSupport == null || txSupport.trim().length() == 0) {
txSupport = "xa";
}

if (connectionManager == null) {
throw new OpenEJBRuntimeException(messages.format("assembler.invalidConnectionManager", serviceInfo.id));
}
Expand Down Expand Up @@ -3317,13 +3363,40 @@ public synchronized boolean containsKey(final Object key) {
if (serviceInfo.unsetProperties == null || isTemplatizedResource(serviceInfo)) {
logUnusedProperties(serviceRecipe, serviceInfo);
} // else wait post construct

registerAsMBean(serviceInfo.id, "Resource", service);
}

final ResourceCreated event = new ResourceCreated(service, serviceInfo.id);
SystemInstance.get().fireEvent(event);
return event.getReplacement() == null ? service : event.getReplacement();
}

private void registerAsMBean(final String name, final String type, Object resource) {
final MBeanServer server = LocalMBeanServer.get();

final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
jmxName.set("J2EEServer", "openejb");
jmxName.set("J2EEApplication", null);
jmxName.set("j2eeType", "");
jmxName.set("name", name);

try {
final ObjectName objectName = jmxName.set("j2eeType", type).build();
if (server.isRegistered(objectName)) {
server.unregisterMBean(objectName);
}

if (DynamicMBean.class.isInstance(resource)) {
server.registerMBean(resource, objectName);
} else {
server.registerMBean(new MBeanPojoWrapper(name, resource), objectName);
}
} catch (final Exception e) {
logger.error("Unable to register MBean ", e);
}
}

private void bindResource(final String id, final Object service, final boolean canReplace) throws OpenEJBException {
final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id;
final Context jndiContext = containerSystem.getJNDIContext();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.monitoring;

import org.apache.geronimo.connector.outbound.GenericConnectionManager;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoPool;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;

public class ConnectionFactoryMonitor {

private final String name;
private final GenericConnectionManager connectionManager;
private final String txSupport;

public ConnectionFactoryMonitor(final String name, final GenericConnectionManager connectionManager, final String txSupport) {
this.name = name;
this.connectionManager = connectionManager;
this.txSupport = txSupport;
}

private PoolingSupport getPooling() {
return connectionManager.getPooling();
}

@Managed
public int getMaxSize() {
final PoolingSupport pooling = getPooling();

if (PartitionedPool.class.isInstance(pooling)) {
return PartitionedPool.class.cast(pooling).getMaxSize();
} else if (SinglePool.class.isInstance(pooling)) {
return SinglePool.class.cast(pooling).getMaxSize();
} else if (NoPool.class.isInstance(pooling)) {
return 0;
} else {
return 0;
}
}

@Managed
public int getMinSize() {
final PoolingSupport pooling = getPooling();

if (PartitionedPool.class.isInstance(pooling)) {
return 0;
} else if (SinglePool.class.isInstance(pooling)) {
return SinglePool.class.cast(pooling).getMinSize();
} else if (NoPool.class.isInstance(pooling)) {
return 0;
} else {
return 0;
}
}

@Managed
public int getBlockingTimeoutMilliseconds() {
return connectionManager.getBlockingTimeoutMilliseconds();
}

@Managed
public int getIdleTimeoutMinutes() {
return connectionManager.getIdleTimeoutMinutes();
}

@Managed
public boolean isMatchAll() {
final PoolingSupport pooling = getPooling();

if (PartitionedPool.class.isInstance(pooling)) {
return PartitionedPool.class.cast(pooling).isMatchAll();
} else if (SinglePool.class.isInstance(pooling)) {
return SinglePool.class.cast(pooling).isMatchAll();
} else {
return false;
}
}

@Managed
public String getPartitionStrategy() {
final PoolingSupport pooling = getPooling();

if (PartitionedPool.class.isInstance(pooling)) {
if (PartitionedPool.class.cast(pooling).isPartitionByConnectionRequestInfo()) {
return PartitionStrategy.BY_CONNECTOR_PROPERTIES.toString();
}

if (PartitionedPool.class.cast(pooling).isPartitionBySubject()) {
return PartitionStrategy.BY_SUBJECT.toString();
}

return PartitionStrategy.UNKNOWN.toString();
} else if (SinglePool.class.isInstance(pooling)) {
return PartitionStrategy.NONE.toString();
} else if (NoPool.class.isInstance(pooling)) {
return PartitionStrategy.NONE.toString();
} else {
return PartitionStrategy.NONE.toString();
}
}

@Managed
public String getTxSupport() {
return txSupport;
}

@Managed
public int getPartitionCount() {
return connectionManager.getPartitionCount();
}

@Managed
public int getPartitionMaxSize() {
return connectionManager.getPartitionMaxSize();
}

@Managed
public int getPartitionMinSize() {
return connectionManager.getPartitionMinSize();
}

@Managed
public int getIdleConnectionCount() {
return connectionManager.getIdleConnectionCount();
}

@Managed
public int getConnectionCount() {
return connectionManager.getConnectionCount();
}

@Managed
public String getName() {
return name;
}

public enum PartitionStrategy {
NONE("none"), BY_SUBJECT("by-subject"), BY_CONNECTOR_PROPERTIES("by-connector-properties"), UNKNOWN("unknown");

private final String name;

PartitionStrategy(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}
}

}
Loading