Author: ningjiang
Date: Fri May 7 02:42:17 2010
New Revision: 941984
URL: http://svn.apache.org/viewvc?rev=941984&view=rev
Log:
CXF-2793 Provide capability for JMS client to specify separate ReplyTo queue
and listener queue by applying the patch with thanks to Seumas
Modified:
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSOldConfigHolder.java
cxf/trunk/rt/transports/jms/src/main/resources/schemas/wsdl/jms.xsd
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/Server.java
cxf/trunk/testutils/src/main/resources/wsdl/hello_world_doc_lit.wsdl
Modified:
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
---
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java
(original)
+++
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java
Fri May 7 02:42:17 2010
@@ -213,8 +213,14 @@ public class JMSConduit extends Abstract
public javax.jms.Message createMessage(Session session) throws
JMSException {
String messageType = jmsConfig.getMessageType();
+ Destination destination = rtd;
+ String replyToAddress = jmsConfig.getReplyToDestination();
+ if (replyToAddress != null) {
+ destination =
JMSFactory.resolveOrCreateDestination(jmsTemplate, replyToAddress,
+
jmsConfig.isPubSubDomain());
+ }
jmsMessage = JMSUtils.buildJMSMessageFromCXFMessage(jmsConfig,
outMessage, request,
-
messageType, session, rtd,
+
messageType, session, destination,
cid);
if (!exchange.isSynchronous() && !exchange.isOneWay()) {
correlationMap.put(cid, exchange);
Modified:
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
---
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java
(original)
+++
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java
Fri May 7 02:42:17 2010
@@ -80,6 +80,7 @@ public class JMSConfiguration implements
private String targetDestination;
private String replyDestination;
+ private String replyToDestination;
private String messageType = JMSConstants.TEXT_MESSAGE_TYPE;
private boolean pubSubDomain;
private Boolean useConduitIdSelector;
@@ -277,6 +278,14 @@ public class JMSConfiguration implements
this.replyDestination = replyDestination;
}
+ public String getReplyToDestination() {
+ return replyToDestination;
+ }
+
+ public void setReplyToDestination(String replyToDestination) {
+ this.replyToDestination = replyToDestination;
+ }
+
public String getMessageType() {
return messageType;
}
Modified:
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSOldConfigHolder.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSOldConfigHolder.java?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
---
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSOldConfigHolder.java
(original)
+++
cxf/trunk/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSOldConfigHolder.java
Fri May 7 02:42:17 2010
@@ -268,10 +268,16 @@ public class JMSOldConfigHolder {
jmsConfig.setDestinationResolver(jndiDestinationResolver);
jmsConfig.setTargetDestination(endpoint.getDestinationName());
jmsConfig.setReplyDestination(endpoint.getReplyToName());
+ if (address != null) {
+
jmsConfig.setReplyToDestination(address.getJndiReplyToDestinationName());
+ }
} else {
// Use the default dynamic destination resolver
jmsConfig.setTargetDestination(endpoint.getDestinationName());
jmsConfig.setReplyDestination(endpoint.getReplyToName());
+ if (address != null) {
+
jmsConfig.setReplyToDestination(address.getJmsReplyToDestinationName());
+ }
}
}
Modified: cxf/trunk/rt/transports/jms/src/main/resources/schemas/wsdl/jms.xsd
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/transports/jms/src/main/resources/schemas/wsdl/jms.xsd?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
--- cxf/trunk/rt/transports/jms/src/main/resources/schemas/wsdl/jms.xsd
(original)
+++ cxf/trunk/rt/transports/jms/src/main/resources/schemas/wsdl/jms.xsd Fri May
7 02:42:17 2010
@@ -232,6 +232,28 @@
</xs:documentation>
</xs:annotation>
</xs:attribute>
+
+ <xs:attribute name="jndiReplyToDestinationName"
+ type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Used when the ReplyTo address
on the message needs to be different
+ than the listening address of
the consumer. This mostly applies to
+ MQSeries users who are
interacting with remote queues.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="jmsReplyToDestinationName"
+ type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Used when the ReplyTo address
on the message needs to be different
+ than the listening address of
the consumer. This mostly applies to
+ MQSeries users who are
interacting with remote queues.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
<xs:attribute name="connectionUserName"
type="xs:string">
Modified:
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
---
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java
(original)
+++
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java
Fri May 7 02:42:17 2010
@@ -30,6 +30,10 @@ import java.util.concurrent.Future;
import javax.activation.DataHandler;
import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
import javax.xml.namespace.QName;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Binding;
@@ -70,18 +74,29 @@ import org.apache.cxf.testutil.common.Ab
import org.apache.cxf.testutil.common.EmbeddedJMSBrokerLauncher;
import org.apache.cxf.transport.jms.AddressType;
import org.apache.cxf.transport.jms.JMSConduit;
+import org.apache.cxf.transport.jms.JMSConfiguration;
import org.apache.cxf.transport.jms.JMSConstants;
+import org.apache.cxf.transport.jms.JMSFactory;
import org.apache.cxf.transport.jms.JMSMessageHeadersType;
import org.apache.cxf.transport.jms.JMSNamingPropertyType;
+import org.apache.cxf.transport.jms.JMSOldConfigHolder;
import org.apache.cxf.transport.jms.JMSPropertyType;
+import org.apache.cxf.transport.jms.JNDIConfiguration;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;
+import org.apache.cxf.transport.jms.uri.JMSEndpoint;
import org.apache.hello_world_doc_lit.Greeter;
import org.apache.hello_world_doc_lit.PingMeFault;
import org.apache.hello_world_doc_lit.SOAPService2;
+import org.apache.hello_world_doc_lit.SOAPService7;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+import org.springframework.jms.core.SessionCallback;
+import org.springframework.jms.support.destination.DestinationResolver;
+import org.springframework.jndi.JndiTemplate;
public class JMSClientServerTest extends AbstractBusClientServerTestBase {
@@ -1192,4 +1207,70 @@ public class JMSClientServerTest extends
}
}
+
+ @Test
+ public void testReplyToConfig() throws Exception {
+ JMSEndpoint endpoint = new JMSEndpoint();
+
endpoint.setJndiInitialContextFactory("org.apache.activemq.jndi.ActiveMQInitialContextFactory");
+ endpoint.setJndiURL("tcp://localhost:61500");
+ endpoint.setJndiConnectionFactoryName("ConnectionFactory");
+
+ final JMSConfiguration jmsConfig = new JMSConfiguration();
+ JndiTemplate jt = new JndiTemplate();
+
+ jt.setEnvironment(JMSOldConfigHolder.getInitialContextEnv(endpoint));
+
+ JNDIConfiguration jndiConfig = new JNDIConfiguration();
+
jndiConfig.setJndiConnectionFactoryName(endpoint.getJndiConnectionFactoryName());
+ jmsConfig.setJndiTemplate(jt);
+ jmsConfig.setJndiConfig(jndiConfig);
+
+
jmsConfig.setTargetDestination("dynamicQueues/SoapService7.replyto.queue");
+
jmsConfig.setReplyDestination("dynamicQueues/SoapService7.reply.queue");
+
+ final JmsTemplate jmsTemplate =
JMSFactory.createJmsTemplate(jmsConfig, null);
+
+ Thread t = new Thread() {
+ public void run() {
+ Destination destination = (Destination)jmsTemplate.execute(new
SessionCallback() {
+ public Object doInJms(Session session) throws JMSException
{
+ DestinationResolver resolv =
jmsTemplate.getDestinationResolver();
+ return resolv.resolveDestinationName(session,
jmsConfig.getTargetDestination(),
+ false);
+ }
+ });
+
+ final Message message = jmsTemplate.receive(destination);
+ MessageCreator messageCreator = new MessageCreator() {
+ public Message createMessage(Session session) {
+ return message;
+ }
+ };
+
+ destination = (Destination)jmsTemplate.execute(new
SessionCallback() {
+ public Object doInJms(Session session) throws JMSException
{
+ DestinationResolver resolv =
jmsTemplate.getDestinationResolver();
+ return resolv.resolveDestinationName(session,
+
jmsConfig.getReplyDestination(),
+ false);
+ }
+ });
+ jmsTemplate.send(destination, messageCreator);
+ }
+ };
+
+ t.start();
+
+ QName serviceName = getServiceName(new
QName("http://apache.org/hello_world_doc_lit",
+ "SOAPService7"));
+ QName portName = getPortName(new
QName("http://apache.org/hello_world_doc_lit", "SoapPort7"));
+ URL wsdl = getWSDLURL("/wsdl/hello_world_doc_lit.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService7 service = new SOAPService7(wsdl, serviceName);
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ String name = "FooBar";
+ String reply = greeter.greetMe(name);
+ assertEquals(reply, "Hello " + name);
+ }
}
Modified:
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/Server.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/Server.java?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
---
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/Server.java
(original)
+++
cxf/trunk/systests/transports/src/test/java/org/apache/cxf/systest/jms/Server.java
Fri May 7 02:42:17 2010
@@ -38,6 +38,7 @@ public class Server extends AbstractBusT
Object impl4 = new GreeterByteMessageImpl();
Object impl5 = new SoapService6SoapPort6Impl();
Object impl6 = new JmsDestPubSubImpl();
+ Object impl7 = new SoapService7SoapPort7Impl();
Object i1 = new GreeterImplTwoWayJMSAppCorrelationIDNoPrefix();
Object i2 = new GreeterImplTwoWayJMSAppCorrelationIDStaticPrefixEng();
Object i3 = new
GreeterImplTwoWayJMSAppCorrelationIDStaticPrefixSales();
@@ -56,6 +57,7 @@ public class Server extends AbstractBusT
Endpoint.publish("http://testaddr.not.required.byte/", impl4);
Endpoint.publish("http://testaddr.not.required.jms/", impl5);
Endpoint.publish("http://ignore", impl6);
+ Endpoint.publish("", impl7);
Endpoint.publish("", i1);
Endpoint.publish("", i2);
Endpoint.publish("", i3);
Modified: cxf/trunk/testutils/src/main/resources/wsdl/hello_world_doc_lit.wsdl
URL:
http://svn.apache.org/viewvc/cxf/trunk/testutils/src/main/resources/wsdl/hello_world_doc_lit.wsdl?rev=941984&r1=941983&r2=941984&view=diff
==============================================================================
--- cxf/trunk/testutils/src/main/resources/wsdl/hello_world_doc_lit.wsdl
(original)
+++ cxf/trunk/testutils/src/main/resources/wsdl/hello_world_doc_lit.wsdl Fri
May 7 02:42:17 2010
@@ -239,6 +239,20 @@ targetNamespace="http://apache.org/hello
</wsdl:port>
</wsdl:service>
+ <wsdl:service name="SOAPService7">
+ <wsdl:port name="SoapPort7" binding="tns:Greeter_SOAPBinding">
+ <jms:address
+ jndiConnectionFactoryName="ConnectionFactory"
+
jmsDestinationName="dynamicQueues/messageidascorrelationid.SOAPService7Q.text"
+
jmsReplyDestinationName="dynamicQueues/SoapService7.reply.queue"
+
jmsReplyToDestinationName="dynamicQueues/SoapService7.replyto.queue">
+
+ <jms:JMSNamingProperty name="java.naming.factory.initial"
value="org.apache.activemq.jndi.ActiveMQInitialContextFactory"/>
+ <jms:JMSNamingProperty name="java.naming.provider.url"
value="tcp://localhost:61500"/>
+ </jms:address>
+ </wsdl:port>
+ </wsdl:service>
+
<!-- XML Binding based Services-->
<wsdl:service name="XMLService1">
<wsdl:port name="XMLPort1" binding="tns:Greeter_XMLBinding">