如何解决DynamoDB插入调用的Vertx超时
我将DynamoDB与Vertx一起使用,并且我的一个顶点因错误而超时
等待30000(ms)答复后超时。地址
str1: i love learning
str2: i love learning
str3: i love learning
&str1: 006FFAA8
&str2: 006FFA9C
&str3: 006FFA90
*str1: i
*str2: i
*str3: i
但是当我异步运行那个DynamoDB保存查询时,我没有这个问题。有人可以建议将DynamoDB与vert.x一起使用的最佳做法吗?
解决方法
默认情况下,在vert.x中,您无法通过事件总线(https://vertx.io/docs/vertx-core/java/#_types_of_messages)传递pojo。
此外,您不需要使用期货,因为vertx可以满足您的大部分需求。
我会使用aws异步客户端,但是您目前无法将其与mapper一起使用。如果您仍想使用映射器,则应该如下所示:
vertx.eventBus().<String>consumer("dynamodb-example",message -> {
try {
CatalogItem catalogItem = Json.decodeValue(message.body(),CatalogItem.class);
dynamoDbMapper.save(catalogItem);
message.reply(Json.encode(catalogItem));
} catch (Exception e) {
message.fail(500,e.getMessage());
}
});
由于他们的SDK被阻止,您可以使用executeBlocking来避免阻止事件总线:
vertx.eventBus().<String>consumer("dynamodb-example",message -> {
vertx.<CatalogItem>executeBlocking(promise -> {
CatalogItem catalogItem = Json.decodeValue(message.body(),CatalogItem.class);
dynamoDbMapper.save(catalogItem);
promise.complete(catalogItem);
},asyncResult -> {
if (asyncResult.succeeded()) {
message.reply(Json.encode(asyncResult.result()));
} else {
message.fail(500,asyncResult.cause().getMessage());
}
});
});
然后您可以称之为:
CatalogItem catalogItem = new CatalogItem();
vertx.eventBus().<String>request("dynamodb-example",Json.encode(catalogItem),asyncResult -> {
if (asyncResult.succeeded()) {
CatalogItem catalogItemResult = Json.decodeValue(asyncResult.result().body(),CatalogItem.class);
// do something
} else {
// handle exception
}
});
您还可以使用JsonObject代替字符串,或者定义自己的编解码器以通过事件总线传递pojo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。