<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns="http://www.springframework.org/schema/jms"
		xmlns:xsd="http://www.w3.org/2001/XMLSchema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:tool="http://www.springframework.org/schema/tool"
		targetNamespace="http://www.springframework.org/schema/jms"
		elementFormDefault="qualified"
		attributeFormDefault="unqualified">

	<xsd:import namespace="http://www.springframework.org/schema/tool" schemaLocation="http://www.springframework.org/schema/tool/spring-tool-3.0.xsd"/>

	<xsd:annotation>
		<xsd:documentation><![CDATA[
	Defines the configuration elements for the Spring Framework's JMS support.
	Allows for configuring JMS listener containers in XML 'shortcut' style.
		]]></xsd:documentation>
	</xsd:annotation>

	<xsd:element name="listener-container">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
	Each listener child element will be hosted by a container whose configuration
	is determined by this parent element. This variant builds standard JMS
	listener containers, operating against a specified JMS ConnectionFactory.
			]]></xsd:documentation>
			<xsd:appinfo>
				<tool:annotation>
					<tool:exports type="org.springframework.jms.listener.AbstractMessageListenerContainer"/>
				</tool:annotation>	
			</xsd:appinfo>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="listener" type="listenerType" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
			<xsd:attribute name="container-type" default="default">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The type of this listener container: "default" or "simple", choosing
	between DefaultMessageListenerContainer and SimpleMessageListenerContainer.
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="default"/>
						<xsd:enumeration value="simple"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="container-class" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A custom listener container implementation class as fully qualified class name.
	Default is Spring's standard DefaultMessageListenerContainer or
	SimpleMessageListenerContainer, according to the "container-type" attribute.
	Note that a custom container class will typically be a subclass of either of
	those two Spring-provided standard container classes: Nake sure that the
	"container-type" attribute matches the actual base type that the custom class
	derives from ("default" will usually be fine anyway, since most custom classes
	will derive from DefaultMessageListenerContainer).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation>
							<tool:expected-type type="java.lang.Class"/>
							<tool:assignable-to type="org.springframework.jms.listener.AbstractMessageListenerContainer"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="connection-factory" type="xsd:string" default="connectionFactory">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the JMS ConnectionFactory bean.
	Default is "connectionFactory".
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="javax.jms.ConnectionFactory"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="task-executor" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to a Spring TaskExecutor (or standard JDK 1.5 Executor) for executing
	JMS listener invokers. Default is a SimpleAsyncTaskExecutor in case of a
	DefaultMessageListenerContainer, using internally managed threads. For a
	SimpleMessageListenerContainer, listeners will always get invoked within the
	JMS provider's receive thread by default.
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="java.util.concurrent.Executor"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="destination-resolver" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the DestinationResolver strategy for resolving destination names.
	Default is a DynamicDestinationResolver, using the JMS provider's queue/topic
	name resolution. Alternatively, specify a reference to a JndiDestinationResolver
	(typically in a J2EE environment).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.jms.support.destination.DestinationResolver"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="message-converter" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the MessageConverter strategy for converting JMS Messages to
	listener method arguments. Default is a SimpleMessageConverter.
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.jms.support.converter.MessageConverter"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="destination-type" default="queue">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The JMS destination type for this listener: "queue", "topic" or "durableTopic".
	The default is "queue".
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="queue"/>
						<xsd:enumeration value="topic"/>
						<xsd:enumeration value="durableTopic"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="client-id" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The JMS client id for this listener container.
	Needs to be specified when using durable subscriptions.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="cache" default="auto">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The cache level for JMS resources: "none", "connection", "session", "consumer"
	or "auto". By default ("auto"), the cache level will effectively be "consumer",
	unless an external transaction manager has been specified - in which case the
	effective default will be "none" (assuming J2EE-style transaction management
	where the given ConnectionFactory is an XA-aware pool).
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="none"/>
						<xsd:enumeration value="connection"/>
						<xsd:enumeration value="session"/>
						<xsd:enumeration value="consumer"/>
						<xsd:enumeration value="auto"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="acknowledge" default="auto">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The native JMS acknowledge mode: "auto", "client", "dups-ok" or "transacted".
	A value of "transacted" effectively activates a locally transacted Session;
	as alternative, specify an external "transaction-manager" via the corresponding
	attribute. Default is "auto".
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="auto"/>
						<xsd:enumeration value="client"/>
						<xsd:enumeration value="dups-ok"/>
						<xsd:enumeration value="transacted"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="transaction-manager" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to an external PlatformTransactionManager (typically an
	XA-based transaction coordinator, e.g. Spring's JtaTransactionManager).
	If not specified, native acknowledging will be used (see "acknowledge" attribute).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.transaction.PlatformTransactionManager"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="concurrency" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The number of concurrent sessions/consumers to start for each listener.
	Can either be a simple number indicating the maximum number (e.g. "5")
	or a range indicating the lower as well as the upper limit (e.g. "3-5").
	Note that a specified minimum is just a hint and might be ignored at runtime.
	Default is 1; keep concurrency limited to 1 in case of a topic listener
	or if message ordering is important; consider raising it for general queues.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="prefetch" type="xsd:int">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The maximum number of messages to load into a single session.
	Note that raising this number might lead to starvation of concurrent consumers!
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="jca-listener-container">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
	Each listener child element will be hosted by a container whose configuration
	is determined by this parent element. This variant builds standard JCA-based
	listener containers, operating against a specified JCA ResourceAdapter
	(which needs to be provided by the JMS message broker, e.g. ActiveMQ).
			]]></xsd:documentation>
			<xsd:appinfo>
				<tool:annotation>
					<tool:exports type="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager"/>
				</tool:annotation>
			</xsd:appinfo>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="listener" type="listenerType" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
			<xsd:attribute name="resource-adapter" type="xsd:string" default="resourceAdapter">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the JCA ResourceAdapter bean for the JMS provider.
	Default is "resourceAdapter".
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="javax.resource.spi.ResourceAdapter"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="activation-spec-factory" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the JmsActivationSpecFactory.
	Default is to autodetect the JMS provider and its ActivationSpec class
	(see DefaultJmsActivationSpecFactory).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.jms.listener.endpoint.JmsActivationSpecFactory"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="destination-resolver" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the DestinationResolver strategy for resolving destination names.
	Default is to pass in the destination name Strings into the JCA ActivationSpec as-is.
	Alternatively, specify a reference to a JndiDestinationResolver (typically in a J2EE
	environment, in particular if the server insists on receiving Destination objects).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.jms.support.destination.DestinationResolver"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="message-converter" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the MessageConverter strategy for converting JMS Messages to
	listener method arguments. Default is a SimpleMessageConverter.
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref">
							<tool:expected-type type="org.springframework.jms.support.converter.MessageConverter"/>
						</tool:annotation>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="destination-type" default="queue">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The JMS destination type for this listener: "queue", "topic" or "durableTopic".
	Default is "queue".
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="queue"/>
						<xsd:enumeration value="topic"/>
						<xsd:enumeration value="durableTopic"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="client-id" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The JMS client id for this listener container.
	Needs to be specified when using durable subscriptions.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="acknowledge" default="auto">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The native JMS acknowledge mode: "auto", "client", "dups-ok" or "transacted".
	A value of "transacted" effectively activates a locally transacted Session;
	as alternative, specify an external "transaction-manager" via the corresponding
	attribute. Default is "auto".
					]]></xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:NMTOKEN">
						<xsd:enumeration value="auto"/>
						<xsd:enumeration value="client"/>
						<xsd:enumeration value="dups-ok"/>
						<xsd:enumeration value="transacted"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="transaction-manager" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	A reference to the Spring JtaTransactionManager or [javax.transaction.TransactionManager],
	for kicking off an XA transaction for each incoming message.
	If not specified, native acknowledging will be used (see "acknowledge" attribute).
					]]></xsd:documentation>
					<xsd:appinfo>
						<tool:annotation kind="ref"/>
					</xsd:appinfo>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="concurrency" type="xsd:string">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The number of concurrent sessions/consumers to start for each listener.
	Can either be a simple number indicating the maximum number (e.g. "5")
	or a range indicating the lower as well as the upper limit (e.g. "3-5").
	Note that a specified minimum is just a hint and will typically be ignored
	at runtime when using a JCA listener container. Default is 1.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="prefetch" type="xsd:int">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The maximum number of messages to load into a single session.
	Note that raising this number might lead to starvation of concurrent consumers!
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>

	<xsd:complexType name="listenerType">
		<xsd:attribute name="id" type="xsd:ID">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The unique identifier for a listener.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="destination" type="xsd:string" use="required">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The destination name for this listener, resolved through the
	container-wide DestinationResolver strategy (if any). Required.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="subscription" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The name for the durable subscription, if any.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="selector" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The JMS message selector for this listener.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="ref" type="xsd:string" use="required">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The bean name of the listener object, implementing
	the MessageListener/SessionAwareMessageListener interface
	or defining the specified listener method. Required.
				]]></xsd:documentation>
				<xsd:appinfo>
					<tool:annotation kind="ref"/>
				</xsd:appinfo>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="method" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The name of the listener method to invoke. If not specified,
	the target bean is supposed to implement the MessageListener
	or SessionAwareMessageListener interface.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="response-destination" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
	The name of the default response destination to send response messages to.
	This will be applied in case of a request message that does not carry
	a "JMSReplyTo" field. The type of this destination will be determined
	by the listener-container's "destination-type" attribute.
	Note: This only applies to a listener method with a return value,
	for which each result object will be converted into a response message.
				]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>
	
</xsd:schema>
