public void run()
	{
		short ret = MsgDumperCmnDef.MSG_DUMPER_SUCCESS;
		MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> The worker thread is running", worker_thread_name);
		while (!exit.get())
		{
			synchronized(this)
			{
// wait for input data
				try
				{
					wait();
					// Move the message
					for (Iterator<MsgDumperCmnDef.MsgCfg> it = buffer_list.iterator() ; it.hasNext() ;)
					{
						MsgDumperCmnDef.MsgCfg new_item = it.next();
//						MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> Move the message[%s] to another buffer", worker_thread_name, new_item);
						write_list.add(new_item);
					}
					buffer_list.clear();
				} 
				catch (InterruptedException e)
				{
					MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> Got an InterruptedException in the thread , due to: %s", worker_thread_name, e.toString());
				}
				catch (Exception e)
				{
					MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> Exception occur while moving the data, due to: %s", worker_thread_name, e.toString());
					ret = MsgDumperCmnDef.MSG_DUMPER_FAILURE_UNKNOWN;
				}
			}

			if (write_list.size() > 0)
			{
// Open the device......
				ret = msg_dumper.open_device();
				if (MsgDumperCmnDef.CheckMsgDumperFailure(ret))
					break;

				Iterator it = write_list.iterator();
				while(it.hasNext())
				{
					ret = msg_dumper.write_msg((MsgDumperCmnDef.MsgCfg)it.next());

					if (MsgDumperCmnDef.CheckMsgDumperFailure(ret))
					{
						MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> Fail to write message, due to %d", worker_thread_name, ret);
						break;
					}
				}
				write_list.clear();

	// Close the device
				ret = msg_dumper.close_device();
				if (MsgDumperCmnDef.CheckMsgDumperFailure(ret))
					break;
			}
		}

		MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Thread[%s]=> The worker thread of writing message is going to die", worker_thread_name);
	}