diff options
Diffstat (limited to 'sandbox/rajith/binding.jms/src/main/java/org/apache/tuscany/binding/jms/JMSTargetInvoker.java')
-rw-r--r-- | sandbox/rajith/binding.jms/src/main/java/org/apache/tuscany/binding/jms/JMSTargetInvoker.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/sandbox/rajith/binding.jms/src/main/java/org/apache/tuscany/binding/jms/JMSTargetInvoker.java b/sandbox/rajith/binding.jms/src/main/java/org/apache/tuscany/binding/jms/JMSTargetInvoker.java new file mode 100644 index 0000000000..97b2dbef83 --- /dev/null +++ b/sandbox/rajith/binding.jms/src/main/java/org/apache/tuscany/binding/jms/JMSTargetInvoker.java @@ -0,0 +1,111 @@ +package org.apache.tuscany.binding.jms; + + +import java.lang.reflect.InvocationTargetException; +import java.util.Properties; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.Destination; +import javax.jms.JMSException; +import javax.jms.MessageConsumer; +import javax.jms.MessageProducer; +import javax.jms.Session; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.apache.tuscany.spi.wire.InvocationRuntimeException; +import org.apache.tuscany.spi.wire.Message; +import org.apache.tuscany.spi.wire.TargetInvoker; + +/** + * Invoke a JMS reference. + * + * @version $Rev$ $Date$ + */ +public class JMSTargetInvoker implements TargetInvoker { + private JMSBinding jmsBinding; + private Context context; + private String operationName; + private JMSResourceFactory jmsResourceFactory; + private OperationSelector operationSelector; + + public JMSTargetInvoker(JMSResourceFactory jmsResourceFactory,JMSBinding jmsBinding, String operationName, OperationSelector operationSelector) throws NamingException { + this.jmsBinding = jmsBinding; + this.jmsResourceFactory = jmsResourceFactory; + this.operationName = operationName; + this.operationSelector = operationSelector; + } + + public Message invoke(Message msg) throws InvocationRuntimeException { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } + return msg; + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + try { + + return sendReceiveMessage(payload); + + } catch (Exception e) { // catch JMS specific error + + throw new AssertionError(e); + } + + } + + public Object clone() throws CloneNotSupportedException { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + public boolean isOptimizable() { + return false; + } + + public boolean isCacheable() { + return false; + } + + public void setCacheable(boolean cacheable) { + } + + private Object sendReceiveMessage(Object payload) throws JMSException, NamingException{ + + Session session = jmsResourceFactory.createSession(); + + javax.jms.Message message = jmsResourceFactory.createMessage(session); + operationSelector.setOperationName(operationName,message); + + ((javax.jms.TextMessage)message).setText((String)payload); + + Destination destination = (Destination) context.lookup(jmsBinding.getDestinationName()); + + MessageProducer producer = session.createProducer(destination); + + // create a temporary queue and listen to the response + Destination replyDest = session.createTemporaryQueue(); + message.setJMSReplyTo(replyDest); + + producer.send(message); + producer.close(); + + MessageConsumer consumer = session.createConsumer(replyDest); + jmsResourceFactory.startConnection(); + javax.jms.Message reply = consumer.receive(jmsBinding.getTimeToLive()); + consumer.close(); + + session.close(); + + return ((javax.jms.TextMessage)reply).getText(); + } +} |