我已将我们公司应用程序的 Java 版本从 8 更新到 17。在本地计算机上,它在构建和运行时调用方面都运行良好。同样在 GitHub 上,它与 Junit 测试执行一起部署得很好。
问题是在我在 Heroku 上部署应用程序之后出现的。Heroku 构建成功,但在运行时,当我调用方法时,收到此错误:
"message": "Handler dispatch failed; nested exception is java.lang.reflect.GenericSignatureFormatError: Signature Parse error: expected a class type\n\tRemaining input: java/util/concurrent/CompletableFuture",
Run Code Online (Sandbox Code Playgroud)
它与java反射方法和方法的签名有关。我的控制器剩余方法返回一个 CompletableFuture 对象。CompletableFuture 有点不太好.........
我正在尝试编写一个程序,将几个java工作线程之间的工作分开.问题是,当我从命令行运行它时,它永远不会返回.我没有得到我的提示,最终必须按ctrl-c关闭程序.
我把它简化为以下简单的案例
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestExeServ {
private class ExpensiveTask implements Callable<Integer>{
private final String msg;
public ExpensiveTask(String str){
this.msg = str;
}
@Override
public Integer call() {
System.out.println( "My message was " + msg);
return 1;
}
}
private void run()
{
final ExecutorService exeServ = Executors.newFixedThreadPool(2);
Future<Integer> result = exeServ.submit(new ExpensiveTask("Hello!") );
try {
System.out.println( " Task is done, it returned " + result.get());
} catch (Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) 我想知道是否存在一种从同步方法调用创建CompletableFuture的情况。如果没有,为什么?
长版:
final CompletableFuture<ReturnType> future = new CompletableFuture<>();
final String parameters = "hello";
ReturnType result;
try {
result = syncMethodCall(parameters);
} catch (Exception e) {
future.completeExceptionally(e);
}
future.complete(result);
return future;
Run Code Online (Sandbox Code Playgroud)
所需的简短版本(或同类):
final String parameters = "hello";
return CompletableFuture.superMethod(() -> {syncMethodCall(parameters)});
Run Code Online (Sandbox Code Playgroud) 我试图从使用的方法执行异步调用CompletableFuture.完成该任务后,我试图打印对象DummyObject的值,这些对象是调用异步调用的方法的本地对象.
我想知道它是如何工作的?thread(myThread)在3秒后死亡,DummyObject超出范围,thenAccept中的Async回调仍然打印正确的值.线程是否在DummyObject上获得锁定?或者其他事情正在发生?
请注意,我只是想模拟一个场景.所以我正在使用Thread.stop().
编辑 - 问题是关于thenAccept Consumer如何处理范围?请保持与此相关的答案.
以下计划的输出:
Starting Async stuff
Thread Alive? false
Reached Main end and waiting for 8 more seconds
James T. Kirk
United Federation of Planets
Run Code Online (Sandbox Code Playgroud)
AsyncTest.java
public class AsyncTest {
public static void main(String args[]) {
Thread myThread = new Thread() {
@Override
public void run() {
DummyObject dummyObj = new DummyObject();
dummyObj.setObjectName("James T. Kirk");
dummyObj.setObjectNationality("United Federation of Planets");
System.out.println("Starting Async stuff");
new AsyncTaskExecuter().executeAsync().thenAccept(taskStatus -> {
if(taskStatus.booleanValue()) {
System.out.println(dummyObj.getObjectName()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用java 8 CompletionStages来串行执行2个异步方法,以便在第一个失败时不执行第二个异步方法.但是当我调用thenCompose时,传入的函数似乎在前一个函数完成之前开始(例如:两个函数错误地并行执行.这是代码:
public CompletionStage<Graph> create(Payload payload) {
CompletionStage<BlobInfo> fileFuture = createFile(payload);
CompletionStage<Entity> metadataFuture = createMetadata(payload);
return fileFuture
.thenCompose(ignore -> metadataFuture)
.thenApply(entity ->
buildFromEntity(objectMapper, entity));
}
public CompletionStage<BlobInfo> createFile(Payload payload) {
return CompletableFuture.supplyAsync(() -> {
try {
return
storage.create(
BlobInfo
.newBuilder(payload.bucket, payload.name)
.build(),
payload.data.getBytes());
} catch (StorageException e) {
LOG.error("Failed to write to storage: " + e);
throw new RequestHandlerException(StatusCode.SERVER_ERROR,
"Failed to write to storage.");
}
});
}
public CompletionStage<Entity> createMetadata(Payload payload) {
return CompletableFuture.supplyAsync(() -> createSync(payload));
}
private Entity …Run Code Online (Sandbox Code Playgroud) 在scala中,你可以将未来的集合"映射"到集合的未来:
val l: List[Future[String]] = List(Future {"1"}, Future {"2"})
val x: Future[List[String]] = Future.sequence(l)
Run Code Online (Sandbox Code Playgroud)
如何用kotlin同样的事情?
我正在努力实现这样的目标.这是一个表达意图的组成示例.
我想要所有可完成的期货执行并将所有结果合并到一个结果并返回.因此,对于下面的示例,集合allResults应该具有字符串"one","two","three",每个3次.我希望他们都能并行而不是连续运行.
任何指向我可用于实现此目的的可完成未来的API的指针都将非常有用.
public class Main {
public static void main(String[] args) {
int x = 3;
List<String> allResuts;
for (int i = 0; i < x; i++) {
//call getCompletableFutureResult() and combine all the results
}
}
public static CompletableFuture<List<String>> getCompletableFutureResult() {
return CompletableFuture.supplyAsync(() -> getResult());
}
private static List<String> getResult() {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
return list;
}
}
Run Code Online (Sandbox Code Playgroud) 我有2种方法,这些方法具有要同时运行的不同返回类型。这是我的代码:
public void method(int id) {
final CompletableFuture<List<FooA>> fooACF = CompletableFuture.supplyAsync(() -> generateFooA(id));
final CompletableFuture<List<FooB>> fooBCF = CompletableFuture.supplyAsync(() -> generateFooB(id));
List<FooA> fooAs = fooACF.get();
List<FooB> fooBs = fooBCF.get();
//Do more processesing
}
public List<FooA> generateFooA(int id) {
//code
}
public List<FooB> generateFooB(int id) {
//code
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道这两种方法是否都可以与上面的代码并行运行,或者我是否更好地说:
List<FooA> fooAs = generateFooA(id);
List<FooB> fooBs = generateFooB(id);
Run Code Online (Sandbox Code Playgroud)
如何正确使用可完成的期货才能并行运行这两种方法?
java concurrency java.util.concurrent java-8 completable-future
假设我有一个返回的方法CompleteableFuture[Data]:
def doIt(): CompleteableFuture[Data] = { ... }
Run Code Online (Sandbox Code Playgroud)
而且,有一个非零的机会doIt()可以回归null.我们如何调用,doIt()直到结果不是null没有阻塞调用线程?Scala的方法是什么?
我目前的尝试:
Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用blocking和get.有任何想法吗?
此外,map在事实发生后,有人呼吁这个未来:
val myFuture = Future {
var data: Data = null
blocking {
while (data == null) { data = doIt().get }
}
data
}.map { d => d.someMember }
Run Code Online (Sandbox Code Playgroud)
d.someMemberNullPointerException …
所以我决定开始使用 CompletableFutureJava8,我无法弄清楚这个片段有什么问题:
public static void main(String...strings) throws Exception {
final Supplier<User> makeUserSupplier = () -> makeUser();
final Supplier<String> uuidSupplier = () -> makeUUID();
final CompletableFuture<User> futureUser = CompletableFuture.supplyAsync(makeUserSupplier);
final CompletableFuture<String> futureUUID = CompletableFuture.supplyAsync(uuidSupplier);
CompletableFuture.allOf(futureUser, futureUUID)
.thenApplyAsync(aVoid -> {
final User user = futureUser.join();
final String uuid = futureUUID.join();
return "received user + " + user + " and uuid is " + uuid ;
})
.handle((ok, e) -> {
System.out.println("ok----" + ok);
System.out.println("e----" + e);
return null;
});
} …Run Code Online (Sandbox Code Playgroud) java ×8
java-8 ×5
asynchronous ×4
concurrency ×3
scala ×2
future ×1
heroku ×1
java-17 ×1
kotlin ×1
lambda ×1
reflection ×1
uuid ×1