2013-03-09 5 views
4

я написал просто Java программы (JDK 1.7), в котором перечислены все мои темы Автобусное обслуживание и печатает название каждой темы на стандартный вывод:Подключение Azure Service Bus с Android

  try { 

     String namespace = "myservicebus"; // from azure portal 
     String issuer = "owner"; // from azure portal 
     String key = "asdjklasdjklasdjklasdjklasdjk"; // from azure portal 

     Configuration config = ServiceBusConfiguration.configureWithWrapAuthentication(
       namespace, 
       issuer, 
       key, 
       ".servicebus.windows.net", 
       "-sb.accesscontrol.windows.net/WRAPv0.9"); 

     ServiceBusContract service = ServiceBusService.create(config); 
     ListTopicsResult result = service.listTopics(); 
     List<TopicInfo> infoList = result.getItems(); 
     for(TopicInfo info : infoList){ 
      System.out.println(info.getPath()); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Теперь я пытаюсь запустите этот пример в простом проекте Android (Android 4.2), но он не будет работать. Среда всегда бросками следующее сообщение об ошибке:

java.lang.RuntimeException: Service or property not registered: com.microsoft.windowsazure.services.serviceBus.ServiceBusContract 

Кто-нибудь успешно установил соединение с андроид устройства (или эмулятор) на лазурном сервисной шине?

Поддерживает ли Microsoft Azure-Java-SDK проекты андроида?

Заранее спасибо

+0

Ermm ... вы можете замаскировать свой ключ приложения в своем примере кода выше! –

+0

У вас пробовал тот же пример кода на машине Linux/Mac/Windows? Вы уверены, что это проблема совместимости с Android? –

+0

Ключ приложения скрыт ;-) – stef

ответ

2

Эта ошибка связана с тем, что APK-генерируемой не включают в себя (удалить) информацию ServiceLoader (в META-INF/услуг). Вы можете протестировать себя, удалив его из созданной банки, и увидите, что появляется та же ошибка. В документации говорится, что теперь она поддерживается, но я нашел проблемы с ее использованием.

http://developer.android.com/reference/java/util/ServiceLoader.html

можно включить вручную данные в APK с помощью муравей

Keep 'META-INF/services'-files in apk

После отладки 10h, удаления классов вручную, в том числе META-INF/услуги и т.д., я обнаружил, что Azure SDK использует некоторые классы, не поддерживаемые Android (javax.ws. *), И любая работа для меня работает.

Поэтому я бы рекомендовал использовать REST API в средах Android, найти ниже исходного кода, который я использовал для передачи сообщений в эту тему.

private static String generateSasToken(URI uri) { 
    String targetUri; 
    try { 
     targetUri = URLEncoder 
     .encode(uri.toString().toLowerCase(), "UTF-8") 
     .toLowerCase(); 

     long expiresOnDate = System.currentTimeMillis(); 
     int expiresInMins = 20; // 1 hour 
     expiresOnDate += expiresInMins * 60 * 1000; 
     long expires = expiresOnDate/1000; 
     String toSign = targetUri + "\n" + expires; 

     // Get an hmac_sha1 key from the raw key bytes 
     byte[] keyBytes = sasKey.getBytes("UTF-8"); 
     SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256"); 

     // Get an hmac_sha1 Mac instance and initialize with the signing key 
     Mac mac = Mac.getInstance("HmacSHA256"); 
     mac.init(signingKey); 
     // Compute the hmac on input data bytes 
     byte[] rawHmac = mac.doFinal(toSign.getBytes("UTF-8")); 

     // using Apache commons codec for base64 
//  String signature = URLEncoder.encode(
//  Base64.encodeBase64String(rawHmac), "UTF-8"); 
     String rawHmacStr = new String(Base64.encodeBase64(rawHmac, false),"UTF-8"); 
     String signature = URLEncoder.encode(rawHmacStr, "UTF-8"); 

     // construct authorization string 
     String token = "SharedAccessSignature sr=" + targetUri + "&sig=" 
     + signature + "&se=" + expires + "&skn=" + sasKeyName; 
     return token; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

public static void Send(String topic, String subscription, String msgToSend) throws Exception { 

     String url = uri+topic+"/messages"; 

     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(url); 

     // Add header 
     String token = generateSasToken(new URI(uri)); 
     post.setHeader("Authorization", token); 
     post.setHeader("Content-Type", "text/plain"); 
     post.setHeader(subscription, subscription); 
     StringEntity input = new StringEntity(msgToSend); 
     post.setEntity(input); 

     System.out.println("Llamando al post"); 
     HttpResponse response = client.execute(post); 
     System.out.println("Response Code : " 
       + response.getStatusLine().getStatusCode()); 
     if (response.getStatusLine().getStatusCode() != 201) 
      throw new Exception(response.getStatusLine().getReasonPhrase()); 

} 

Дополнительная информация в REST API Информация о Azure.