diff --git a/zmq_src/ZMQServer.cpp b/zmq_src/ZMQServer.cpp
index d6a05ab40f7a04a1d0ffb1e3c3d6cf9e0b65f7cc..669ca9b319ab7f7994c69b36b490eb4adc34755e 100644
--- a/zmq_src/ZMQServer.cpp
+++ b/zmq_src/ZMQServer.cpp
@@ -30,6 +30,7 @@
 #include "common.h"
 
 #include "SGXException.h"
+#include "ExitRequestedException.h"
 #include "ZMQMessage.h"
 #include "ZMQServer.h"
 #include "sgxwallet_common.h"
@@ -274,12 +275,24 @@ void ZMQServer::doOneServerLoop() {
     }
 }
 
+void ZMQServer::workerThreadProcessNextMessage() {
+    usleep(1000000);
+    cerr << "WORKER LOOP" << endl;
+}
+
 void ZMQServer::workerThreadMessageProcessLoop(ZMQServer* _agent ) {
     CHECK_STATE(_agent);
     _agent->waitOnGlobalStartBarrier();
     // do work forever until told to exit
     while (!isExitRequested) {
-        usleep(1000000);
-        cerr << "WORKER LOOP" << endl;
+        try {
+            _agent->workerThreadProcessNextMessage();
+        } catch (ExitRequestedException& e) {
+            break;
+        } catch (Exception& e) {
+            spdlog::error(string("Caught exception in worker thread loop:") + e.what());
+        }
     }
+
+    spdlog::info("Exit requested. Exiting worker thread.");
 }
\ No newline at end of file
diff --git a/zmq_src/ZMQServer.h b/zmq_src/ZMQServer.h
index 30245cc55b825e0cb9d5ede9ae1b5d8721d05c8a..e6080edd9998e10975760b1dac9017add3e7af5e 100644
--- a/zmq_src/ZMQServer.h
+++ b/zmq_src/ZMQServer.h
@@ -79,6 +79,8 @@ public:
 
     static void workerThreadMessageProcessLoop(ZMQServer* agent );
 
+    void workerThreadProcessNextMessage();
+
 };