Repository: activemq Updated Branches: refs/heads/activemq-5.15.x 29fbeb511 -> 3a345649a
[AMQ-7063] Be able to configure ActiveMQ http transport connector by providing a jetty.xml Project: http://git-wip-us.apache.org/repos/asf/activemq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/3a345649 Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/3a345649 Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/3a345649 Branch: refs/heads/activemq-5.15.x Commit: 3a345649ae762e8228caf0b0f3a101e7c300f81a Parents: 29fbeb5 Author: Jean-Baptiste Onofré <[email protected]> Authored: Thu Oct 11 09:18:32 2018 +0200 Committer: Jean-Baptiste Onofré <[email protected]> Committed: Thu Oct 11 16:01:16 2018 +0200 ---------------------------------------------------------------------- .../transport/WebTransportServerSupport.java | 67 +++++++++++++++++--- .../transport/http/HttpTransportFactory.java | 2 + .../http/HttpJettyConfigurationTest.java | 49 ++++++++++++++ activemq-http/src/test/resources/jetty.xml | 22 +++++++ 4 files changed, 132 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq/blob/3a345649/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java index 7f2ce7e..eba63ab 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/WebTransportServerSupport.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.transport; +import java.io.File; import java.net.InetAddress; import java.net.URI; import java.util.Map; @@ -27,15 +28,21 @@ import org.eclipse.jetty.security.ConstraintSecurityHandler; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.security.Constraint; +import org.eclipse.jetty.xml.XmlConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; abstract public class WebTransportServerSupport extends TransportServerSupport { + private final static Logger LOG = LoggerFactory.getLogger(WebTransportServerSupport.class); + protected URI bindAddress; protected Server server; protected Connector connector; protected SocketConnectorFactory socketConnectorFactory; protected String host; protected final HttpOptions httpOptions = new HttpOptions(); + protected final JettyOptions jettyOptions = new JettyOptions(); public WebTransportServerSupport(URI location) { super(location); @@ -46,7 +53,22 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { } protected void createServer() { - server = new Server(); + LOG.info("Starting Jetty server"); + if (jettyOptions.getConfig() != null) { + try { + LOG.info("Configuring Jetty server using {}", jettyOptions.getConfig()); + File file = new File(jettyOptions.getConfig()); + if (!file.exists()) { + throw new IllegalArgumentException("Jetty XML not found: " + file.getAbsolutePath()); + } + XmlConfiguration xmlConfiguration = new XmlConfiguration(file.toURI().toURL()); + server = (Server) xmlConfiguration.configure(); + } catch (Throwable t) { + throw new IllegalStateException("Jetty configuration can't be loaded", t); + } + } else { + server = new Server(); + } try { server.getClass().getMethod("setStopTimeout", Long.TYPE).invoke(server, 500l); } catch (Throwable t) { @@ -55,21 +77,31 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { } public URI bind() throws Exception { - URI bind = getBindLocation(); - String bindHost = bind.getHost(); bindHost = (bindHost == null || bindHost.length() == 0) ? "localhost" : bindHost; InetAddress addr = InetAddress.getByName(bindHost); host = addr.getCanonicalHostName(); - - setConnectorProperty("Host", String.class, host); - setConnectorProperty("Port", Integer.TYPE, bindAddress.getPort()); - server.addConnector(connector); + if (server.getConnectors().length == 0) { + LOG.info("Creating Jetty connector"); + setConnectorProperty("Host", String.class, host); + setConnectorProperty("Port", Integer.TYPE, bindAddress.getPort()); + server.addConnector(connector); + } else { + LOG.info("Using Jetty configured connector"); + connector = server.getConnectors()[0]; + for (Connector c : server.getConnectors()) { + if (c.getName() != null && c.getName().equalsIgnoreCase("activemq")) { + connector = c; + } + } + setConnectorProperty("Host", String.class, host); + setConnectorProperty("Port", Integer.TYPE, bindAddress.getPort()); + server.addConnector(connector); + } if (addr.isAnyLocalAddress()) { host = InetAddressUtil.getLocalHostName(); } - URI boundUri = new URI(bind.getScheme(), bind.getUserInfo(), host, bindAddress.getPort(), bind.getPath(), bind.getQuery(), bind.getFragment()); setConnectURI(boundUri); return boundUri; @@ -94,6 +126,12 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { } } + public void setJettyOptions(Map<String, Object> options) { + if (options != null) { + IntrospectionSupport.setProperties(this.jettyOptions, options); + } + } + protected static class HttpOptions { private boolean enableTrace = false; @@ -105,4 +143,17 @@ abstract public class WebTransportServerSupport extends TransportServerSupport { this.enableTrace = enableTrace; } } + + protected static class JettyOptions { + private String config; + + public String getConfig() { + return config; + } + + public void setConfig(String config) { + this.config = config; + } + } + } http://git-wip-us.apache.org/repos/asf/activemq/blob/3a345649/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportFactory.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportFactory.java b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportFactory.java index 8332a95..02ecf77 100644 --- a/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportFactory.java +++ b/activemq-http/src/main/java/org/apache/activemq/transport/http/HttpTransportFactory.java @@ -45,8 +45,10 @@ public class HttpTransportFactory extends TransportFactory { try { Map<String, String> options = new HashMap<String, String>(URISupport.parseParameters(location)); HttpTransportServer result = new HttpTransportServer(location, this); + Map<String, Object> jettyOptions = IntrospectionSupport.extractProperties(options, "jetty."); Map<String, Object> httpOptions = IntrospectionSupport.extractProperties(options, "http."); Map<String, Object> transportOptions = IntrospectionSupport.extractProperties(options, "transport."); + result.setJettyOptions(jettyOptions); result.setTransportOption(transportOptions); result.setHttpOptions(httpOptions); return result; http://git-wip-us.apache.org/repos/asf/activemq/blob/3a345649/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpJettyConfigurationTest.java ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpJettyConfigurationTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpJettyConfigurationTest.java new file mode 100644 index 0000000..363dd4e --- /dev/null +++ b/activemq-http/src/test/java/org/apache/activemq/transport/http/HttpJettyConfigurationTest.java @@ -0,0 +1,49 @@ +/** + * 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.activemq.transport.http; + +import org.apache.activemq.broker.BrokerService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class HttpJettyConfigurationTest { + + private BrokerService brokerService; + + @Before + public void setUp() throws Exception { + brokerService = new BrokerService(); + brokerService.setPersistent(false); + brokerService.setUseJmx(false); + brokerService.deleteAllMessages(); + brokerService.addConnector("http://0.0.0.0:0?jetty.config=src/test/resources/jetty.xml"); + brokerService.start(); + } + + @After + public void tearDown() throws Exception { + brokerService.stop(); + } + + @Test + public void test() throws Exception { + // nothing to do + } + +} http://git-wip-us.apache.org/repos/asf/activemq/blob/3a345649/activemq-http/src/test/resources/jetty.xml ---------------------------------------------------------------------- diff --git a/activemq-http/src/test/resources/jetty.xml b/activemq-http/src/test/resources/jetty.xml new file mode 100644 index 0000000..e6764fd --- /dev/null +++ b/activemq-http/src/test/resources/jetty.xml @@ -0,0 +1,22 @@ +<?xml version="1.0"?> +<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> +<Configure id="server" class="org.eclipse.jetty.server.Server"> + + <Arg> + <New class="org.eclipse.jetty.util.thread.QueuedThreadPool"> + <Set name="minThreads">10</Set> + <Set name="maxThreads">1000</Set> + </New> + </Arg> + + <Call name="addConnector"> + <Arg> + <New id="activemq" class="org.eclipse.jetty.server.ServerConnector"> + <Arg name="server"><Ref refid="server"/></Arg> + <Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" default="-1"/></Arg> + <Arg name="selectors" type="int"><Property name="jetty.http.selectors" default="-1"/></Arg> + </New> + </Arg> + </Call> + +</Configure> \ No newline at end of file
