1 package com.smartdevicelink.messageDispatcher;
\r
3 import java.util.Comparator;
\r
4 import java.util.concurrent.PriorityBlockingQueue;
\r
6 import com.smartdevicelink.util.DebugTool;
\r
8 public class ProxyMessageDispatcher<messageType> {
\r
9 PriorityBlockingQueue<messageType> _queue = null;
\r
10 private Thread _messageDispatchingThread = null;
\r
11 IDispatchingStrategy<messageType> _strategy = null;
\r
13 // Boolean to track if disposed
\r
14 private Boolean dispatcherDisposed = false;
\r
16 public ProxyMessageDispatcher(String THREAD_NAME, Comparator<messageType> messageComparator,
\r
17 IDispatchingStrategy<messageType> strategy) {
\r
18 _queue = new PriorityBlockingQueue<messageType>(10, messageComparator);
\r
20 _strategy = strategy;
\r
22 // Create dispatching thread
\r
23 _messageDispatchingThread = new Thread(new Runnable() {public void run(){handleMessages();}});
\r
24 _messageDispatchingThread.setName(THREAD_NAME);
\r
25 _messageDispatchingThread.setDaemon(true);
\r
26 _messageDispatchingThread.start();
\r
29 public void dispose() {
\r
30 dispatcherDisposed = true;
\r
32 if(_messageDispatchingThread != null) {
\r
33 _messageDispatchingThread.interrupt();
\r
34 _messageDispatchingThread = null;
\r
38 private void handleMessages() {
\r
41 messageType thisMessage;
\r
43 while(dispatcherDisposed == false) {
\r
44 thisMessage = _queue.take();
\r
45 _strategy.dispatch(thisMessage);
\r
47 } catch (InterruptedException e) {
\r
48 // Thread was interrupted by dispose() method, no action required
\r
50 } catch (Exception e) {
\r
51 DebugTool.logError("Error occurred dispating message.", e);
\r
52 _strategy.handleDispatchingError("Error occurred dispating message.", e);
\r
56 public void queueMessage(messageType message) {
\r
58 _queue.put(message);
\r
59 } catch(ClassCastException e) {
\r
60 _strategy.handleQueueingError("ClassCastException encountered when queueing message.", e);
\r
61 } catch(Exception e) {
\r
62 _strategy.handleQueueingError("Exception encountered when queueing message.", e);
\r