2014-10-27 3 views
0

Мне нужен проект, чтобы сделать одностороннее соединение rabbitmq, которое я могу перезапустить при переключении потери/интернет-провайдера. Моя проблема заключается в том, что соединение реализуется в другом потоке (асинхронной) из-за политики основного потока android. Я использую это соединение для двух сервисов, которые потребляют и толкают.Android, использующий односвязное соединение rabbitmq

public class RabbitSingletonConnection { 

     public static RabbitSingletonConnection instance; 
     private Connection connection; 

     private RabbitSingletonConnection() { 

     } 

     public static RabbitSingletonConnection getInstance() { 
      if (instance == null) { 
       instance = new RabbitSingletonConnection(); 
      } 
      return instance; 
     } 

     public void Connect(RabbitMQConnectionCallback callback) { 
      if (connection != null && connection.isOpen()) { 
       LogUtil.hecsLog("RabbitSingletonConnection", "already connected"); 
       callback.onConnect(connection); 
       return; 
      } 
      new RabbitConnectAsync(callback).execute("ip","user", "pass"); 
     } 

     public void setConnection(Connection connection) { 
      this.connection = connection; 
     } 

     public Connection getConnection() { 
      return connection; 
     } 
    } 

Проблема в том, что этот LogUtil.hecsLog("RabbitSingletonConnection", "already connected"); никогда не возникает. Я копал и обнаружил что-то «Thread safe singleton с использованием объявления classloader или подхода ENUM», но это не включает метод обратного вызова.

EDIT

RabbitSingletonConnection.getInstance().Connect(new RabbitMQConnectionCallback() { 

     @Override 
     public void onConnect(Connection result) { 
      if (result != null && result.isOpen()){ 
       RabbitSingletonConnection.getInstance().setConnection(result); 
       LogUtil.hecsLog(LOG, "Service has started"); 
      } 


     } 
    }); 

Это пример Is it necessary to rebuild RabbitMQ connection each time a message is to be sent, но я не могу сделать соединение в конструкторе, поскольку он нуждается в поток для обработки TimeoutException.

Моя цель - начать сервис после соединения задачи async rabbitMQ.

Нужна ли мне инъекция зависимостей?

+0

Метод RabbitConnectAsync вызывает setConnection? Потому что, если это не так, переменная соединения всегда будет равна нулю. –

+0

Да, обе службы делают. Проблема в том, что все мое приложение основано на потоках. –

+0

Вторая услуга запускается при первом подключении, поэтому она возвращает нулевое соединение. –

ответ

0

Я думаю, что я понял, я начал/прекратил услуги по увеличению/потере связи. Я смотрел приложение facebook, и службы никогда не останавливались, поэтому логический ответ - сбросить рабочий процесс в службе, а не службу.

Смежные вопросы