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 2008/11/14 13:01:06 UTC
svn commit: r713983 - in
/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src:
main/java/org/apache/servicemix/jms/
main/java/org/apache/servicemix/jms/multiplexing/
test/java/org/apache/servicemix/jms/
Author: gnodet
Date: Fri Nov 14 04:01:06 2008
New Revision: 713983
URL: http://svn.apache.org/viewvc?rev=713983&view=rev
Log:
SM-1679: smx-jms old, non-soap, in/out, provider/consumer endpoints do not pass JBI Faults correctly
Modified:
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java
servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java
Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/DefaultJmsMarshaler.java Fri Nov 14 04:01:06 2008
@@ -28,7 +28,10 @@
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;
+import javax.xml.transform.Source;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.soap.SoapFault;
import org.apache.servicemix.soap.SoapHelper;
import org.apache.servicemix.soap.marshalers.SoapMessage;
import org.apache.servicemix.soap.marshalers.SoapWriter;
@@ -37,8 +40,15 @@
* Encapsulates the conversion to and from JMS messages
*/
public class DefaultJmsMarshaler implements JmsMarshaler {
+
public static final String CONTENT_TYPE = "MimeContentType";
+ public static final String DONE_JMS_PROPERTY = "JBIDone";
+
+ public static final String FAULT_JMS_PROPERTY = "JBIFault";
+
+ public static final String ERROR_JMS_PROPERTY = "JBIError";
+
private JmsEndpoint endpoint;
public DefaultJmsMarshaler(JmsEndpoint endpoint) {
@@ -47,14 +57,14 @@
/**
* Converts an {@link Exception} into an JMS message. This method will be
- * invoked when the {@link MessageExchange} contains an error.
+ * invoked when the {@link javax.jbi.messaging.MessageExchange} contains an error.
*
* @param e
* Exception to convert
* @param session
* JMS session used to create JMS messages
* @return JMS message
- * @see MessageExchange#getError()
+ * @see javax.jbi.messaging.MessageExchange#getError()
*/
public Message toJMS(Exception e, Session session) throws Exception {
return session.createObjectMessage(e);
@@ -68,7 +78,7 @@
* @param session JMS session used to create JMS messages
* @return JMS version of the specified source SOAP message
* @throws Exception if an IO error occurs
- * @throws JMSException if a JMS error occurs
+ * @throws javax.jms.JMSException if a JMS error occurs
*/
protected Message toJMS(SoapMessage message, Session session) throws Exception {
SoapHelper soapHelper = new SoapHelper(endpoint);
@@ -80,7 +90,7 @@
// create text message
TextMessage msg = session.createTextMessage();
- msg.setText(baos.toString());
+ msg.setText(baos.toString(SourceTransformer.getDefaultCharset()));
// overwrite whatever content-type was passed on to us with the one
// the SoapWriter constructed
@@ -115,6 +125,10 @@
}
}
}
+
+ if (message.getFault() != null) {
+ msg.setBooleanProperty(FAULT_JMS_PROPERTY, true);
+ }
return msg;
}
@@ -130,7 +144,7 @@
* @throws Exception
* if JMS message is an ObjectMessage containing an Exception
* (the containing exception is thrown.)
- * @throws JMSException
+ * @throws javax.jms.JMSException
* if a JMS problem occurs
* @throws UnsupportedOperationException
* if the JMS message is an ObjectMessage which contains
@@ -178,6 +192,11 @@
String contentType = message.getStringProperty(CONTENT_TYPE);
SoapMessage soap = soapHelper.getSoapMarshaler().createReader().read(is, contentType);
+ if (message.getBooleanProperty(FAULT_JMS_PROPERTY)) {
+ Source src = soap.getSource();
+ soap.setSource(null);
+ soap.setFault(new SoapFault(SoapFault.SENDER, null, null, null, src));
+ }
return soap;
}
Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/multiplexing/MultiplexingProviderProcessor.java Fri Nov 14 04:01:06 2008
@@ -17,9 +17,11 @@
package org.apache.servicemix.jms.multiplexing;
import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.InOut;
import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.jbi.messaging.RobustInOnly;
import javax.jms.Message;
@@ -75,25 +77,38 @@
endpoint.getServiceUnit().getComponent().getExecutor().execute(new Runnable() {
public void run() {
InOut exchange = null;
+ if (log.isDebugEnabled()) {
+ log.debug("Handling jms message " + message);
+ }
+ String correlationID = null;
try {
- if (log.isDebugEnabled()) {
- log.debug("Handling jms message " + message);
- }
- exchange = (InOut) store.load(message.getJMSCorrelationID());
+ correlationID = message.getJMSCorrelationID();
+ exchange = (InOut) store.load(correlationID);
if (exchange == null) {
- throw new IllegalStateException("Could not find exchange " + message.getJMSCorrelationID());
+ throw new IllegalStateException();
}
+ } catch (Exception e) {
+ log.error("Could not find exchange " + (correlationID == null ? "" : correlationID), e);
+ return;
+ }
+ try {
SoapMessage soap = endpoint.getMarshaler().toSOAP(message);
- NormalizedMessage out = exchange.createMessage();
- soapHelper.getJBIMarshaler().toNMS(out, soap);
- ((InOut) exchange).setOutMessage(out);
- channel.send(exchange);
+ if (soap.getFault() != null) {
+ Fault fault = exchange.createFault();
+ fault.setContent(soap.getSource());
+ exchange.setFault(fault);
+ } else {
+ NormalizedMessage msg = exchange.createMessage();
+ soapHelper.getJBIMarshaler().toNMS(msg, soap);
+ ((InOut) exchange).setOutMessage(msg);
+ }
} catch (Exception e) {
log.error("Error while handling jms message", e);
- if (exchange != null) {
- exchange.setError(e);
- }
- } catch (Throwable e) {
+ exchange.setError(e);
+ }
+ try {
+ channel.send(exchange);
+ } catch (MessagingException e) {
log.error("Error while handling jms message", e);
}
}
Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/AbstractJmsTestSupport.java Fri Nov 14 04:01:06 2008
@@ -16,6 +16,10 @@
*/
package org.apache.servicemix.jms;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
import javax.naming.Context;
import javax.naming.InitialContext;
@@ -26,9 +30,12 @@
import org.apache.activemq.jndi.ActiveMQInitialContextFactory;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.activemq.xbean.BrokerFactoryBean;
+import org.apache.servicemix.MessageExchangeListener;
import org.apache.servicemix.client.DefaultServiceMixClient;
import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.components.util.ComponentSupport;
import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
import org.jencks.GeronimoPlatformTransactionManager;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jms.core.JmsTemplate;
@@ -106,4 +113,29 @@
protected void configureJmsBroker() throws Exception {
}
+
+ protected static class ReturnErrorComponent extends ComponentSupport implements MessageExchangeListener {
+ private Exception exception;
+
+ public ReturnErrorComponent(Exception exception) {
+ this.exception = exception;
+ }
+
+ public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+ if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+ fail(exchange, exception);
+ }
+ }
+ }
+
+ protected static class ReturnFaultComponent extends ComponentSupport implements MessageExchangeListener {
+ public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+ if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+ Fault fault = exchange.createFault();
+ fault.setContent(new StringSource("<fault/>"));
+ fail(exchange, fault);
+ }
+ }
+ }
+
}
Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java?rev=713983&r1=713982&r2=713983&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JMSComponentTest.java Fri Nov 14 04:01:06 2008
@@ -20,6 +20,8 @@
import java.net.URI;
import java.net.URL;
+import javax.activation.DataHandler;
+import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.InOut;
import javax.jbi.messaging.NormalizedMessage;
@@ -27,6 +29,7 @@
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
+import javax.mail.util.ByteArrayDataSource;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
@@ -71,6 +74,7 @@
File path = new File(new URI(url.toString()));
path = path.getParentFile();
component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+ component.getServiceUnitManager().init("provider", path.getAbsolutePath());
component.getServiceUnitManager().start("provider");
// Call it
@@ -108,6 +112,7 @@
File path = new File(new URI(url.toString()));
path = path.getParentFile();
component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+ component.getServiceUnitManager().init("provider", path.getAbsolutePath());
component.getServiceUnitManager().start("provider");
// Call it
@@ -139,6 +144,7 @@
File path = new File(new URI(url.toString()));
path = path.getParentFile();
component.getServiceUnitManager().deploy("consumer", path.getAbsolutePath());
+ component.getServiceUnitManager().init("consumer", path.getAbsolutePath());
component.getServiceUnitManager().start("consumer");
// Send test message
@@ -175,6 +181,7 @@
File path = new File(new URI(url.toString()));
path = path.getParentFile();
component.getServiceUnitManager().deploy("provider", path.getAbsolutePath());
+ component.getServiceUnitManager().init("provider", path.getAbsolutePath());
component.getServiceUnitManager().start("provider");
// Deploy Consumer SU
@@ -183,19 +190,59 @@
path = new File(new URI(url.toString()));
path = path.getParentFile();
component.getServiceUnitManager().deploy("consumer", path.getAbsolutePath());
+ component.getServiceUnitManager().init("consumer", path.getAbsolutePath());
component.getServiceUnitManager().start("consumer");
- // Call it
- InOut inout = client.createInOutExchange();
+ InOut inout = null;
+ boolean result = false;
+ DataHandler dh = null;
+
+ // Test successful return
+ inout = client.createInOutExchange();
inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
- boolean result = client.sendSync(inout);
+ dh = new DataHandler(new ByteArrayDataSource("myImage", "application/octet-stream"));
+ inout.getInMessage().addAttachment("myImage", dh);
+ result = client.sendSync(inout);
assertTrue(result);
NormalizedMessage out = inout.getOutMessage();
assertNotNull(out);
Source src = out.getContent();
assertNotNull(src);
+ dh = out.getAttachment("myImage");
+ assertNotNull(dh);
+
logger.info(new SourceTransformer().toString(src));
+
+ // Test fault return
+ container.deactivateComponent("receiver");
+ ReturnFaultComponent fault = new ReturnFaultComponent();
+ ActivationSpec asFault = new ActivationSpec("receiver", fault);
+ asFault.setService(new QName("http://jms.servicemix.org/Test", "Echo"));
+ container.activateComponent(asFault);
+
+ inout = client.createInOutExchange();
+ inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
+ inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+ result = client.sendSync(inout);
+ assertTrue(result);
+ assertNotNull(inout.getFault());
+ client.done(inout);
+
+ // Test error return
+ container.deactivateComponent("receiver");
+ ReturnErrorComponent error = new ReturnErrorComponent(new IllegalArgumentException());
+ ActivationSpec asError = new ActivationSpec("receiver", error);
+ asError.setService(new QName("http://jms.servicemix.org/Test", "Echo"));
+ container.activateComponent(asError);
+
+ inout = client.createInOutExchange();
+ inout.setInterfaceName(new QName("http://jms.servicemix.org/Test", "ProviderInterface"));
+ inout.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+ client.sendSync(inout);
+ assertEquals(ExchangeStatus.ERROR, inout.getStatus());
+ assertTrue("An IllegalArgumentException was expected", inout.getError() instanceof IllegalArgumentException);
+
}
}