Azure EventHub получить не работает в Linux
Я работаю над проектом, где я читаю события устройства из лазурного IotHub. Я использовал код, указанный в ссылке. Я использую весеннюю загрузку для своего проекта. Код работал совершенно нормально на моей машине с Windows, но когда я развернул код на моем сервере (Linux-машине), Azure EventHub не работает. Я также пробовал код на локальной машине Linux, и я столкнулся с той же проблемой, приложения выдают ошибку ниже и не получают никаких новых событий. Я также включил порты 5671 и 9352.
Error:
"Operation not allowed after the com.microsoft.azure.servicebus.MessageReceiver instance is Closed."
**Code**:
public class ReceiveEventService {
public void startListening() {
EventHubClient client0 = receiveMessages("0");
EventHubClient client1 = receiveMessages("1");
try {
log.info(this.getClass(), "startListening", "Started listening to azure");
System.in.read();
client0.closeSync();
client1.closeSync();
System.exit(0);
} catch (ServiceBusException | IOException e) {
log.error(this.getClass(), "error in azure startListening", e);
}
}
private EventHubClient receiveMessages(final String partitionId) {
EventHubClient client = null;
try {
client = EventHubClient.createFromConnectionStringSync(deviceEndPointString);
} catch (Exception e) {
log.error(this.getClass(), "receiveMessages - Failed to create client", e);
System.exit(1);
}
try {
client.createReceiver(EventHubClient.DEFAULT_CONSUMER_GROUP_NAME, partitionId, Instant.now())
.thenAccept(new Consumer<PartitionReceiver>() {
public void accept(PartitionReceiver receiver) {
log.info(this.getClass(), "receiveMessages",
" *Created receiver on partition " + partitionId);
try {
while (true) {
Iterable<EventData> receivedEvents = receiver.receive(100).get();
int batchSize = 0;
if (receivedEvents != null) {
for (EventData receivedEvent : receivedEvents) {
log.info(this.getClass(), "receiveMessages", "Device ID:"
+ receivedEvent.getSystemProperties()
.get("iothub-connection-device-id")
+ " offset:" + receivedEvent.getSystemProperties().getOffset()
+ " EnqueueTime:"
+ receivedEvent.getSystemProperties().getEnqueuedTime() + "SeqNo:"
+ receivedEvent.getSystemProperties().getSequenceNumber());
batchSize++;
}
}
log.debug(this.getClass(), "receiveMessages:",
"Partition " + partitionId + " ReceivedBatch size" + batchSize);
}
} catch (Exception e) {
log.error(this.getClass(), "receiveMessages-Failed to receive messages", e);
}
}
});
} catch (Exception e) {
log.error(this.getClass(), "receiveMessages-Failed to create receiver", e);
}
return client;
}
}
Зависимости в моем pom.xml, как показано ниже.
<dependency>
<groupId>com.microsoft.azure.sdk.iot</groupId>
<artifactId>iot-service-client</artifactId>
<version>1.3.19</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-eventhubs-eph</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-eventhubs</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure.sdk.iot</groupId>
<artifactId>iot-device-client</artifactId>
<version>1.1.26</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-servicebus</artifactId>
<version>0.9.7</version>
</dependency>
Мой основной класс, как показано ниже. Выполнение моего кода также работает нормально в Linux, но только часть Azure EventHub выдает ошибку и не работает.
@SpringBootApplication
public class AzureApplication extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(AzureApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AzureApplication.class);
}
}
1 ответ
Я прокомментировал строки "client.closeSync()", и все стало отлично работать как на моей локальной машине с Linux, так и на виртуальной машине Azure (linux). Я не уверен, что это правильный подход, но обходной путь, кажется, работает на данный момент.
`public void startListening() {
EventHubClient client0 = receiveMessages("0");
EventHubClient client1 = receiveMessages("1");
try {
log.info(this.getClass(), "startListening", "Started listening to azure");
// System.in.read();
// client0.closeSync();
// client1.closeSync();
// System.exit(0);
} catch (Exception e) {
log.error("error in azure startListening", e);
}
}`