diff --git a/spring-eai-core/src/main/java/org/springframework/integration/MessageSource.java b/spring-eai-core/src/main/java/org/springframework/integration/MessageSource.java
deleted file mode 100644
index 97b726b354..0000000000
--- a/spring-eai-core/src/main/java/org/springframework/integration/MessageSource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2002-2007 the original author or authors.
- *
- * Licensed 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.springframework.integration;
-
-import org.springframework.integration.message.Message;
-
-/**
- * Base interface for any component that enables message reception.
- *
- * @author Mark Fisher
- */
-public interface MessageSource {
-
- /**
- * Receive a message, blocking indefinitely if necessary.
- *
- * @return the next available {@link Message} or
- * null if interrupted
- */
- Message receive();
-
- /**
- * Receive a message, blocking until either a message is
- * available or the specified timeout period elapses.
- *
- * @param timeout the timeout in milliseconds
- *
- * @return the next available {@link Message} or
- * null if the specified timeout period
- * elapses or the message reception is interrupted
- */
- Message receive(long timeout);
-
-}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/MessageTarget.java b/spring-eai-core/src/main/java/org/springframework/integration/MessageTarget.java
deleted file mode 100644
index 26c37c876f..0000000000
--- a/spring-eai-core/src/main/java/org/springframework/integration/MessageTarget.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2002-2007 the original author or authors.
- *
- * Licensed 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.springframework.integration;
-
-import org.springframework.integration.message.Message;
-
-/**
- * Base interface for any component that enables message sending.
- *
- * @author Mark Fisher
- */
-public interface MessageTarget {
-
- /**
- * Send a message, blocking indefinitely if necessary.
- *
- * @param message the {@link Message} to send
- *
- * @return true if the message is sent
- * successfully, false if interrupted
- */
- boolean send(Message message);
-
- /**
- * Send a message, blocking until either the message is
- * accepted or the specified timeout period elapses.
- *
- * @param message the {@link Message} to send
- * @param timeout the timeout in milliseconds
- *
- * @return true if the message is sent
- * successfully, false if the specified
- * timeout period elapses or the send is interrupted
- */
- boolean send(Message message, long timeout);
-
-}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/MessagingConfigurationException.java b/spring-eai-core/src/main/java/org/springframework/integration/MessagingConfigurationException.java
new file mode 100644
index 0000000000..da834b6bf0
--- /dev/null
+++ b/spring-eai-core/src/main/java/org/springframework/integration/MessagingConfigurationException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed 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.springframework.integration;
+
+/**
+ * Exception that indicates an incorrectly configured messaging component.
+ *
+ * @author Mark Fisher
+ */
+@SuppressWarnings("serial")
+public class MessagingConfigurationException extends MessagingException {
+
+ public MessagingConfigurationException(String message) {
+ super(message);
+ }
+
+ public MessagingConfigurationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/bus/MessageBus.java b/spring-eai-core/src/main/java/org/springframework/integration/bus/MessageBus.java
index 643600c24a..b40c2b48de 100644
--- a/spring-eai-core/src/main/java/org/springframework/integration/bus/MessageBus.java
+++ b/spring-eai-core/src/main/java/org/springframework/integration/bus/MessageBus.java
@@ -40,7 +40,7 @@ import org.springframework.util.Assert;
/**
* The messaging bus. Serves as a registry for channels and endpoints, manages their lifecycle,
- * and all subscriptions.
+ * and activates subscriptions.
*
* @author Mark Fisher
*/
@@ -60,8 +60,6 @@ public class MessageBus implements ChannelResolver, ApplicationContextAware, Lif
private boolean autoCreateChannels;
- private ApplicationContext applicationContext;
-
private boolean running;
private Object lifecycleMonitor = new Object();
@@ -69,15 +67,15 @@ public class MessageBus implements ChannelResolver, ApplicationContextAware, Lif
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Assert.notNull(applicationContext, "applicationContext must not be null");
- this.applicationContext = applicationContext;
- this.registerChannelsFromContext();
- this.registerEndpointsFromContext();
+ this.registerChannels(applicationContext);
+ this.registerEndpoints(applicationContext);
+ this.activateSubscriptions(applicationContext);
}
@SuppressWarnings("unchecked")
- private void registerChannelsFromContext() {
- Map channelBeans = (Map) this.applicationContext
- .getBeansOfType(MessageChannel.class);
+ private void registerChannels(ApplicationContext context) {
+ Map channelBeans =
+ (Map) context.getBeansOfType(MessageChannel.class);
for (Map.Entry entry : channelBeans.entrySet()) {
this.registerChannel(entry.getKey(), entry.getValue());
if (logger.isInfoEnabled()) {
@@ -87,9 +85,9 @@ public class MessageBus implements ChannelResolver, ApplicationContextAware, Lif
}
@SuppressWarnings("unchecked")
- private void registerEndpointsFromContext() {
- Map endpointBeans = (Map) this.applicationContext
- .getBeansOfType(MessageEndpoint.class);
+ private void registerEndpoints(ApplicationContext context) {
+ Map endpointBeans =
+ (Map) context.getBeansOfType(MessageEndpoint.class);
for (Map.Entry entry : endpointBeans.entrySet()) {
this.registerEndpoint(entry.getKey(), entry.getValue());
if (logger.isInfoEnabled()) {
@@ -98,6 +96,19 @@ public class MessageBus implements ChannelResolver, ApplicationContextAware, Lif
}
}
+ @SuppressWarnings("unchecked")
+ private void activateSubscriptions(ApplicationContext context) {
+ Map subscriptionBeans =
+ (Map) context.getBeansOfType(Subscription.class);
+ for (Subscription subscription : subscriptionBeans.values()) {
+ this.activateSubscription(subscription);
+ if (logger.isInfoEnabled()) {
+ logger.info("activated subscription to channel '" + subscription.getChannel() +
+ "' for endpoint '" + subscription.getEndpoint() + "'");
+ }
+ }
+ }
+
public void initialize() {
this.dispatcherExecutor = new ScheduledThreadPoolExecutor(this.dispatcherTasks.size() > 0 ? this.dispatcherTasks.size() : 1);
}
@@ -112,9 +123,13 @@ public class MessageBus implements ChannelResolver, ApplicationContextAware, Lif
public void registerEndpoint(String name, MessageEndpoint endpoint) {
this.endpoints.put(name, endpoint);
+ endpoint.setChannelResolver(this);
}
- public void activateSubscription(String channelName, String endpointName, ConsumerPolicy policy) {
+ public void activateSubscription(Subscription subscription) {
+ String channelName = subscription.getChannel();
+ String endpointName = subscription.getEndpoint();
+ ConsumerPolicy policy = subscription.getPolicy();
MessageChannel channel = this.channels.get(channelName);
if (channel == null) {
if (this.autoCreateChannels == false) {
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/bus/Subscription.java b/spring-eai-core/src/main/java/org/springframework/integration/bus/Subscription.java
new file mode 100644
index 0000000000..e11e2977c1
--- /dev/null
+++ b/spring-eai-core/src/main/java/org/springframework/integration/bus/Subscription.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed 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.springframework.integration.bus;
+
+/**
+ * Configuration metadata for activating a subscription.
+ *
+ * @author Mark Fisher
+ */
+public class Subscription {
+
+ private String channel;
+
+ private String endpoint;
+
+ private ConsumerPolicy policy = new ConsumerPolicy();
+
+
+ public String getChannel() {
+ return this.channel;
+ }
+
+ public void setChannel(String channel) {
+ this.channel = channel;
+ }
+
+ public String getEndpoint() {
+ return this.endpoint;
+ }
+
+ public void setEndpoint(String endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ public ConsumerPolicy getPolicy() {
+ return this.policy;
+ }
+
+ public void setPolicy(ConsumerPolicy policy) {
+ this.policy = policy;
+ }
+
+}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/channel/MessageChannel.java b/spring-eai-core/src/main/java/org/springframework/integration/channel/MessageChannel.java
index 651b469ee0..e415c0683c 100644
--- a/spring-eai-core/src/main/java/org/springframework/integration/channel/MessageChannel.java
+++ b/spring-eai-core/src/main/java/org/springframework/integration/channel/MessageChannel.java
@@ -16,17 +16,56 @@
package org.springframework.integration.channel;
-import org.springframework.integration.MessageSource;
-import org.springframework.integration.MessageTarget;
+import org.springframework.integration.message.Message;
/**
- * Base channel interface that combines the definitions of {@link MessageSource}
- * for message reception and {@link MessageTarget} for message sending.
+ * Base channel interface defining common behavior for message reception and sending.
*
* @author Mark Fisher
- * @see MessageSource
- * @see MessageTarget
*/
-public interface MessageChannel extends MessageSource, MessageTarget {
+public interface MessageChannel {
+
+ /**
+ * Send a message, blocking indefinitely if necessary.
+ *
+ * @param message the {@link Message} to send
+ *
+ * @return true if the message is sent
+ * successfully, false if interrupted
+ */
+ boolean send(Message message);
+
+ /**
+ * Send a message, blocking until either the message is
+ * accepted or the specified timeout period elapses.
+ *
+ * @param message the {@link Message} to send
+ * @param timeout the timeout in milliseconds
+ *
+ * @return true if the message is sent
+ * successfully, false if the specified
+ * timeout period elapses or the send is interrupted
+ */
+ boolean send(Message message, long timeout);
+
+ /**
+ * Receive a message, blocking indefinitely if necessary.
+ *
+ * @return the next available {@link Message} or
+ * null if interrupted
+ */
+ Message receive();
+
+ /**
+ * Receive a message, blocking until either a message is
+ * available or the specified timeout period elapses.
+ *
+ * @param timeout the timeout in milliseconds
+ *
+ * @return the next available {@link Message} or
+ * null if the specified timeout period
+ * elapses or the message reception is interrupted
+ */
+ Message receive(long timeout);
}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractChannelAdapter.java b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractChannelAdapter.java
new file mode 100644
index 0000000000..ce069de5ad
--- /dev/null
+++ b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractChannelAdapter.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed 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.springframework.integration.endpoint;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.integration.MessageHandlingException;
+import org.springframework.integration.channel.MessageChannel;
+import org.springframework.integration.message.Message;
+import org.springframework.integration.message.MessageMapper;
+import org.springframework.integration.message.SimplePayloadMessageMapper;
+import org.springframework.util.Assert;
+
+/**
+ * Convenience base class for channel adapters.
+ *
+ * @author Mark Fisher
+ */
+public abstract class AbstractChannelAdapter implements MessageChannel, InitializingBean {
+
+ protected Log logger = LogFactory.getLog(this.getClass());
+
+ private MessageMapper mapper = new SimplePayloadMessageMapper();
+
+ private volatile boolean initialized;
+
+
+ public final void afterPropertiesSet() {
+ this.initialize();
+ this.initialized = true;
+ }
+
+ public void setMapper(MessageMapper mapper) {
+ Assert.notNull(mapper, "'mapper' must not be null");
+ this.mapper = mapper;
+ }
+
+ protected MessageMapper getMapper() {
+ return this.mapper;
+ }
+
+ public boolean send(Message message) {
+ if (!this.initialized) {
+ throw new MessageHandlingException("adapter not initialized");
+ }
+ try {
+ Object source = this.getMapper().fromMessage(message);
+ return this.sendObject(source);
+ }
+ catch (Exception e) {
+ throw new MessageHandlingException("Failed to send message to target", e);
+ }
+ }
+
+ public boolean send(final Message message, long timeout) {
+ if (!this.initialized) {
+ throw new MessageHandlingException("adapter not initialized");
+ }
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future result = executor.submit(new Callable() {
+ public Boolean call() throws Exception {
+ return send(message);
+ }
+ });
+ try {
+ result.get(timeout, TimeUnit.MILLISECONDS);
+ if (result.isDone()) {
+ return result.get();
+ }
+ }
+ catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return false;
+ }
+ catch (TimeoutException e) {
+ return false;
+ }
+ catch (ExecutionException e) {
+ throw new MessageHandlingException("Exception occurred in message source", e);
+ }
+ result.cancel(true);
+ return false;
+ }
+
+ public Message receive() {
+ if (!this.initialized) {
+ throw new MessageHandlingException("adapter not initialized");
+ }
+ try {
+ Object result = this.receiveObject();
+ if (result != null) {
+ return this.getMapper().toMessage(result);
+ }
+ }
+ catch (Exception e) {
+ throw new MessageHandlingException("Failed to receive message from source", e);
+ }
+ return null;
+ }
+
+ public Message receive(long timeout) {
+ if (!this.initialized) {
+ throw new MessageHandlingException("adapter not initialized");
+ }
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future result = executor.submit(new Callable() {
+ public Message call() throws Exception {
+ return receive();
+ }
+ });
+ try {
+ result.get(timeout, TimeUnit.MILLISECONDS);
+ if (result.isDone()) {
+ return result.get();
+ }
+ }
+ catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return null;
+ }
+ catch (TimeoutException e) {
+ return null;
+ }
+ catch (ExecutionException e) {
+ throw new MessageHandlingException("Exception occurred in message source", e);
+ }
+ result.cancel(true);
+ return null;
+ }
+
+ protected void initialize() {
+ }
+
+ protected abstract boolean sendObject(Object object) throws Exception;
+
+ protected abstract Object receiveObject() throws Exception;
+
+}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractInboundChannelAdapter.java b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractInboundChannelAdapter.java
new file mode 100644
index 0000000000..0c81fbc2f8
--- /dev/null
+++ b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractInboundChannelAdapter.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed 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.springframework.integration.endpoint;
+
+/**
+ * Convenience base class for inbound channel adapters.
+ *
+ * @author Mark Fisher
+ */
+public abstract class AbstractInboundChannelAdapter extends AbstractChannelAdapter {
+
+ protected boolean sendObject(Object object) throws Exception {
+ return false;
+ }
+
+ protected Object receiveObject() throws Exception {
+ return this.doReceiveObject();
+ }
+
+ protected abstract Object doReceiveObject() throws Exception;
+
+}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractOutboundChannelAdapter.java b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractOutboundChannelAdapter.java
new file mode 100644
index 0000000000..6cdf2449c9
--- /dev/null
+++ b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractOutboundChannelAdapter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed 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.springframework.integration.endpoint;
+
+/**
+ * A convenience base class for outbound channel adapters.
+ *
+ * @author Mark Fisher
+ */
+public abstract class AbstractOutboundChannelAdapter extends AbstractChannelAdapter {
+
+ @Override
+ protected Object receiveObject() throws Exception {
+ return null;
+ }
+
+ @Override
+ protected boolean sendObject(Object object) throws Exception {
+ return this.doSendObject(object);
+ }
+
+ protected abstract boolean doSendObject(Object object) throws Exception;
+
+}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPollingMessageSource.java b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPollingMessageSource.java
deleted file mode 100644
index 66c19ada67..0000000000
--- a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPollingMessageSource.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2002-2007 the original author or authors.
- *
- * Licensed 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.springframework.integration.endpoint;
-
-import org.springframework.integration.MessageSource;
-import org.springframework.integration.message.Message;
-import org.springframework.integration.message.MessageMapper;
-import org.springframework.integration.message.SimplePayloadMessageMapper;
-import org.springframework.util.Assert;
-
-/**
- * A {@link MessageSource} adapter for any source that can be polled for
- * objects.
- *
- * @author Mark Fisher
- */
-public abstract class AbstractPollingMessageSource implements MessageSource {
-
- private MessageMapper mapper = new SimplePayloadMessageMapper();
-
-
- public void setMapper(MessageMapper mapper) {
- Assert.notNull(mapper, "mapper must not be null");
- this.mapper = mapper;
- }
-
- public Message receive() {
- return this.receive(-1);
- }
-
- public Message receive(long timeout) {
- long start = System.currentTimeMillis();
- while (timeout <= 0 || System.currentTimeMillis() - start < timeout) {
- Object o = this.pollForObject();
- if (o != null) {
- return this.mapper.toMessage(o);
- }
- if (timeout == 0) {
- return null;
- }
- }
- return null;
- }
-
-
- /**
- * Method for subclasses to implement. Returns an object to be mapped to a
- * {@link Message} by the message mapper.
- */
- protected abstract Object pollForObject();
-
-}
diff --git a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPrefetchingMessageSource.java b/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPrefetchingMessageSource.java
deleted file mode 100644
index f8b157358b..0000000000
--- a/spring-eai-core/src/main/java/org/springframework/integration/endpoint/AbstractPrefetchingMessageSource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2002-2007 the original author or authors.
- *
- * Licensed 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.springframework.integration.endpoint;
-
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import org.springframework.integration.MessageSource;
-import org.springframework.integration.message.Message;
-
-/**
- * A {@link MessageSource} adapter for any source that can be polled for
- * objects. This version allows for pre-fetching multiple results so that
- * subsequent calls to {@link #pollForObject()} may be more efficient.
- *
- * @author Mark Fisher
- */
-public abstract class AbstractPrefetchingMessageSource extends AbstractPollingMessageSource {
-
- private BlockingQueue