Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java?view=diff&rev=470218&r1=470217&r2=470218 ============================================================================== --- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java (original) +++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java Wed Nov 1 20:08:26 2006 @@ -18,7 +18,9 @@ package org.apache.sandesha2.util; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.OutputStream; +import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Iterator; @@ -220,14 +222,6 @@ sender.runSenderForTheSequence(context, sequenceID); } } - - private static void stopSenderForTheSequence(String sequenceID, ConfigurationContext context) { - Sender sender = (Sender) context.getProperty(Sandesha2Constants.SENDER); - - if (sender!=null) { - sender.stopSenderForTheSequence(sequenceID); - } - } public static void stopSender(ConfigurationContext context) { Sender sender = (Sender) context.getProperty(Sandesha2Constants.SENDER); @@ -267,12 +261,6 @@ if (pollingManager!=null) pollingManager.stopPolling (); } - - private static void stopInvokerForTheSequence(String sequenceID, ConfigurationContext context) { - Invoker invoker = (Invoker) context.getProperty(Sandesha2Constants.INVOKER); - if (invoker!=null) - invoker.stopInvokerForTheSequence(sequenceID); - } public static void stopInvoker(ConfigurationContext context) { Invoker invoker = (Invoker) context.getProperty(Sandesha2Constants.INVOKER); @@ -1148,5 +1136,22 @@ return newMsg; } + + /** + * Returns an Exception as a String + * + * @param exc + * @return + */ + public static String getStackTrace(Throwable exc) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintWriter pw = new PrintWriter(baos); + exc.printStackTrace(pw); + pw.flush(); + String stackTrace = baos.toString(); + return stackTrace; + } + }
Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/SenderWorker.java URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/SenderWorker.java?view=diff&rev=470218&r1=470217&r2=470218 ============================================================================== --- webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/SenderWorker.java (original) +++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/SenderWorker.java Wed Nov 1 20:08:26 2006 @@ -11,7 +11,6 @@ import org.apache.axis2.context.OperationContext; import org.apache.axis2.description.TransportOutDescription; import org.apache.axis2.engine.AxisEngine; -import org.apache.axis2.transport.TransportSender; import org.apache.axis2.transport.TransportUtils; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.commons.logging.Log; @@ -25,11 +24,12 @@ import org.apache.sandesha2.storage.StorageManager; import org.apache.sandesha2.storage.Transaction; import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr; +import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr; import org.apache.sandesha2.storage.beans.SenderBean; +import org.apache.sandesha2.storage.beans.SequencePropertyBean; import org.apache.sandesha2.util.AcknowledgementManager; import org.apache.sandesha2.util.MessageRetransmissionAdjuster; import org.apache.sandesha2.util.MsgInitializer; -import org.apache.sandesha2.util.RMMsgCreator; import org.apache.sandesha2.util.SandeshaUtil; import org.apache.sandesha2.util.TerminateManager; import org.apache.sandesha2.wsrm.TerminateSequence; @@ -52,6 +52,9 @@ public void run () { + if (log.isDebugEnabled()) + log.debug("Enter: SenderWorker::run"); + Transaction transaction = null; try { @@ -76,6 +79,8 @@ boolean continueSending = MessageRetransmissionAdjuster.adjustRetransmittion(rmMsgCtx, senderBean, configurationContext, storageManager); if (!continueSending) { + if (log.isDebugEnabled()) + log.debug("Exit: SenderWorker::run, !continueSending"); return; } @@ -88,6 +93,8 @@ String qualifiedForSending = (String) msgCtx.getProperty(Sandesha2Constants.QUALIFIED_FOR_SENDING); if (qualifiedForSending != null && !qualifiedForSending.equals(Sandesha2Constants.VALUE_TRUE)) { + if (log.isDebugEnabled()) + log.debug("Exit: SenderWorker::run, !qualified for sending"); return; } @@ -101,6 +108,8 @@ ArrayList msgsNotToSend = SandeshaUtil.getPropertyBean(msgCtx.getAxisOperation()).getMsgTypesToDrop(); if (msgsNotToSend != null && msgsNotToSend.contains(new Integer(rmMsgCtx.getMessageType()))) { + if (log.isDebugEnabled()) + log.debug("Exit: SenderWorker::run, message type to be dropped " + rmMsgCtx.getMessageType()); return; } @@ -171,7 +180,55 @@ } catch (Exception e) { String message = SandeshaMessageHelper.getMessage( SandeshaMessageKeys.sendMsgError, e.toString()); - log.error(message, e); + + if (log.isErrorEnabled()) + log.error(message, e); + // Store the Exception as a sequence property to enable the client to lookup the last + // exception time and timestamp. + + // Create a new Transaction + transaction = storageManager.getTransaction(); + + try + { + + // Get the internal sequence id from the context + String internalSequenceId = (String)rmMsgCtx.getProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID); + + // Get the sequence property bean manager + SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropertyBeanMgr(); + + // Add the new sequence property beans. + String exceptionStr = SandeshaUtil.getStackTrace(e); + SequencePropertyBean eBean = + new SequencePropertyBean(internalSequenceId, + Sandesha2Constants.SequenceProperties.LAST_FAILED_TO_SEND_ERROR, + exceptionStr); + + SequencePropertyBean etsBean = + new SequencePropertyBean(internalSequenceId, + Sandesha2Constants.SequenceProperties.LAST_FAILED_TO_SEND_ERROR_TIMESTAMP, + String.valueOf(System.currentTimeMillis())); + + + // Insert the exception bean + seqPropMgr.insert(eBean); + + // Insert the timestamp bean + seqPropMgr.insert(etsBean); + + // Commit the properties + transaction.commit(); + } + catch (Exception e1) + { + if (log.isErrorEnabled()) + log.error(e1); + + if (transaction != null && transaction.isActive()) + transaction.rollback(); + } + } finally { transaction = storageManager.getTransaction(); msgCtx.setProperty(Sandesha2Constants.WITHIN_TRANSACTION, @@ -224,16 +281,30 @@ msgCtx.setProperty(Sandesha2Constants.WITHIN_TRANSACTION, Sandesha2Constants.VALUE_FALSE); } catch (SandeshaStorageException e) { + if (log.isDebugEnabled()) + log.debug(e); if (transaction!=null && transaction.isActive()) transaction.rollback(); } catch (SandeshaException e) { - e.printStackTrace(); + if (log.isDebugEnabled()) + log.debug(e); + if (transaction!=null && transaction.isActive()) + transaction.rollback(); } catch (MissingResourceException e) { - e.printStackTrace(); + if (log.isFatalEnabled()) + log.fatal("Unable to load message bundle", e); + if (transaction!=null && transaction.isActive()) + transaction.rollback(); } catch (AxisFault e) { - e.printStackTrace(); + if (log.isDebugEnabled()) + log.debug(e); + if (transaction!=null && transaction.isActive()) + transaction.rollback(); } catch (Exception e) { - e.printStackTrace(); + if (log.isDebugEnabled()) + log.debug(e); + if (transaction!=null && transaction.isActive()) + transaction.rollback(); } finally { if (transaction!=null && transaction.isActive()) transaction.commit(); @@ -242,6 +313,9 @@ lock.removeWork(workId); } } + + if (log.isDebugEnabled()) + log.debug("Exit: SenderWorker::run"); } private void updateMessage(MessageContext msgCtx1) throws SandeshaException { @@ -347,7 +421,7 @@ log.debug("Exit: Sender::checkForSyncResponses"); } - private boolean isFaultEnvelope(SOAPEnvelope envelope) throws SandeshaException { + private boolean isFaultEnvelope(SOAPEnvelope envelope) { if (log.isDebugEnabled()) log.debug("Enter: Sender::isFaultEnvelope, " + envelope.getBody().getFault()); SOAPFault fault = envelope.getBody().getFault(); Modified: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java?view=diff&rev=470218&r1=470217&r2=470218 ============================================================================== --- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java (original) +++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java Wed Nov 1 20:08:26 2006 @@ -18,14 +18,19 @@ import java.io.File; +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.axiom.om.OMNamespace; +import org.apache.axiom.soap.SOAP11Constants; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; +import org.apache.axis2.Constants.Configuration; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.ConfigurationContextFactory; -import org.apache.axis2.context.MessageContextConstants; import org.apache.axis2.transport.http.SimpleHTTPServer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,18 +45,17 @@ private Log log = LogFactory.getLog(getClass()); int serverPort = DEFAULT_SERVER_TEST_PORT; + private static final String applicationNamespaceName = "http://tempuri.org/"; + private static final String ping = "ping"; + private static final String Text = "Text"; + + public SandeshaClientTest () { super ("SandeshaClientTest"); } - public void setUp () throws AxisFault { + public void setUp () { - String repoPath = "target" + File.separator + "repos" + File.separator + "server"; - String axis2_xml = "target" + File.separator + "repos" + File.separator + "server" + File.separator + "server_axis2.xml"; - - - ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml); - String serverPortStr = getTestProperty("test.server.port"); if (serverPortStr!=null) { @@ -62,6 +66,15 @@ } } + } + + private void startServer() throws AxisFault { + + String repoPath = "target" + File.separator + "repos" + File.separator + "server"; + String axis2_xml = "target" + File.separator + "repos" + File.separator + "server" + File.separator + "server_axis2.xml"; + + + ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml); httpServer = new SimpleHTTPServer (configContext,serverPort); httpServer.start(); try { @@ -69,6 +82,7 @@ } catch (InterruptedException e) { throw new SandeshaException ("sleep interupted"); } + } public void tearDown () throws SandeshaException { @@ -84,6 +98,8 @@ public void testCreateSequenceWithOffer () throws AxisFault,InterruptedException { + startServer(); + String to = "http://127.0.0.1:" + serverPort + "/axis2/services/RMSampleService"; String transportTo = "http://127.0.0.1:" + serverPort + "/axis2/services/RMSampleService"; @@ -95,7 +111,7 @@ Options clientOptions = new Options (); clientOptions.setTo(new EndpointReference (to)); - clientOptions.setProperty(MessageContextConstants.TRANSPORT_URL,transportTo); + clientOptions.setProperty(Configuration.TRANSPORT_URL,transportTo); String sequenceKey = SandeshaUtil.getUUID(); clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey); @@ -156,5 +172,75 @@ // // } + /** + * Tests that the last error and timestamp are set for the simple case of the target service not being available + */ + public void testLastErrorAndTimestamp() throws Exception + { + String to = "http://127.0.0.1:" + serverPort + "/axis2/services/RMSampleService"; + String transportTo = "http://127.0.0.1:" + serverPort + "/axis2/services/RMSampleService"; + + String repoPath = "target" + File.separator + "repos" + File.separator + "client"; + String axis2_xml = "target" + File.separator + "repos" + File.separator + "client" + File.separator + "client_axis2.xml"; + + ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml); + + //clientOptions.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); + Options clientOptions = new Options (); + clientOptions.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI); + + clientOptions.setTo(new EndpointReference (to)); + clientOptions.setProperty(Configuration.TRANSPORT_URL,transportTo); + + String sequenceKey = "sequence1"; + clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey); + + ServiceClient serviceClient = new ServiceClient (configContext,null); + + serviceClient.setOptions(clientOptions); + + serviceClient.fireAndForget(getPingOMBlock("ping1")); + + //starting the server after a wait + Thread.sleep(10000); + + // Check that the last error and last error time stamp have been set + String lastSendError = SandeshaClient.getLastSendError(serviceClient); + long lastSendErrorTime = SandeshaClient.getLastSendErrorTimestamp(serviceClient); + + // Check the values are valid + assertNotNull(lastSendError); + assertTrue(lastSendErrorTime > -1); + + startServer(); + + clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE, "true"); + serviceClient.fireAndForget(getPingOMBlock("ping2")); + + + Thread.sleep(10000); + + SequenceReport sequenceReport = SandeshaClient.getOutgoingSequenceReport(serviceClient); + assertTrue(sequenceReport.getCompletedMessages().contains(new Long(1))); + assertTrue(sequenceReport.getCompletedMessages().contains(new Long(2))); + assertEquals(sequenceReport.getSequenceStatus(),SequenceReport.SEQUENCE_STATUS_TERMINATED); + assertEquals(sequenceReport.getSequenceDirection(),SequenceReport.SEQUENCE_DIRECTION_OUT); + + configContext.getListenerManager().stop(); + serviceClient.cleanup(); + } + + private OMElement getPingOMBlock(String text) { + OMFactory fac = OMAbstractFactory.getOMFactory(); + OMNamespace namespace = fac.createOMNamespace(applicationNamespaceName,"ns1"); + OMElement pingElem = fac.createOMElement(ping, namespace); + OMElement textElem = fac.createOMElement(Text, namespace); + + textElem.setText(text); + pingElem.addChild(textElem); + + return pingElem; + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
