diff --git a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java index 7b60ae3..98638ad 100644 --- a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java +++ b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java @@ -288,8 +288,13 @@ public class JMSConduit extends AbstractConduit implements JMSExchangeSender, Me throw new JMSException("Interrupted while correlating " + e.getMessage()); } if (!Boolean.TRUE.equals(exchange.get(CORRELATED))) { - throw new JMSException("Timeout receiving message with correlationId " + if (this.jmsConfig.isIgnoreTimeoutException()) { + throw new RuntimeException("Timeout receiving message with correlationId " + + correlationId); + } else { + throw new JMSException("Timeout receiving message with correlationId " + correlationId); + } } } diff --git a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java index bead3e7..31a53b7 100644 --- a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java +++ b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java @@ -49,6 +49,7 @@ public class JMSConfiguration { private boolean pubSubNoLocal; private Long clientReceiveTimeout = 60000L; private Long serverReceiveTimeout; + private boolean ignoreTimeoutException; private boolean explicitQosEnabled; private int deliveryMode = Message.DEFAULT_DELIVERY_MODE; private int priority = Message.DEFAULT_PRIORITY; @@ -522,4 +523,12 @@ public class JMSConfiguration { this.retryInterval = retryInterval; } + public boolean isIgnoreTimeoutException() { + return ignoreTimeoutException; + } + + public void setIgnoreTimeoutException(boolean ignoreTimeoutException) { + this.ignoreTimeoutException = ignoreTimeoutException; + } + } diff --git a/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/GreeterImplDocBase.java b/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/GreeterImplDocBase.java index 10aaa9c..42147e6 100644 --- a/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/GreeterImplDocBase.java +++ b/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/GreeterImplDocBase.java @@ -30,7 +30,21 @@ public class GreeterImplDocBase implements Greeter { } public String greetMe(String requestType) { - //System.out.println("Reached here :" + requestType); + //System.out.println("Reached here :=========" + requestType); + long timeout = 0; + try { + timeout = Long.parseLong(requestType); + if (timeout != 0) { + if (timeout == 5000) { + Thread.sleep(timeout + 5000); //ensure a timeout on client side + } else { + Thread.sleep(timeout - 15000); //ensure not a timeout on client side + } + } + } catch (Exception ex) { + + } + return "Hello " + requestType; } diff --git a/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java b/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java index 8850520..3cce1d7 100644 --- a/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java +++ b/systests/transport-jms/src/test/java/org/apache/cxf/systest/jms/JMSClientServerTest.java @@ -57,6 +57,7 @@ import org.apache.cxf.hello_world_jms.NoSuchCodeLitFault; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.apache.cxf.testutil.common.EmbeddedJMSBrokerLauncher; +import org.apache.cxf.transport.jms.JMSConduit; import org.apache.cxf.transport.jms.JMSConfigFeature; import org.apache.cxf.transport.jms.JMSConfiguration; import org.apache.cxf.transport.jms.JMSConstants; @@ -154,6 +155,29 @@ public class JMSClientServerTest extends AbstractBusClientServerTestBase { ((java.io.Closeable)greeter).close(); } + + + @Test + public void testTimeout() throws Exception { + QName serviceName = new QName("http://apache.org/hello_world_doc_lit", "SOAPService2"); + QName portName = new QName("http://apache.org/hello_world_doc_lit", "SoapPort2"); + URL wsdl = null; + try { + wsdl = getWSDLURL("/wsdl/hello_world_doc_lit.wsdl"); + } catch (Exception e) { + e.printStackTrace(); + } + SOAPService2 service = new SOAPService2(wsdl, serviceName); + Greeter greeter = service.getPort(portName, Greeter.class); + TimeoutJmsClientThread t1 = new TimeoutJmsClientThread(greeter, 5000); + t1.start(); + Thread.sleep(1000); + TimeoutJmsClientThread t2 = new TimeoutJmsClientThread(greeter, 20000); + t2.start(); + Thread.sleep(25000); + + ((java.io.Closeable)greeter).close(); + } @Test public void docBasicJmsDestinationTest() throws Exception { @@ -639,4 +663,53 @@ public class JMSClientServerTest extends AbstractBusClientServerTestBase { } } + class TimeoutJmsClientThread extends Thread { + + private Greeter greeter; + private long clientTimeout; + private boolean fail; + + TimeoutJmsClientThread(Greeter greeter, long clientTimeout) { + this.greeter = greeter; + this.clientTimeout = clientTimeout; + } + + @Override + public void run() { + + Client client = ClientProxy.getClient(greeter); + System.out.println("the jms conduit is " + ((JMSConduit)client.getConduit())); + ((JMSConduit)client.getConduit()).getJmsConfig().setReceiveTimeout(clientTimeout); + ((JMSConduit)client.getConduit()).getJmsConfig().setIgnoreTimeoutException(true); + //comment out above line will cause "fail("shouldn't catch Timeout exception");" + client.getEndpoint().getOutInterceptors().add(new TibcoSoapActionInterceptor()); + client.getOutInterceptors().add(new LoggingOutInterceptor()); + client.getInInterceptors().add(new LoggingInInterceptor()); + try { + String reply = greeter.greetMe(Long.toString(clientTimeout)); + if (this.clientTimeout == 5000) { + fail("should throw Timeout exception"); + setFail(true); + } + assertNotNull("no response received from service", reply); + //System.out.println("the reply is =========>" + reply); + } catch (RuntimeException ex) { + ex.printStackTrace(); + if (this.clientTimeout == 20000) { + fail("shouldn't catch Timeout exception"); + setFail(true); + } + } + + } + + public boolean isFail() { + return fail; + } + + private void setFail(boolean fail) { + this.fail = fail; + } + + } }