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:
Hiram R. Chirino 2008-05-14 15:32:54 +00:00
parent 2e137fb125
commit 139a220ee7
10 changed files with 544 additions and 6 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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).

View File

@ -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

View File

@ -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'/>

View File

@ -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>&lt;spring:bean/&gt;</td><td></td></tr>
<tr><td>tempDataStore</td><td>&lt;spring:bean/&gt;</td><td></td></tr>
@ -1425,6 +1429,25 @@ Set of groups</td></tr>
<tr><td>connection</td><td>&lt;spring:bean/&gt;</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>(&lt;spring:bean/&gt;)*</td><td></td></tr>
<tr><td>secureRandom</td><td>&lt;spring:bean/&gt;</td><td></td></tr>
<tr><td>trustManagers</td><td>(&lt;spring:bean/&gt;)*</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>&lt;spring:bean/&gt;</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>&lt;spring:bean/&gt;</td><td></td></tr>
<tr><td>messageAuthorizationPolicy</td><td>&lt;spring:bean/&gt;</td><td>Sets the policy used to decide if the current connection is authorized to
consume a given message</td></tr>

View File

@ -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} |

View File

@ -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();
}
}

View File

@ -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 -->