You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2015/11/03 17:49:32 UTC
svn commit: r1712336 - in /james/project/trunk/server/container:
cassandra-guice/src/main/java/org/apache/james/
cassandra-guice/src/main/java/org/apache/james/modules/server/
cassandra-guice/src/test/resources/
cli/src/main/java/org/apache/james/cli/p...
Author: matthieu
Date: Tue Nov 3 16:49:32 2015
New Revision: 1712336
URL: http://svn.apache.org/viewvc?rev=1712336&view=rev
Log:
JAMES-1626 Add JMX support to cassandra-guice application
Added:
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServer.java
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServerModule.java
james/project/trunk/server/container/cassandra-guice/src/test/resources/jmx.properties
Modified:
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
james/project/trunk/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxServerProbe.java
Modified: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java?rev=1712336&r1=1712335&r2=1712336&view=diff
==============================================================================
--- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java (original)
+++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java Tue Nov 3 16:49:32 2015
@@ -34,6 +34,7 @@ import org.apache.james.modules.server.A
import org.apache.james.modules.server.ConfigurationPerformerModule;
import org.apache.james.modules.server.DNSServiceModule;
import org.apache.james.modules.server.FileSystemModule;
+import org.apache.james.modules.server.JMXServerModule;
import org.apache.james.modules.server.QuotaModule;
import com.google.inject.Module;
@@ -60,7 +61,9 @@ public class CassandraJamesServerMain {
new FileSystemModule());
public static void main(String[] args) throws Exception {
- CassandraJamesServer server = new CassandraJamesServer(defaultModule);
+ CassandraJamesServer server = new CassandraJamesServer(Modules.combine(
+ defaultModule,
+ new JMXServerModule()));
server.start();
}
Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServer.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServer.java?rev=1712336&view=auto
==============================================================================
--- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServer.java (added)
+++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServer.java Tue Nov 3 16:49:32 2015
@@ -0,0 +1,118 @@
+/****************************************************************
+ * 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.james.modules.server;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
+import org.apache.james.util.RestrictingRMISocketFactory;
+import org.apache.james.utils.PropertiesReader;
+
+import javax.annotation.PreDestroy;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXServiceURL;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.rmi.registry.LocateRegistry;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class JMXServer {
+
+ private final Set<String> registeredKeys;
+ private final Object lock;
+ private JMXConnectorServer jmxConnectorServer;
+ private boolean isStarted;
+
+ public JMXServer() {
+ isStarted = false;
+ registeredKeys = new HashSet<>();
+ lock = new Object();
+ }
+
+ public void start() {
+ synchronized (lock) {
+ if (isStarted) {
+ return;
+ }
+ isStarted = true;
+ doStart();
+ }
+ }
+
+ @PreDestroy
+ public void stop() {
+ synchronized (lock) {
+ if (!isStarted) {
+ return;
+ }
+ isStarted = false;
+ doStop();
+ }
+ }
+
+ public void register(String key, Object remote) throws Exception {
+ ManagementFactory.getPlatformMBeanServer().registerMBean(remote, new ObjectName(key));
+ synchronized (lock) {
+ registeredKeys.add(key);
+ }
+ }
+
+ private void doStart() {
+ PropertiesReader propertiesReader = new PropertiesReader("jmx.properties");
+ String address = propertiesReader.getProperty("jmx.address");
+ int port = Integer.parseInt(propertiesReader.getProperty("jmx.port"));
+ String serviceURL = "service:jmx:rmi://" + address + "/jndi/rmi://" + address+ ":" + port +"/jmxrmi";
+ try {
+ RestrictingRMISocketFactory restrictingRMISocketFactory = new RestrictingRMISocketFactory(address);
+ LocateRegistry.createRegistry(port, restrictingRMISocketFactory, restrictingRMISocketFactory);
+
+ Map<String, ?> environment = ImmutableMap.of();
+ jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(serviceURL),
+ environment,
+ ManagementFactory.getPlatformMBeanServer());
+
+ jmxConnectorServer.start();
+ } catch (Exception e) {
+ throw Throwables.propagate(e);
+ }
+ }
+
+ private void doStop() {
+ try {
+ MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+ registeredKeys.forEach(key -> {
+ try {
+ mBeanServer.unregisterMBean(new ObjectName(key));
+ } catch (Exception e) {
+ throw Throwables.propagate(e);
+ }
+ });
+ registeredKeys.clear();
+ jmxConnectorServer.stop();
+ } catch (IOException e) {
+ throw Throwables.propagate(e);
+ }
+ }
+
+}
Added: james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServerModule.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServerModule.java?rev=1712336&view=auto
==============================================================================
--- james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServerModule.java (added)
+++ james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/modules/server/JMXServerModule.java Tue Nov 3 16:49:32 2015
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.james.modules.server;
+
+import org.apache.james.adapter.mailbox.MailboxCopierManagement;
+import org.apache.james.adapter.mailbox.MailboxCopierManagementMBean;
+import org.apache.james.adapter.mailbox.MailboxManagerManagement;
+import org.apache.james.adapter.mailbox.MailboxManagerManagementMBean;
+import org.apache.james.adapter.mailbox.MailboxManagerResolver;
+import org.apache.james.domainlist.api.DomainListManagementMBean;
+import org.apache.james.domainlist.lib.DomainListManagement;
+import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
+import org.apache.james.mailbox.copier.MailboxCopier;
+import org.apache.james.mailbox.copier.MailboxCopierImpl;
+import org.apache.james.mailetcontainer.api.jmx.MailSpoolerMBean;
+import org.apache.james.mailetcontainer.impl.JamesMailSpooler;
+import org.apache.james.rrt.api.RecipientRewriteTableManagementMBean;
+import org.apache.james.rrt.lib.RecipientRewriteTableManagement;
+import org.apache.james.user.api.UsersRepositoryManagementMBean;
+import org.apache.james.user.lib.UsersRepositoryManagement;
+import org.apache.james.utils.ConfigurationPerformer;
+import org.apache.james.utils.GuiceMailboxManagerResolver;
+import org.apache.james.utils.MailboxManagerDefinition;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+
+public class JMXServerModule extends AbstractModule {
+
+ private static final String JMX_COMPONENT_DOMAINLIST = "org.apache.james:type=component,name=domainlist";
+ private static final String JMX_COMPONENT_USERS_REPOSITORY = "org.apache.james:type=component,name=usersrepository";
+ private static final String JMX_COMPONENT_RECIPIENTREWRITETABLE = "org.apache.james:type=component,name=recipientrewritetable";
+ private static final String JMX_COMPONENT_NAME_MAILBOXMANAGERBEAN = "org.apache.james:type=component,name=mailboxmanagerbean";
+ private static final String JMX_COMPONENT_MAILBOXCOPIER = "org.apache.james:type=component,name=mailboxcopier";
+
+ @Override
+ protected void configure() {
+ bind(MailboxCopier.class).annotatedWith(Names.named("mailboxcopier")).to(MailboxCopierImpl.class);
+ bind(MailboxCopierManagementMBean.class).to(MailboxCopierManagement.class);
+ bind(MailboxManagerResolver.class).to(GuiceMailboxManagerResolver.class);
+ bind(DomainListManagementMBean.class).to(DomainListManagement.class);
+ bind(UsersRepositoryManagementMBean.class).to(UsersRepositoryManagement.class);
+ bind(MailboxManagerManagementMBean.class).to(MailboxManagerManagement.class);
+ bind(RecipientRewriteTableManagementMBean.class).to(RecipientRewriteTableManagement.class);
+ bind(MailSpoolerMBean.class).to(JamesMailSpooler.class);
+ Multibinder.newSetBinder(binder(), ConfigurationPerformer.class).addBinding().to(JMXModuleConfigurationPerformer.class);
+ Multibinder.newSetBinder(binder(), MailboxManagerDefinition.class).addBinding().to(CassandraMailboxManagerDefinition.class);
+ }
+
+ @Singleton
+ private static class CassandraMailboxManagerDefinition extends MailboxManagerDefinition {
+ @Inject
+ private CassandraMailboxManagerDefinition(CassandraMailboxManager manager) {
+ super("cassandra-mailboxmanager", manager);
+ }
+ }
+
+ @Singleton
+ public static class JMXModuleConfigurationPerformer implements ConfigurationPerformer {
+
+ private final JMXServer jmxServer;
+ private final DomainListManagementMBean domainListManagementMBean;
+ private final UsersRepositoryManagementMBean usersRepositoryManagementMBean;
+ private final RecipientRewriteTableManagementMBean recipientRewriteTableManagementMBean;
+ private final MailboxManagerManagementMBean mailboxManagerManagementMBean;
+ private final MailboxCopierManagementMBean mailboxCopierManagementMBean;
+
+ @Inject
+ public JMXModuleConfigurationPerformer(JMXServer jmxServer,
+ DomainListManagementMBean domainListManagementMBean,
+ UsersRepositoryManagementMBean usersRepositoryManagementMBean,
+ RecipientRewriteTableManagementMBean recipientRewriteTableManagementMBean,
+ MailboxManagerManagementMBean mailboxManagerManagementMBean,
+ MailboxCopierManagementMBean mailboxCopierManagementMBean) {
+ this.jmxServer = jmxServer;
+ this.domainListManagementMBean = domainListManagementMBean;
+ this.usersRepositoryManagementMBean = usersRepositoryManagementMBean;
+ this.recipientRewriteTableManagementMBean = recipientRewriteTableManagementMBean;
+ this.mailboxManagerManagementMBean = mailboxManagerManagementMBean;
+ this.mailboxCopierManagementMBean = mailboxCopierManagementMBean;
+ }
+
+ @Override
+ public void initModule() throws Exception {
+ jmxServer.start();
+ jmxServer.register(JMX_COMPONENT_DOMAINLIST, domainListManagementMBean);
+ jmxServer.register(JMX_COMPONENT_USERS_REPOSITORY, usersRepositoryManagementMBean);
+ jmxServer.register(JMX_COMPONENT_RECIPIENTREWRITETABLE, recipientRewriteTableManagementMBean);
+ jmxServer.register(JMX_COMPONENT_NAME_MAILBOXMANAGERBEAN, mailboxManagerManagementMBean);
+ jmxServer.register(JMX_COMPONENT_MAILBOXCOPIER, mailboxCopierManagementMBean);
+ }
+ }
+
+}
Added: james/project/trunk/server/container/cassandra-guice/src/test/resources/jmx.properties
URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/resources/jmx.properties?rev=1712336&view=auto
==============================================================================
--- james/project/trunk/server/container/cassandra-guice/src/test/resources/jmx.properties (added)
+++ james/project/trunk/server/container/cassandra-guice/src/test/resources/jmx.properties Tue Nov 3 16:49:32 2015
@@ -0,0 +1,28 @@
+# 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.
+#
+
+# This template file can be used as example for James Server configuration
+# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS
+
+# This template file can be used as example for James Server configuration
+# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS
+
+# See http://james.apache.org/server/3/config.html for usage
+
+jmx.address=127.0.0.1
+jmx.port=9999
Modified: james/project/trunk/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxServerProbe.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxServerProbe.java?rev=1712336&r1=1712335&r2=1712336&view=diff
==============================================================================
--- james/project/trunk/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxServerProbe.java (original)
+++ james/project/trunk/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxServerProbe.java Tue Nov 3 16:49:32 2015
@@ -44,12 +44,12 @@ import org.apache.james.user.api.UsersRe
public class JmxServerProbe implements ServerProbe {
// TODO: Move this to somewhere else
- private final static String DOMAINLIST_OBJECT_NAME = "org.apache.james:type=component,name=domainlist";
- private final static String VIRTUALUSERTABLE_OBJECT_NAME = "org.apache.james:type=component,name=recipientrewritetable";
- private final static String USERSREPOSITORY_OBJECT_NAME = "org.apache.james:type=component,name=usersrepository";
- private final static String MAILBOXCOPIER_OBJECT_NAME = "org.apache.james:type=component,name=mailboxcopier";
- private final static String MAILBOXMANAGER_OBJECT_NAME = "org.apache.james:type=component,name=mailboxmanagerbean";
- private final static String QUOTAMANAGER_OBJECT_NAME = "org.apache.james:type=component,name=quotamanagerbean";
+ public final static String DOMAINLIST_OBJECT_NAME = "org.apache.james:type=component,name=domainlist";
+ public final static String VIRTUALUSERTABLE_OBJECT_NAME = "org.apache.james:type=component,name=recipientrewritetable";
+ public final static String USERSREPOSITORY_OBJECT_NAME = "org.apache.james:type=component,name=usersrepository";
+ public final static String MAILBOXCOPIER_OBJECT_NAME = "org.apache.james:type=component,name=mailboxcopier";
+ public final static String MAILBOXMANAGER_OBJECT_NAME = "org.apache.james:type=component,name=mailboxmanagerbean";
+ public final static String QUOTAMANAGER_OBJECT_NAME = "org.apache.james:type=component,name=quotamanagerbean";
private JMXConnector jmxc;
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org