You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2009/02/04 14:57:34 UTC
svn commit: r740741 -
/servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
Author: gnodet
Date: Wed Feb 4 13:57:33 2009
New Revision: 740741
URL: http://svn.apache.org/viewvc?rev=740741&view=rev
Log:
SM-1786: Refactor JmsProviderEndpoint to not use reflection to call protected method on Spring JmsTemplate class
Modified:
servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
Modified: servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java?rev=740741&r1=740740&r2=740741&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java (original)
+++ servicemix/components/bindings/servicemix-jms/trunk/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java Wed Feb 4 13:57:33 2009
@@ -33,6 +33,20 @@
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
+import javax.jms.TopicConnectionFactory;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.Connection;
+import javax.jms.TopicConnection;
+import javax.jms.QueueConnection;
+import javax.jms.TopicSession;
+import javax.jms.QueueSession;
+import javax.jms.MessageProducer;
+import javax.jms.Topic;
+import javax.jms.Queue;
+import javax.jms.MessageConsumer;
+import javax.jms.QueueBrowser;
+import javax.jms.TopicPublisher;
+import javax.jms.QueueSender;
import org.apache.servicemix.common.JbiConstants;
import org.apache.servicemix.common.endpoints.ProviderEndpoint;
@@ -42,6 +56,7 @@
import org.apache.servicemix.store.memory.MemoryStoreFactory;
import org.springframework.jms.JmsException;
import org.springframework.jms.UncategorizedJmsException;
+import org.springframework.jms.connection.JmsResourceHolder;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.JmsTemplate102;
import org.springframework.jms.core.MessageCreator;
@@ -51,6 +66,7 @@
import org.springframework.jms.listener.DefaultMessageListenerContainer102;
import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.jms.support.destination.DynamicDestinationResolver;
+import org.springframework.jms.support.converter.SimpleMessageConverter102;
/**
* A Spring-based JMS provider endpoint
@@ -67,7 +83,7 @@
private JmsProviderMarshaler marshaler = new DefaultProviderMarshaler();
private DestinationChooser destinationChooser = new SimpleDestinationChooser();
private DestinationChooser replyDestinationChooser = new SimpleDestinationChooser();
- private JmsTemplate template;
+ private JmsTemplateUtil template;
private boolean jms102;
private ConnectionFactory connectionFactory;
@@ -685,45 +701,17 @@
}
private void send(final Session session, final Destination dest, final Message message) throws JmsException {
- // Do not call directly the template to avoid the cost of creating a new connection / session
-// template.send(dest, new MessageCreator() {
-// public Message createMessage(Session session) throws JMSException {
-// return message;
-// }
-// });
- try {
- Method method = JmsTemplate.class.getDeclaredMethod("doSend", Session.class, Destination.class, MessageCreator.class);
- method.setAccessible(true);
- method.invoke(template, session, dest, new MessageCreator() {
+ template.send(session, dest, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return message;
}
});
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException(e);
- }
}
private Message receiveSelected(final Session session,
final Destination dest,
final String messageSelector) throws JMSException {
- // Do not call directly the template to avoid the cost of creating a new connection / session
-// return template.doReceive(session, dest, messageSelector);
- try {
- Method method = JmsTemplate.class.getDeclaredMethod("doReceive", Session.class, Destination.class, String.class);
- method.setAccessible(true);
- return (Message) method.invoke(template, session, dest, messageSelector);
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException(e);
- }
+ return template.receiveSelected(session, dest, messageSelector);
}
/**
@@ -905,12 +893,12 @@
*
* @return
*/
- protected JmsTemplate createTemplate() {
- JmsTemplate tplt;
+ protected JmsTemplateUtil createTemplate() {
+ JmsTemplateUtil tplt;
if (isJms102()) {
- tplt = new JmsTemplate102();
+ tplt = new JmsTemplate102Util();
} else {
- tplt = new JmsTemplate();
+ tplt = new JmsTemplateUtil();
}
tplt.setConnectionFactory(getConnectionFactory());
if (getDestination() != null) {
@@ -965,4 +953,112 @@
return cont;
}
+ public static class JmsTemplateUtil extends JmsTemplate {
+ public void send(Session session, Destination destination, MessageCreator messageCreator) throws JmsException {
+ try {
+ doSend(session, destination, messageCreator);
+ } catch (JMSException ex) {
+ throw convertJmsAccessException(ex);
+ }
+ }
+ public Message receiveSelected(Session session, Destination destination, String messageSelector) throws JmsException {
+ try {
+ return doReceive(session, destination, messageSelector);
+ } catch (JMSException ex) {
+ throw convertJmsAccessException(ex);
+ }
+ }
+ }
+
+ public static class JmsTemplate102Util extends JmsTemplateUtil {
+ protected void initDefaultStrategies() {
+ setMessageConverter(new SimpleMessageConverter102());
+ }
+
+ public void afterPropertiesSet() {
+ super.afterPropertiesSet();
+ if (isPubSubDomain()) {
+ if (!(getConnectionFactory() instanceof TopicConnectionFactory)) {
+ throw new IllegalArgumentException(
+ "Specified a Spring JMS 1.0.2 template for topics " +
+ "but did not supply an instance of TopicConnectionFactory");
+ }
+ } else {
+ if (!(getConnectionFactory() instanceof QueueConnectionFactory)) {
+ throw new IllegalArgumentException(
+ "Specified a Spring JMS 1.0.2 template for queues " +
+ "but did not supply an instance of QueueConnectionFactory");
+ }
+ }
+ }
+
+ protected Connection getConnection(JmsResourceHolder holder) {
+ return holder.getConnection(isPubSubDomain() ? (Class) TopicConnection.class : QueueConnection.class);
+ }
+
+ protected Session getSession(JmsResourceHolder holder) {
+ return holder.getSession(isPubSubDomain() ? (Class) TopicSession.class : QueueSession.class);
+ }
+
+ protected Connection createConnection() throws JMSException {
+ if (isPubSubDomain()) {
+ return ((TopicConnectionFactory) getConnectionFactory()).createTopicConnection();
+ } else {
+ return ((QueueConnectionFactory) getConnectionFactory()).createQueueConnection();
+ }
+ }
+
+ protected Session createSession(Connection con) throws JMSException {
+ if (isPubSubDomain()) {
+ return ((TopicConnection) con).createTopicSession(isSessionTransacted(), getSessionAcknowledgeMode());
+ } else {
+ return ((QueueConnection) con).createQueueSession(isSessionTransacted(), getSessionAcknowledgeMode());
+ }
+ }
+
+ protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
+ if (isPubSubDomain()) {
+ return ((TopicSession) session).createPublisher((Topic) destination);
+ } else {
+ return ((QueueSession) session).createSender((Queue) destination);
+ }
+ }
+
+ protected MessageConsumer createConsumer(Session session, Destination destination, String messageSelector) throws JMSException {
+ if (isPubSubDomain()) {
+ return ((TopicSession) session).createSubscriber((Topic) destination, messageSelector, isPubSubNoLocal());
+ } else {
+ return ((QueueSession) session).createReceiver((Queue) destination, messageSelector);
+ }
+ }
+
+ protected QueueBrowser createBrowser(Session session, Queue queue, String messageSelector) throws JMSException {
+ if (isPubSubDomain()) {
+ throw new javax.jms.IllegalStateException("Cannot create QueueBrowser for a TopicSession");
+ } else {
+ return ((QueueSession) session).createBrowser(queue, messageSelector);
+ }
+ }
+
+ protected void doSend(MessageProducer producer, Message message) throws JMSException {
+ if (isPubSubDomain()) {
+ if (isExplicitQosEnabled()) {
+ ((TopicPublisher) producer).publish(message, getDeliveryMode(), getPriority(), getTimeToLive());
+ } else {
+ ((TopicPublisher) producer).publish(message);
+ }
+ } else {
+ if (isExplicitQosEnabled()) {
+ ((QueueSender) producer).send(message, getDeliveryMode(), getPriority(), getTimeToLive());
+ } else {
+ ((QueueSender) producer).send(message);
+ }
+ }
+ }
+
+ protected boolean isClientAcknowledge(Session session) throws JMSException {
+ return (getSessionAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE);
+ }
+
+ }
}