我正在尝试让SDK工作,以便从SPARK项目向Azure Service Bus发送一条简单的消息。当我在本地spark环境中本地运行时,代码运行正常。
但是当我向YARN提交时,起初我很难让群集找到JAR文件,现在它执行时出现以下错误:
java.lang.RuntimeException: Service or property not registered: com.microsoft.windowsazure.services.servicebus.ServiceBusContract interface com.microsoft.windowsazure.services.servicebus.ServiceBusContract
我调用服务总线的代码如下,我在使用和不使用类加载器部分的情况下尝试过,仍然是完全相同的问题:
@throws[Exception]
def SendMessageToSB(message: String) {
try {
// Get current context class loader
val contextLoader = Thread.currentThread().getContextClassLoader();
// Change context classloader to class context loader
contextLoader.loadClass("com.microsoft.windowsazure.services.servicebus.ServiceBusContract")
// Call Azure API and reset back the context loader
val config: com.microsoft.windowsazure.Configuration = ServiceBusConfiguration.configureWithSASAuthentication("CTRATEST-NS$")
val service: ServiceBusContract = ServiceBusService.create(config)
val queueInfo: QueueInfo = new QueueInfo("inputdataqueue")
try {
val bm: BrokeredMessage = new BrokeredMessage(message)
service.sendQueueMessage("inputdataqueue", bm)
}
catch {
case e: Exception => {
System.out.print("ServiceException encountered: ")
System.out.println(e.getMessage)
System.exit(-1)
}
}
Thread.currentThread().setContextClassLoader(contextLoader);
}
}
我已经看到了类似暴风雨的线程,但它指出了类加载器问题,因为我使用的是scala,所以这里没有解决。
Azure SDK版本是通过maven构建的0.9.0。
HELP!
答案 0 :(得分:0)
根据我的理解,根据我的经验,我认为您可以尝试下面的代码。
import com.microsoft.windowsazure.services.servicebus.ServiceBusContract
try {
// Get current context class loader
val contextLoader = Thread.currentThread().getContextClassLoader();
// Change context classloader to class context loader
Thread.currentThread().setContextClassLoader(ServiceBusContract.class.getClassLoader))
// Call Azure API and reset back the context loader
val config: com.microsoft.windowsazure.Configuration = ServiceBusConfiguration.configureWithSASAuthentication("CTRATEST-NS$")
val service: ServiceBusContract = ServiceBusService.create(config)
val queueInfo: QueueInfo = new QueueInfo("inputdataqueue")
try {
val bm: BrokeredMessage = new BrokeredMessage(message)
service.sendQueueMessage("inputdataqueue", bm)
} catch {
case e: Exception => {
System.out.print("ServiceException encountered: ")
System.out.println(e.getMessage)
System.exit(-1)
}
}
} catch {
// handle exceptions
} finally {
// Reset back class loader
Thread.currentThread().setContextClassLoader(contextLoader)
}
如果要按名称将类加载到JVM,可以尝试使用下面的代码。
Class.forName("com.microsoft.windowsazure.services.servicebus.ServiceBusContract")