mirror of https://github.com/apache/activemq.git
fix for AMQ-1724
git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@656319 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2e137fb125
commit
139a220ee7
|
@ -21,6 +21,8 @@ import java.io.IOException;
|
|||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
|
@ -34,6 +36,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||
import javax.management.MBeanServer;
|
||||
import javax.management.MalformedObjectNameException;
|
||||
import javax.management.ObjectName;
|
||||
import javax.net.ssl.KeyManager;
|
||||
import javax.net.ssl.TrustManager;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionMetaData;
|
||||
import org.apache.activemq.Service;
|
||||
|
@ -79,6 +83,7 @@ import org.apache.activemq.store.memory.MemoryPersistenceAdapter;
|
|||
import org.apache.activemq.thread.TaskRunnerFactory;
|
||||
import org.apache.activemq.transport.TransportFactory;
|
||||
import org.apache.activemq.transport.TransportServer;
|
||||
import org.apache.activemq.transport.tcp.SslTransportFactory;
|
||||
import org.apache.activemq.transport.vm.VMTransportFactory;
|
||||
import org.apache.activemq.usage.SystemUsage;
|
||||
import org.apache.activemq.util.IOExceptionSupport;
|
||||
|
@ -173,6 +178,7 @@ public class BrokerService implements Service {
|
|||
private List<Runnable> shutdownHooks= new ArrayList<Runnable>();
|
||||
private boolean systemExitOnShutdown;
|
||||
private int systemExitOnShutdownExitCode;
|
||||
private SslContext sslContext = new SslContext();
|
||||
|
||||
static {
|
||||
String localHostName = "localhost";
|
||||
|
@ -1953,4 +1959,20 @@ public class BrokerService implements Service {
|
|||
this.systemExitOnShutdown = systemExitOnShutdown;
|
||||
}
|
||||
|
||||
public int getSystemExitOnShutdownExitCode() {
|
||||
return systemExitOnShutdownExitCode;
|
||||
}
|
||||
|
||||
public void setSystemExitOnShutdownExitCode(int systemExitOnShutdownExitCode) {
|
||||
this.systemExitOnShutdownExitCode = systemExitOnShutdownExitCode;
|
||||
}
|
||||
|
||||
public SslContext getSslContext() {
|
||||
return sslContext;
|
||||
}
|
||||
|
||||
public void setSslContext(SslContext sslContext) {
|
||||
this.sslContext = sslContext;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* 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.broker;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.net.ssl.KeyManager;
|
||||
import javax.net.ssl.TrustManager;
|
||||
|
||||
/**
|
||||
* A holder of SSL configuration.
|
||||
*/
|
||||
public class SslContext {
|
||||
|
||||
protected List<KeyManager> keyManagers = new ArrayList<KeyManager>();
|
||||
protected List<TrustManager> trustManagers = new ArrayList<TrustManager>();
|
||||
protected SecureRandom secureRandom;
|
||||
|
||||
public KeyManager[] getKeyManagersAsArray() {
|
||||
KeyManager rc[] = new KeyManager[keyManagers.size()];
|
||||
return keyManagers.toArray(rc);
|
||||
}
|
||||
public TrustManager[] getTrustManagersAsArray() {
|
||||
TrustManager rc[] = new TrustManager[trustManagers.size()];
|
||||
return trustManagers.toArray(rc);
|
||||
}
|
||||
|
||||
public void addKeyManager(KeyManager km) {
|
||||
keyManagers.add(km);
|
||||
}
|
||||
public boolean removeKeyManager(KeyManager km) {
|
||||
return keyManagers.remove(km);
|
||||
}
|
||||
public void addTrustManager(TrustManager tm) {
|
||||
trustManagers.add(tm);
|
||||
}
|
||||
public boolean removeTrustManager(TrustManager tm) {
|
||||
return trustManagers.remove(tm);
|
||||
}
|
||||
|
||||
public List<KeyManager> getKeyManagers() {
|
||||
return keyManagers;
|
||||
}
|
||||
public void setKeyManagers(List<KeyManager> keyManagers) {
|
||||
this.keyManagers = keyManagers;
|
||||
}
|
||||
public List<TrustManager> getTrustManagers() {
|
||||
return trustManagers;
|
||||
}
|
||||
public void setTrustManagers(List<TrustManager> trustManagers) {
|
||||
this.trustManagers = trustManagers;
|
||||
}
|
||||
public SecureRandom getSecureRandom() {
|
||||
return secureRandom;
|
||||
}
|
||||
public void setSecureRandom(SecureRandom secureRandom) {
|
||||
this.secureRandom = secureRandom;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,194 @@
|
|||
/**
|
||||
* 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.spring;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.security.KeyStore;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.net.ssl.KeyManager;
|
||||
import javax.net.ssl.KeyManagerFactory;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
|
||||
import org.apache.activemq.broker.SslContext;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.core.io.Resource;
|
||||
|
||||
/**
|
||||
* Extends the SslContext so that it's easier to configure from spring.
|
||||
*
|
||||
* @org.apache.xbean.XBean element="sslContext"
|
||||
*
|
||||
* @version $Revision$
|
||||
*/
|
||||
public class SpringSslContext extends SslContext implements InitializingBean {
|
||||
|
||||
private String keyStoreType="jks";
|
||||
private String trustStoreType="jks";
|
||||
|
||||
private String secureRandomAlgorithm="SHA1PRNG";
|
||||
private String keyStoreAlgorithm=KeyManagerFactory.getDefaultAlgorithm();
|
||||
private String trustStoreAlgorithm=TrustManagerFactory.getDefaultAlgorithm();
|
||||
|
||||
private Resource keyStore;
|
||||
private Resource trustStore;
|
||||
|
||||
private String keyStorePassword;
|
||||
private String trustStorePassword;
|
||||
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
keyManagers.addAll(createKeyManagers());
|
||||
trustManagers.addAll(createTrustManagers());
|
||||
if( secureRandom == null ) {
|
||||
secureRandom = createSecureRandom();
|
||||
}
|
||||
}
|
||||
|
||||
private SecureRandom createSecureRandom() throws NoSuchAlgorithmException {
|
||||
return SecureRandom.getInstance(secureRandomAlgorithm);
|
||||
}
|
||||
|
||||
private Collection<TrustManager> createTrustManagers() throws Exception {
|
||||
KeyStore ks = createTrustManagerKeyStore();
|
||||
if( ks ==null ) {
|
||||
return new ArrayList<TrustManager>(0);
|
||||
}
|
||||
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(trustStoreAlgorithm);
|
||||
tmf.init(ks);
|
||||
return Arrays.asList(tmf.getTrustManagers());
|
||||
}
|
||||
|
||||
private Collection<KeyManager> createKeyManagers() throws Exception {
|
||||
KeyStore ks = createKeyManagerKeyStore();
|
||||
if( ks ==null ) {
|
||||
return new ArrayList<KeyManager>(0);
|
||||
}
|
||||
|
||||
KeyManagerFactory tmf = KeyManagerFactory.getInstance(keyStoreAlgorithm);
|
||||
tmf.init(ks, keyStorePassword==null? null : keyStorePassword.toCharArray());
|
||||
return Arrays.asList(tmf.getKeyManagers());
|
||||
}
|
||||
|
||||
private KeyStore createTrustManagerKeyStore() throws Exception {
|
||||
if( trustStore ==null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
KeyStore ks = KeyStore.getInstance(trustStoreType);
|
||||
InputStream is=trustStore.getInputStream();
|
||||
try {
|
||||
ks.load(is, trustStorePassword==null? null : trustStorePassword.toCharArray());
|
||||
} finally {
|
||||
is.close();
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
private KeyStore createKeyManagerKeyStore() throws Exception {
|
||||
if( keyStore ==null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
KeyStore ks = KeyStore.getInstance(keyStoreType);
|
||||
InputStream is=keyStore.getInputStream();
|
||||
try {
|
||||
ks.load(is, keyStorePassword==null? null : keyStorePassword.toCharArray());
|
||||
} finally {
|
||||
is.close();
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
public String getTrustStoreType() {
|
||||
return trustStoreType;
|
||||
}
|
||||
|
||||
public String getKeyStoreType() {
|
||||
return keyStoreType;
|
||||
}
|
||||
|
||||
public Resource getKeyStore() {
|
||||
return keyStore;
|
||||
}
|
||||
|
||||
public void setKeyStore(Resource keyResource) {
|
||||
this.keyStore = keyResource;
|
||||
}
|
||||
|
||||
public Resource getTrustStore() {
|
||||
return trustStore;
|
||||
}
|
||||
|
||||
public void setTrustStore(Resource trustResource) {
|
||||
this.trustStore = trustResource;
|
||||
}
|
||||
|
||||
public String getKeyStoreAlgorithm() {
|
||||
return keyStoreAlgorithm;
|
||||
}
|
||||
|
||||
public void setKeyStoreAlgorithm(String keyAlgorithm) {
|
||||
this.keyStoreAlgorithm = keyAlgorithm;
|
||||
}
|
||||
|
||||
public String getTrustStoreAlgorithm() {
|
||||
return trustStoreAlgorithm;
|
||||
}
|
||||
|
||||
public void setTrustStoreAlgorithm(String trustAlgorithm) {
|
||||
this.trustStoreAlgorithm = trustAlgorithm;
|
||||
}
|
||||
|
||||
public String getKeyStorePassword() {
|
||||
return keyStorePassword;
|
||||
}
|
||||
|
||||
public void setKeyStorePassword(String keyPassword) {
|
||||
this.keyStorePassword = keyPassword;
|
||||
}
|
||||
|
||||
public String getTrustStorePassword() {
|
||||
return trustStorePassword;
|
||||
}
|
||||
|
||||
public void setTrustStorePassword(String trustPassword) {
|
||||
this.trustStorePassword = trustPassword;
|
||||
}
|
||||
|
||||
public void setKeyStoreType(String keyType) {
|
||||
this.keyStoreType = keyType;
|
||||
}
|
||||
|
||||
public void setTrustStoreType(String trustType) {
|
||||
this.trustStoreType = trustType;
|
||||
}
|
||||
|
||||
public String getSecureRandomAlgorithm() {
|
||||
return secureRandomAlgorithm;
|
||||
}
|
||||
|
||||
public void setSecureRandomAlgorithm(String secureRandomAlgorithm) {
|
||||
this.secureRandomAlgorithm = secureRandomAlgorithm;
|
||||
}
|
||||
|
||||
}
|
|
@ -34,6 +34,9 @@ import javax.net.ssl.SSLServerSocketFactory;
|
|||
import javax.net.ssl.SSLSocketFactory;
|
||||
import javax.net.ssl.TrustManager;
|
||||
|
||||
import org.apache.activemq.broker.BrokerService;
|
||||
import org.apache.activemq.broker.BrokerServiceAware;
|
||||
import org.apache.activemq.broker.SslContext;
|
||||
import org.apache.activemq.openwire.OpenWireFormat;
|
||||
import org.apache.activemq.transport.InactivityMonitor;
|
||||
import org.apache.activemq.transport.Transport;
|
||||
|
@ -57,7 +60,7 @@ import org.apache.commons.logging.LogFactory;
|
|||
* @author David Martin Clavo david(dot)martin(dot)clavo(at)gmail.com (logging improvement modifications)
|
||||
* @version $Revision$
|
||||
*/
|
||||
public class SslTransportFactory extends TcpTransportFactory {
|
||||
public class SslTransportFactory extends TcpTransportFactory implements BrokerServiceAware {
|
||||
// The log this uses.,
|
||||
private static final Log LOG = LogFactory.getLog(SslTransportFactory.class);
|
||||
|
||||
|
@ -163,6 +166,17 @@ public class SslTransportFactory extends TcpTransportFactory {
|
|||
sslContext.init(km, tm, random);
|
||||
}
|
||||
|
||||
public void setBrokerService(BrokerService brokerService) {
|
||||
SslContext c = brokerService.getSslContext();
|
||||
if( sslContext == null && c!=null ) {
|
||||
try {
|
||||
setKeyAndTrustManagers(c.getKeyManagersAsArray(), c.getTrustManagersAsArray(), c.getSecureRandom());
|
||||
} catch (KeyManagementException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new SSL ServerSocketFactory. The given factory will use
|
||||
* user-provided key and trust managers (if the user provided them).
|
||||
|
|
|
@ -210,6 +210,8 @@ simpleJmsMessageConvertor = org.apache.activemq.network.jms.SimpleJmsMessageConv
|
|||
|
||||
simpleMessageGroupMapFactory = org.apache.activemq.broker.region.group.SimpleMessageGroupMapFactory
|
||||
|
||||
sslContext = org.apache.activemq.spring.SpringSslContext
|
||||
|
||||
statements = org.apache.activemq.store.jdbc.Statements
|
||||
|
||||
storeCursor = org.apache.activemq.broker.region.policy.StorePendingQueueMessageStoragePolicy
|
||||
|
|
|
@ -650,6 +650,14 @@ other brokers in a federated network
|
|||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='sslContext' minOccurs='0' maxOccurs='1'>
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs='0' maxOccurs='1'>
|
||||
<xs:element ref='tns:sslContext'/>
|
||||
<xs:any namespace='##other'/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='systemUsage' minOccurs='0' maxOccurs='1'>
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs='0' maxOccurs='1'>
|
||||
|
@ -806,6 +814,7 @@ consume a given message
|
|||
<xs:attribute name='regionBroker' type='xs:string'/>
|
||||
<xs:attribute name='shutdownOnMasterFailure' type='xs:boolean'/>
|
||||
<xs:attribute name='splitSystemUsageForProducersConsumers' type='xs:boolean'/>
|
||||
<xs:attribute name='sslContext' type='xs:string'/>
|
||||
<xs:attribute name='start' type='xs:boolean'>
|
||||
<xs:annotation>
|
||||
<xs:documentation><![CDATA[
|
||||
|
@ -816,6 +825,8 @@ with JUnit tests you may wish to start and stop the broker explicitly yourself.
|
|||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name='supportFailOver' type='xs:boolean'/>
|
||||
<xs:attribute name='systemExitOnShutdown' type='xs:boolean'/>
|
||||
<xs:attribute name='systemExitOnShutdownExitCode' type='xs:integer'/>
|
||||
<xs:attribute name='systemUsage' type='xs:string'/>
|
||||
<xs:attribute name='taskRunnerFactory' type='xs:string'/>
|
||||
<xs:attribute name='taskRunnerPriority' type='xs:integer'/>
|
||||
|
@ -858,6 +869,7 @@ enabled.
|
|||
]]></xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name='useTempMirroredQueues' type='xs:boolean'/>
|
||||
<xs:attribute name='useVirtualTopics' type='xs:boolean'>
|
||||
<xs:annotation>
|
||||
<xs:documentation><![CDATA[
|
||||
|
@ -4602,6 +4614,48 @@ matches the message.
|
|||
</xs:element>
|
||||
|
||||
|
||||
<!-- element for type: org.apache.activemq.spring.SpringSslContext -->
|
||||
<xs:element name='sslContext'>
|
||||
<xs:annotation>
|
||||
<xs:documentation><![CDATA[
|
||||
Extends the SslContext so that it's easier to configure from spring.
|
||||
]]></xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name='keyManagers' minOccurs='0' maxOccurs='1'>
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs='0' maxOccurs='unbounded'><xs:any namespace='##other'/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='secureRandom' minOccurs='0' maxOccurs='1'>
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs='0' maxOccurs='1'><xs:any namespace='##other'/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='trustManagers' minOccurs='0' maxOccurs='1'>
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs='0' maxOccurs='unbounded'><xs:any namespace='##other'/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name='keyStore' type='xs:string'/>
|
||||
<xs:attribute name='keyStoreAlgorithm' type='xs:string'/>
|
||||
<xs:attribute name='keyStorePassword' type='xs:string'/>
|
||||
<xs:attribute name='keyStoreType' type='xs:string'/>
|
||||
<xs:attribute name='secureRandom' type='xs:string'/>
|
||||
<xs:attribute name='secureRandomAlgorithm' type='xs:string'/>
|
||||
<xs:attribute name='trustStore' type='xs:string'/>
|
||||
<xs:attribute name='trustStoreAlgorithm' type='xs:string'/>
|
||||
<xs:attribute name='trustStorePassword' type='xs:string'/>
|
||||
<xs:attribute name='trustStoreType' type='xs:string'/>
|
||||
<xs:attribute name='id' type='xs:ID'/>
|
||||
<xs:anyAttribute namespace='##other' processContents='lax'/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
|
||||
<!-- element for type: org.apache.activemq.store.jdbc.Statements -->
|
||||
<xs:element name='statements'>
|
||||
<xs:complexType>
|
||||
|
@ -5132,6 +5186,11 @@ subscriptions.
|
|||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name='brokerService' minOccurs='0' maxOccurs='1'>
|
||||
<xs:annotation>
|
||||
<xs:documentation><![CDATA[
|
||||
This is called by the BrokerService right before it starts the transport.
|
||||
]]></xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:choice minOccurs='0' maxOccurs='1'>
|
||||
<xs:element ref='tns:broker'/>
|
||||
|
@ -5168,7 +5227,14 @@ consume a given message
|
|||
<xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name='brokerInfo' type='xs:string'/>
|
||||
<xs:attribute name='brokerService' type='xs:string'/>
|
||||
<xs:attribute name='brokerName' type='xs:string'/>
|
||||
<xs:attribute name='brokerService' type='xs:string'>
|
||||
<xs:annotation>
|
||||
<xs:documentation><![CDATA[
|
||||
This is called by the BrokerService right before it starts the transport.
|
||||
]]></xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name='connectUri' type='xs:string'/>
|
||||
<xs:attribute name='disableAsyncDispatch' type='xs:boolean'/>
|
||||
<xs:attribute name='discoveryAgent' type='xs:string'/>
|
||||
|
|
|
@ -221,6 +221,7 @@ matches the message.</td><td>org.apache.activemq.broker.region.policy.SimpleDisp
|
|||
<tr><td><a href='#simpleJmsMessageConvertor'>simpleJmsMessageConvertor</a></td><td>Converts Message from one JMS to another</td><td>org.apache.activemq.network.jms.SimpleJmsMessageConvertor</td></tr>
|
||||
<tr><td><a href='#simpleMessageGroupMapFactory'>simpleMessageGroupMapFactory</a></td><td>A factory to create instances of {@link SimpleMessageGroupMap} when implementing the
|
||||
<a href="http://activemq.apache.org/message-groups.html">Message Groups</a> functionality.</td><td>org.apache.activemq.broker.region.group.SimpleMessageGroupMapFactory</td></tr>
|
||||
<tr><td><a href='#sslContext'>sslContext</a></td><td>Extends the SslContext so that it's easier to configure from spring.</td><td>org.apache.activemq.spring.SpringSslContext</td></tr>
|
||||
<tr><td><a href='#statements'>statements</a></td><td></td><td>org.apache.activemq.store.jdbc.Statements</td></tr>
|
||||
<tr><td><a href='#storeCursor'>storeCursor</a></td><td>Pending messages</td><td>org.apache.activemq.broker.region.policy.StorePendingQueueMessageStoragePolicy</td></tr>
|
||||
<tr><td><a href='#storeDurableSubscriberCursor'>storeDurableSubscriberCursor</a></td><td>Pending messages for a durable</td><td>org.apache.activemq.broker.region.policy.StorePendingDurableSubscriberMessageStoragePolicy</td></tr>
|
||||
|
@ -414,6 +415,7 @@ useful for testing.</td></tr>
|
|||
Normally you would want the broker to start up along with the ApplicationContext but sometimes when working
|
||||
with JUnit tests you may wish to start and stop the broker explicitly yourself.</td></tr>
|
||||
<tr><td>supportFailOver</td><td>xs:boolean</td><td></td></tr>
|
||||
<tr><td>systemExitOnShutdown</td><td>xs:boolean</td><td></td></tr>
|
||||
<tr><td>taskRunnerPriority</td><td>xs:integer</td><td></td></tr>
|
||||
<tr><td>timeBeforePurgeTempDestinations</td><td>xs:integer</td><td></td></tr>
|
||||
<tr><td>tmpDataDirectory</td><td>xs:string</td><td></td></tr>
|
||||
|
@ -429,6 +431,7 @@ explicitly configured.</td></tr>
|
|||
<tr><td>useShutdownHook</td><td>xs:boolean</td><td>Sets whether or not we should use a shutdown handler to close down the
|
||||
broker cleanly if the JVM is terminated. It is recommended you leave this
|
||||
enabled.</td></tr>
|
||||
<tr><td>useTempMirroredQueues</td><td>xs:boolean</td><td></td></tr>
|
||||
<tr><td>useVirtualTopics</td><td>xs:boolean</td><td>Sets whether or not <a
|
||||
href="http://activemq.apache.org/virtual-destinations.html">Virtual
|
||||
Topics</a> should be supported by default if they have not been
|
||||
|
@ -465,6 +468,7 @@ other brokers in a federated network</td></tr>
|
|||
<tr><td>regionBroker</td><td><a href='#loggingBrokerPlugin'>loggingBrokerPlugin</a> | <a href='#multicastTraceBrokerPlugin'>multicastTraceBrokerPlugin</a> | <a href='#timeStampingBrokerPlugin'>timeStampingBrokerPlugin</a> | <a href='#udpTraceBrokerPlugin'>udpTraceBrokerPlugin</a></td><td></td></tr>
|
||||
<tr><td>services</td><td>(<a href='#broker'>broker</a> | <a href='#commandAgent'>commandAgent</a> | <a href='#forwardingBridge'>forwardingBridge</a> | <a href='#inboundQueueBridge'>inboundQueueBridge</a> | <a href='#inboundTopicBridge'>inboundTopicBridge</a> | <a href='#jmsQueueConnector'>jmsQueueConnector</a> | <a href='#jmsTopicConnector'>jmsTopicConnector</a> | <a href='#ldapNetworkConnector'>ldapNetworkConnector</a> | <a href='#managementContext'>managementContext</a> | <a href='#masterConnector'>masterConnector</a> | <a href='#memoryUsage'>memoryUsage</a> | <a href='#multicastNetworkConnector'>multicastNetworkConnector</a> | <a href='#networkConnector'>networkConnector</a> | <a href='#outboundQueueBridge'>outboundQueueBridge</a> | <a href='#outboundTopicBridge'>outboundTopicBridge</a> | <a href='#proxyConnector'>proxyConnector</a> | <a href='#storeUsage'>storeUsage</a> | <a href='#systemUsage'>systemUsage</a> | <a href='#tempUsage'>tempUsage</a>)*</td><td>Sets the services associated with this broker such as a
|
||||
{@link MasterConnector}</td></tr>
|
||||
<tr><td>sslContext</td><td><a href='#sslContext'>sslContext</a></td><td></td></tr>
|
||||
<tr><td>systemUsage</td><td><a href='#systemUsage'>systemUsage</a></td><td></td></tr>
|
||||
<tr><td>taskRunnerFactory</td><td><spring:bean/></td><td></td></tr>
|
||||
<tr><td>tempDataStore</td><td><spring:bean/></td><td></td></tr>
|
||||
|
@ -1425,6 +1429,25 @@ Set of groups</td></tr>
|
|||
<tr><td>connection</td><td><spring:bean/></td><td></td></tr>
|
||||
</table>
|
||||
<h2>Element: <a name='simpleMessageGroupMapFactory'>simpleMessageGroupMapFactory</a></h2>
|
||||
<h2>Element: <a name='sslContext'>sslContext</a></h2>
|
||||
<table>
|
||||
<tr><th>Attribute</th><th>Type</th><th>Description</th>
|
||||
<tr><td>keyStore</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>keyStoreAlgorithm</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>keyStorePassword</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>keyStoreType</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>secureRandomAlgorithm</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>trustStore</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>trustStoreAlgorithm</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>trustStorePassword</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>trustStoreType</td><td>xs:string</td><td></td></tr>
|
||||
</table>
|
||||
<table>
|
||||
<tr><th>Element</th><th>Type</th><th>Description</th>
|
||||
<tr><td>keyManagers</td><td>(<spring:bean/>)*</td><td></td></tr>
|
||||
<tr><td>secureRandom</td><td><spring:bean/></td><td></td></tr>
|
||||
<tr><td>trustManagers</td><td>(<spring:bean/>)*</td><td></td></tr>
|
||||
</table>
|
||||
<h2>Element: <a name='statements'>statements</a></h2>
|
||||
<table>
|
||||
<tr><th>Attribute</th><th>Type</th><th>Description</th>
|
||||
|
@ -1585,6 +1608,7 @@ before a UsageListener event is fired by the manager.</td></tr>
|
|||
<h2>Element: <a name='transportConnector'>transportConnector</a></h2>
|
||||
<table>
|
||||
<tr><th>Attribute</th><th>Type</th><th>Description</th>
|
||||
<tr><td>brokerName</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>connectUri</td><td>xs:string</td><td></td></tr>
|
||||
<tr><td>disableAsyncDispatch</td><td>xs:boolean</td><td></td></tr>
|
||||
<tr><td>discoveryUri</td><td>xs:string</td><td></td></tr>
|
||||
|
@ -1598,7 +1622,7 @@ create a {@link TransportServer} instance</td></tr>
|
|||
<table>
|
||||
<tr><th>Element</th><th>Type</th><th>Description</th>
|
||||
<tr><td>brokerInfo</td><td><spring:bean/></td><td></td></tr>
|
||||
<tr><td>brokerService</td><td><a href='#broker'>broker</a></td><td></td></tr>
|
||||
<tr><td>brokerService</td><td><a href='#broker'>broker</a></td><td>This is called by the BrokerService right before it starts the transport.</td></tr>
|
||||
<tr><td>discoveryAgent</td><td><spring:bean/></td><td></td></tr>
|
||||
<tr><td>messageAuthorizationPolicy</td><td><spring:bean/></td><td>Sets the policy used to decide if the current connection is authorized to
|
||||
consume a given message</td></tr>
|
||||
|
|
|
@ -28,6 +28,10 @@ h4. The _[org.apache.activemq.broker.BrokerService|#org.apache.activemq.broker.B
|
|||
connectors, network connectors and a bunch of properties which can be used to
|
||||
configure the broker as its lazily created.{html} |
|
||||
|
||||
{anchor:org.apache.activemq.broker.SslContext-types}
|
||||
h4. The _[org.apache.activemq.broker.SslContext|#org.apache.activemq.broker.SslContext-types]_ Type Implementations
|
||||
| _[<sslContext>|#sslContext-element]_ | {html}Extends the SslContext so that it's easier to configure from spring.{html} |
|
||||
|
||||
{anchor:org.apache.activemq.usage.TempUsage-types}
|
||||
h4. The _[org.apache.activemq.usage.TempUsage|#org.apache.activemq.usage.TempUsage-types]_ Type Implementations
|
||||
| _[<tempUsage>|#tempUsage-element]_ | {html}Used to keep track of how much of something is being used so that a
|
||||
|
@ -666,10 +670,12 @@ other brokers in a federated network{html} |
|
|||
{@link MasterConnector}{html} |
|
||||
| shutdownOnMasterFailure | _boolean_ | {html}{html} |
|
||||
| splitSystemUsageForProducersConsumers | _boolean_ | {html}{html} |
|
||||
| sslContext | _[org.apache.activemq.broker.SslContext|#org.apache.activemq.broker.SslContext-types]_ | {html}{html} |
|
||||
| start | _boolean_ | {html}Sets whether or not the broker is started along with the ApplicationContext it is defined within.
|
||||
Normally you would want the broker to start up along with the ApplicationContext but sometimes when working
|
||||
with JUnit tests you may wish to start and stop the broker explicitly yourself.{html} |
|
||||
| supportFailOver | _boolean_ | {html}{html} |
|
||||
| systemExitOnShutdown | _boolean_ | {html}{html} |
|
||||
| systemUsage | _[org.apache.activemq.usage.SystemUsage|#org.apache.activemq.usage.SystemUsage-types]_ | {html}{html} |
|
||||
| taskRunnerFactory | _org.apache.activemq.thread.TaskRunnerFactory_ | {html}{html} |
|
||||
| taskRunnerPriority | _int_ | {html}{html} |
|
||||
|
@ -691,6 +697,7 @@ explicitly configured.{html} |
|
|||
| useShutdownHook | _boolean_ | {html}Sets whether or not we should use a shutdown handler to close down the
|
||||
broker cleanly if the JVM is terminated. It is recommended you leave this
|
||||
enabled.{html} |
|
||||
| useTempMirroredQueues | _boolean_ | {html}{html} |
|
||||
| useVirtualTopics | _boolean_ | {html}Sets whether or not <a
|
||||
href="http://activemq.apache.org/virtual-destinations.html">Virtual
|
||||
Topics</a> should be supported by default if they have not been
|
||||
|
@ -1760,6 +1767,24 @@ h3. The _[<simpleMessageGroupMapFactory>|#simpleMessageGroupMapFactory-element]_
|
|||
{html}A factory to create instances of {@link SimpleMessageGroupMap} when implementing the
|
||||
<a href="http://activemq.apache.org/message-groups.html">Message Groups</a> functionality.{html}
|
||||
|
||||
{anchor:sslContext-element}
|
||||
h3. The _[<sslContext>|#sslContext-element]_ Element
|
||||
{html}Extends the SslContext so that it's easier to configure from spring.{html}
|
||||
h4. Properties
|
||||
|| Property Name || Type || Description ||
|
||||
| keyManagers | (_java.lang.Object_)\* | {html}{html} |
|
||||
| keyStore | _org.springframework.core.io.Resource_ | {html}{html} |
|
||||
| keyStoreAlgorithm | _java.lang.String_ | {html}{html} |
|
||||
| keyStorePassword | _java.lang.String_ | {html}{html} |
|
||||
| keyStoreType | _java.lang.String_ | {html}{html} |
|
||||
| secureRandom | _java.security.SecureRandom_ | {html}{html} |
|
||||
| secureRandomAlgorithm | _java.lang.String_ | {html}{html} |
|
||||
| trustManagers | (_java.lang.Object_)\* | {html}{html} |
|
||||
| trustStore | _org.springframework.core.io.Resource_ | {html}{html} |
|
||||
| trustStoreAlgorithm | _java.lang.String_ | {html}{html} |
|
||||
| trustStorePassword | _java.lang.String_ | {html}{html} |
|
||||
| trustStoreType | _java.lang.String_ | {html}{html} |
|
||||
|
||||
{anchor:statements-element}
|
||||
h3. The _[<statements>|#statements-element]_ Element
|
||||
{html}{html}
|
||||
|
@ -1952,7 +1977,8 @@ h3. The _[<transportConnector>|#transportConnector-element]_ Element
|
|||
h4. Properties
|
||||
|| Property Name || Type || Description ||
|
||||
| brokerInfo | _org.apache.activemq.command.BrokerInfo_ | {html}{html} |
|
||||
| brokerService | _[org.apache.activemq.broker.BrokerService|#org.apache.activemq.broker.BrokerService-types]_ | {html}{html} |
|
||||
| brokerName | _java.lang.String_ | {html}{html} |
|
||||
| brokerService | _[org.apache.activemq.broker.BrokerService|#org.apache.activemq.broker.BrokerService-types]_ | {html}This is called by the BrokerService right before it starts the transport.{html} |
|
||||
| connectUri | _java.net.URI_ | {html}{html} |
|
||||
| disableAsyncDispatch | _boolean_ | {html}{html} |
|
||||
| discoveryAgent | _org.apache.activemq.transport.discovery.DiscoveryAgent_ | {html}{html} |
|
||||
|
@ -2303,6 +2329,7 @@ matches the message.{html} |
|
|||
| _[<simpleJmsMessageConvertor>|#simpleJmsMessageConvertor-element]_ | {html}Converts Message from one JMS to another{html} |
|
||||
| _[<simpleMessageGroupMapFactory>|#simpleMessageGroupMapFactory-element]_ | {html}A factory to create instances of {@link SimpleMessageGroupMap} when implementing the
|
||||
<a href="http://activemq.apache.org/message-groups.html">Message Groups</a> functionality.{html} |
|
||||
| _[<sslContext>|#sslContext-element]_ | {html}Extends the SslContext so that it's easier to configure from spring.{html} |
|
||||
| _[<statements>|#statements-element]_ | {html}{html} |
|
||||
| _[<storeCursor>|#storeCursor-element]_ | {html}Pending messages{html} |
|
||||
| _[<storeDurableSubscriberCursor>|#storeDurableSubscriberCursor-element]_ | {html}Pending messages for a durable{html} |
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/**
|
||||
* 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.tcp;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.textui.TestRunner;
|
||||
import org.apache.activemq.broker.BrokerService;
|
||||
import org.apache.activemq.broker.TransportConnector;
|
||||
import org.apache.activemq.transport.TransportBrokerTestSupport;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class SslContextBrokerServiceTest extends TestCase {
|
||||
|
||||
|
||||
private ClassPathXmlApplicationContext context;
|
||||
private BrokerService broker;
|
||||
private TransportConnector connector;
|
||||
|
||||
|
||||
public void testConfiguration() throws URISyntaxException {
|
||||
|
||||
assertNotNull(broker);
|
||||
assertNotNull(connector);
|
||||
|
||||
assertEquals(new URI("ssl://localhost:61616"), connector.getUri());
|
||||
|
||||
assertNotNull(broker.getSslContext());
|
||||
assertFalse(broker.getSslContext().getKeyManagers().isEmpty());
|
||||
assertFalse(broker.getSslContext().getTrustManagers().isEmpty());
|
||||
|
||||
}
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
Thread.currentThread().setContextClassLoader(SslContextBrokerServiceTest.class.getClassLoader());
|
||||
context = new ClassPathXmlApplicationContext("org/apache/activemq/transport/tcp/activemq-ssl.xml");
|
||||
Map beansOfType = context.getBeansOfType(BrokerService.class);
|
||||
broker = (BrokerService)beansOfType.values().iterator().next();
|
||||
connector = broker.getTransportConnectors().get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
|
||||
context.destroy();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<!-- START SNIPPET: spring -->
|
||||
<beans
|
||||
xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:amq="http://activemq.apache.org/schema/core"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
|
||||
|
||||
<!-- lets create an embedded ActiveMQ Broker -->
|
||||
<amq:broker useJmx="false" persistent="false">
|
||||
|
||||
<amq:sslContext>
|
||||
<amq:sslContext
|
||||
keyStore="server.keystore" keyStorePassword="password"
|
||||
trustStore="client.keystore" trustStorePassword="password"/>
|
||||
</amq:sslContext>
|
||||
|
||||
<amq:transportConnectors>
|
||||
<amq:transportConnector uri="ssl://localhost:61616" />
|
||||
</amq:transportConnectors>
|
||||
|
||||
</amq:broker>
|
||||
|
||||
</beans>
|
||||
|
||||
<!-- END SNIPPET: spring -->
|
Loading…
Reference in New Issue