From b622979263a6b72e52ff10f0cabbaf7648ad48b0 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Thu, 15 Dec 2011 23:07:28 +0000
Subject: [PATCH] Catch exception while sending an exception message and add
 shutdownNow().

SVN: 24006
---
 .../serviceconversation/ClientMessenger.java  | 15 +++++++++--
 .../ServiceConversationCollection.java        | 27 +++++++++++++++++--
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/serviceconversation/ClientMessenger.java b/common/source/java/ch/systemsx/cisd/common/serviceconversation/ClientMessenger.java
index 1c824ef843f..8719626ec52 100644
--- a/common/source/java/ch/systemsx/cisd/common/serviceconversation/ClientMessenger.java
+++ b/common/source/java/ch/systemsx/cisd/common/serviceconversation/ClientMessenger.java
@@ -21,6 +21,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.base.exceptions.TimeoutExceptionUnchecked;
 
 /**
  * A class that a client can use to receive messages from a service.
@@ -40,7 +41,13 @@ public class ClientMessenger implements IClientMessenger
 
     private int outgoingMessageIdx;
 
-    public ClientMessenger(ISendingMessenger senderToService)
+    public ClientMessenger(String serviceConversationId, ISendingMessenger senderToService)
+    {
+        this.serviceConversationId = serviceConversationId;
+        this.senderToService = senderToService;
+    }
+
+    ClientMessenger(ISendingMessenger senderToService)
     {
         this.senderToService = senderToService;
     }
@@ -100,6 +107,10 @@ public class ClientMessenger implements IClientMessenger
     @SuppressWarnings("unchecked")
     private <T> T handleMessage(ServiceMessage message, Class<T> messageClass)
     {
+        if (message == null)
+        {
+            throw new TimeoutExceptionUnchecked("Timeout while waiting on message from service.");
+        }
         if (message.isException())
         {
             throw new ServiceExecutionException(message.getConversationId(),
@@ -118,7 +129,7 @@ public class ClientMessenger implements IClientMessenger
         return serviceConversationId;
     }
 
-    public void setServiceConversationId(String serviceConversationId)
+    void setServiceConversationId(String serviceConversationId)
     {
         this.serviceConversationId = serviceConversationId;
     }
diff --git a/common/source/java/ch/systemsx/cisd/common/serviceconversation/ServiceConversationCollection.java b/common/source/java/ch/systemsx/cisd/common/serviceconversation/ServiceConversationCollection.java
index f0b9ea350d1..d6fac7d4f48 100644
--- a/common/source/java/ch/systemsx/cisd/common/serviceconversation/ServiceConversationCollection.java
+++ b/common/source/java/ch/systemsx/cisd/common/serviceconversation/ServiceConversationCollection.java
@@ -126,8 +126,16 @@ public class ServiceConversationCollection implements ISendingMessenger
                                     ex.printStackTrace(pw);
                                     pw.close();
                                     final String errorMessage = new String(os.toByteArray());
-                                    responseMessenger.send(new ServiceMessage(conversationId,
-                                            messenger.nextOutgoingMessageIndex(), errorMessage));
+                                    try
+                                    {
+                                        responseMessenger
+                                                .send(new ServiceMessage(conversationId, messenger
+                                                        .nextOutgoingMessageIndex(), errorMessage));
+                                    } catch (Exception ex2)
+                                    {
+                                        // TODO: improve logging
+                                        ex2.printStackTrace();
+                                    }
                                 }
                             } finally
                             {
@@ -162,6 +170,21 @@ public class ServiceConversationCollection implements ISendingMessenger
         }
     }
 
+    public void shutdownNow()
+    {
+        try
+        {
+            for (ServiceConversationRecord record : conversations.values())
+            {
+                record.getController().cancel(true);
+            }
+            executor.awaitTermination(0, TimeUnit.MILLISECONDS);
+        } catch (Exception ex)
+        {
+            throw new CheckedExceptionTunnel(ex);
+        }
+    }
+
     public boolean hasConversation(String conversationId)
     {
         return conversations.containsKey(conversationId);
-- 
GitLab