J.U.C-FutureTask

Callable与Runnable深入解析
本文详细对比了Callable与Runnable接口,介绍了Future接口的功能,重点解析了FutureTask的原理,包括其状态转换、构造、运行、取消及结果获取过程,以及ScheduledFutureTask的周期/延迟执行特性。

Callable 与Runnable 接口对比

Runnable 是个接口,只有一个方法run(),实现Runnable的run(),把要实现的逻辑写到run()中,然后启动线程就行;
Callable 代码也很简单,不同的是,Callable 是个泛型接口,call(),返回类型是传入的泛型,Callable 与Runnable大致相似,Callable 功能更强大写,主要是Callable 执行后有返回值,并且能够抛出异常

Future 接口

对于具体的Callable 或者Runnable任务,它可以进行取消,查询任务是否被取消,查询是否完成,以及获取结果等等,通常都是异步执行的,不能直接从别的线程直接得到方法返回值,Future可以监视目标线程调用call的情况,当调用future的get方式时,可以获取线程结果,这时线程不会直接完成,当前线程就开始阻塞,知道call 方法返回结果 ,才继续执行,总之,Future可以获取其他线程的返回值。
在这里插入图片描述
执行结果:
在这里插入图片描述

FutureTask

在这里插入图片描述

FutureTask的父类是RunnableFuture ,RunnableFuture 继承了Runnable, Future,由此我们知道FutureTask 也可执行Callable类型的任务,如果构造函数参数是Runnable的话,它会转换成Callable类型,FutureTask 实现了Runnable, Future两个接口,所以FutureTask 既可以作为Runnable被线程执行, 又可以作为Future,得到Callable的返回值, 这个组合使用的好处:假如有个很费时的逻辑需要被计算,并且返回这个值,同时,这个值又不是马上需要,用另外一个线程去计算这个操作,当前线程可以做其他操作,等到需要这个返回值时,在用future得到。

在这里插入图片描述
执行结果:
在这里插入图片描述

FutureTask原理

在J.U.C提供的Future模式中,最重要的就是FutureTask类,FutureTask是在JDK1.5时,随着J.U.C一起引入的,它代表着一个异步任务,这个任务一般提交给Executor执行,当然也可以由调用方直接调用run方法运行。

clipboard.png

既然是任务,就有状态,FutureTask一共给任务定义了7种状态:
在这里插入图片描述
NEW:表示任务的初始化状态;
COMPLETING:表示任务已执行完成(正常完成或异常完成),但任务结果或异常原因还未设置完成,属于中间状态;
NORMAL:表示任务已经执行完成(正常完成),且任务结果已设置完成,属于最终状态;
EXCEPTIONAL:表示任务已经执行完成(异常完成),且任务异常已设置完成,属于最终状态;
CANCELLED:表示任务还没开始执行就被取消(非中断方式),属于最终状态;
INTERRUPTING:表示任务还没开始执行就被取消(中断方式),正式被中断前的过渡状态,属于中间状态;
INTERRUPTED:表示任务还没开始执行就被取消(中断方式),且已被中断,属于最终状态。

各个状态之间的状态转换图如下:
在这里插入图片描述
上图需要注意的是两点:

  1. FutureTask虽然支持任务的取消(cancel方法),但是只有当任务是初始化(NEW状态)时才有效,否则cancel方法直接返回false;
  2. 当执行任务时(run方法),无论成功或异常,都会先过渡到COMPLETING状态,直到任务结果设置完成后,才会进入响应的终态。

JDK1.7之前,FutureTask通过内部类实现了AQS框架来实现功能。 JDK1.7及以后,则改变为直接通过Unsafe类CAS操作state状态字段来进行同步。

构造

FutureTask在构造时可以接受Runnable或Callable任务,如果是Runnable,则最终包装成Callable:
在这里插入图片描述
在这里插入图片描述

上述的Executors.callable()方法,其实就是对Runnable对象做了适配,返回Callable适配对象——RunnableAdapter:
在这里插入图片描述
在这里插入图片描述

FutureTask的字段定义非常简单,State标识任务的当前状态,状态之间的转换通过Unsafe来操作,所有操作都基于自旋+CAS完成:

private volatile int state;
private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static final int CANCELLED = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED = 6;
 
private Callable<V> callable;       // 真正的任务
private volatile Thread runner;     // 保存正在执行任务的线程
 
/**
 * 记录结果或异常
 */
private Object outcome;
 
/**
 * 无锁栈(Treiber stack)
 * 保存等待线程
 */
private volatile WaitNode waiters;

注意waiters这个字段,waiters指向一个“无锁栈”,该栈保存着所有等待线程,我们知道当调用FutureTask的get方法时,如果任务没有完成,则调用线程会被阻塞,其实就是将线程包装成WaitNode结点保存到waiters指向的栈中:
在这里插入图片描述
在这里插入图片描述

任务的运行

FutureTask的运行就是调用了run方法:
在这里插入图片描述
上述方法,首先判断当前任务的state是否等于NEW,如果不为NEW则说明任务或者已经执行过,或者已经被取消,直接返回。

正常执行完成后,会调用set方法设置任务执行结果:

在这里插入图片描述
如果任务执行过程中抛出异常,则调用setException设置异常信息:
在这里插入图片描述

任务的取消

cancel方法用于取消任务,参数mayInterruptIfRunning如果为true,表示中断正在执行任务的线程,否则仅仅是将任务状态置为CANCELLED :
在这里插入图片描述
任务取消后,最终调用finishCompletion方法,释放所有在栈上等待的线程:
在这里插入图片描述

结果获取

FutureTask可以通过get方法获取任务结果,如果需要限时等待,可以调用get(long timeout, TimeUnit unit)。
在这里插入图片描述
可以看到,如果当前任务的状态是NEW或COMPLETING,会调用awaitDone阻塞线程。否则会认为任务已经完成,直接通过report方法映射结果:
在这里插入图片描述
report会根据任务的状态进行映射,如果任务是Normal状态,说明正常执行完成,则返回任务结果;如果任务被取消(CANCELLED或INTERRUPTED),则抛出CancellationException;其它情况则抛出ExecutionException。
在这里插入图片描述

ScheduledFutureTask

ScheduledFutureTask是ScheduledThreadPoolExecutor这个线程池的默认调度任务类。
ScheduledFutureTask在普通FutureTask的基础上增加了周期执行/延迟执行的功能。通过下面的类图可以看到,它其实是通过继承FutureTask和Delayed接口来实现周期/延迟功能的。
在这里插入图片描述
在这里插入图片描述
ScheduledFutureTask的源码非常简单,基本都是委托FutureTask来实现的,关键是看下运行任务的方法:
在这里插入图片描述
FutureTask的runAndReset方法与run方法的区别就是当任务正常执行完成后,不会设置任务的最终状态(即保持NEW状态),以便任务重复执行:
在这里插入图片描述

java.net.SocketException: Connection reset at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:328) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:355) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:808) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484) at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478) at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426) at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:589) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1665) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589) at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308) at com.intellij.util.io.HttpRequests.openConnection(HttpRequests.java:619) at com.intellij.util.io.HttpRequests$RequestImpl.getConnection(HttpRequests.java:361) at com.intellij.ide.plugins.marketplace.MarketplaceRequests$Companion.readOrUpdateFile$lambda$8(MarketplaceRequests.kt:185) at com.intellij.util.io.HttpRequests.doProcess(HttpRequests.java:524) at com.intellij.util.io.HttpRequests.process(HttpRequests.java:506) at com.intellij.util.io.HttpRequests$RequestBuilderImpl.connect(HttpRequests.java:335) at com.intellij.ide.plugins.marketplace.MarketplaceRequests$Companion.readOrUpdateFile(MarketplaceRequests.kt:182) at com.intellij.ide.plugins.marketplace.MarketplaceRequests.getMarketplacePlugins(MarketplaceRequests.kt:273) at com.intellij.openapi.updateSettings.impl.UpdateChecker.findUpdatesInJetBrainsRepository(UpdateChecker.kt:377) at com.intellij.openapi.updateSettings.impl.UpdateChecker.updateDescriptorsForInstalledPlugins$lambda$6(UpdateChecker.kt:239) at com.intellij.openapi.application.impl.ApplicationImpl$2.run(ApplicationImpl.java:249) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at com.intellij.util.concurrency.ContextCallable.call(ContextCallable.java:32) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at com.intellij.util.concurrency.ContextRunnable.run(ContextRunnable.java:27) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699) at java.base/java.lang.Thread.run(Thread.java:840) 2025-05-27 10:00:18,485 [ 45143] SEVERE - #c.i.o.a.i.ApplicationImpl - IntelliJ IDEA 2023.3.6 Build #IC-233.15026.9 2025-05-27 10:00:18,486 [ 45144] SEVERE - #c.i.o.a.i.ApplicationImpl - JDK: 17.0.10; VM: OpenJDK 64-Bit Server VM; Vendor: JetBrains s.r.o. 2025-05-27 10:00:18,486 [ 45144] SEVERE - #c.i.o.a.i.ApplicationImpl - OS: Linux 2025-05-27 10:00:35,395 [ 62053] WARN - #c.i.u.x.Binding - no accessors for com.intellij.ide.util.TipsUsageManager$State 2025-05-27 10:03:08,978 [ 215636] WARN - #c.i.o.o.e.ConfigurableCardPanel - auto-dispose '插件' id=preferences.pluginManager 2025-05-27 10:03:14,142 [ 220800] WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: language for id: preferences.language.Kotlin.scripting 2025-05-27 10:03:49,540 [ 256198] WARN - #c.i.o.o.e.ConfigurableCardPanel - auto-dispose '插件' id=preferences.pluginManager 2025-05-27 10:06:00,498 [ 387156] WARN - #c.i.f.f.SettingsConnectionService - Read timed out java.net.SocketTimeoutException: Read timed out at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:288) at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:314) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:355) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:808) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484) at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478) at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426) at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:589) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1665) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589) at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308) at com.intellij.util.io.HttpRequests.openConnection(HttpRequests.java:619) at com.intellij.util.io.HttpRequests$RequestImpl.getConnection(HttpRequests.java:361) at com.intellij.util.io.HttpRequests$RequestImpl.getInputStream(HttpRequests.java:369) at com.intellij.facet.frameworks.SettingsConnectionService.lambda$readSettings$0(SettingsConnectionService.java:51) at com.intellij.util.io.HttpRequests.doProcess(HttpRequests.java:524) at com.intellij.util.io.HttpRequests.process(HttpRequests.java:506) at com.intellij.util.io.HttpRequests$RequestBuilderImpl.connect(HttpRequests.java:335) at com.intellij.util.io.RequestBuilder.connect(RequestBuilder.java:58) at com.intellij.facet.frameworks.SettingsConnectionService.readSettings(SettingsConnectionService.java:48) at com.intellij.facet.frameworks.SettingsConnectionService.getSettingValue(SettingsConnectionService.java:75) at com.intellij.facet.frameworks.SettingsConnectionService.getServiceUrl(SettingsConnectionService.java:68) at org.jetbrains.plugins.scala.statistics.CompilerPluginsWhiteList$.createRequestUrl(CompilerPluginsWhiteList.scala:23) at org.jetbrains.plugins.scala.statistics.CompilerPluginsWhiteList$.get$lzycompute(CompilerPluginsWhiteList.scala:15) at org.jetbrains.plugins.scala.statistics.CompilerPluginsWhiteList$.get(CompilerPluginsWhiteList.scala:13) at org.jetbrains.plugins.scala.statistics.ScalaProjectStateCollector$.<clinit>(ScalaProjectStateCollector.scala:75) at org.jetbrains.plugins.scala.statistics.ScalaProjectStateCollector.getGroup(ScalaProjectStateCollector.scala:27) at com.intellij.internal.statistic.service.fus.collectors.FeatureUsagesCollector.getGroupId(FeatureUsagesCollector.java:37) at com.intellij.internal.statistic.service.fus.collectors.FeatureUsagesCollector.isValid(FeatureUsagesCollector.java:27) at com.intellij.internal.statistic.service.fus.collectors.UsageCollectors.isValidCollector(UsageCollectors.kt:53) at com.intellij.internal.statistic.service.fus.collectors.UsageCollectors.access$isValidCollector(UsageCollectors.kt:9) at com.intellij.internal.statistic.service.fus.collectors.UsageCollectors$getProjectCollectors$2.invoke(UsageCollectors.kt:48) at com.intellij.internal.statistic.service.fus.collectors.UsageCollectors$getProjectCollectors$2.invoke(UsageCollectors.kt:48) at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:171) at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:194) at kotlin.sequences.SequencesKt___SequencesKt.toList(_Sequences.kt:816) at com.intellij.internal.statistic.service.fus.collectors.UsageCollectors.getProjectCollectors$intellij_platform_statistics(UsageCollectors.kt:49) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger$logProjectState$2.invokeSuspend(FUStateUsagesLogger.kt:225) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger$logProjectState$2.invoke(FUStateUsagesLogger.kt) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger$logProjectState$2.invoke(FUStateUsagesLogger.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger.logProjectState(FUStateUsagesLogger.kt:223) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger.logProjectStateRegularly(FUStateUsagesLogger.kt:218) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger.access$logProjectStateRegularly(FUStateUsagesLogger.kt:198) at com.intellij.internal.statistic.service.fus.collectors.ProjectFUStateUsagesLogger$logProjectStateRegularly$1.invokeSuspend(FUStateUsagesLogger.kt) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684) 2025-05-27 10:22:25,846 [1372504] WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: language for id: preferences.language.Kotlin.scripting 2025-05-27 10:22:28,924 [1375582] SEVERE - #c.i.o.a.i.ApplicationImpl - 连接被拒绝 java.net.ConnectException: 连接被拒绝 at java.base/sun.nio.ch.Net.pollConnect(Native Method) at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:554) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:533) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:638) at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:266) at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:380) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1287) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1128) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1665) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589) at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308) at com.intellij.util.io.HttpRequests.openConnection(HttpRequests.java:619) at com.intellij.util.io.HttpRequests$RequestImpl.getConnection(HttpRequests.java:361) at com.intellij.ide.plugins.marketplace.MarketplaceRequests$Companion.readOrUpdateFile$lambda$8(MarketplaceRequests.kt:185) at com.intellij.util.io.HttpRequests.doProcess(HttpRequests.java:524) at com.intellij.util.io.HttpRequests.process(HttpRequests.java:506) at com.intellij.util.io.HttpRequests$RequestBuilderImpl.connect(HttpRequests.java:335) at com.intellij.ide.plugins.marketplace.MarketplaceRequests$Companion.readOrUpdateFile(MarketplaceRequests.kt:182) at com.intellij.ide.plugins.marketplace.MarketplaceRequests.getMarketplacePlugins(MarketplaceRequests.kt:273) at com.intellij.openapi.updateSettings.impl.UpdateChecker.findUpdatesInJetBrainsRepository(UpdateChecker.kt:377) at com.intellij.openapi.updateSettings.impl.UpdateChecker.updateDescriptorsForInstalledPlugins$lambda$6(UpdateChecker.kt:239) at com.intellij.openapi.application.impl.ApplicationImpl$2.run(ApplicationImpl.java:249) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at com.intellij.util.concurrency.ContextCallable.call(ContextCallable.java:32) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at com.intellij.util.concurrency.ContextRunnable.run(ContextRunnable.java:27) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699) at java.base/java.lang.Thread.run(Thread.java:840) 2025-05-27 10:22:28,930 [1375588] SEVERE - #c.i.o.a.i.ApplicationImpl - IntelliJ IDEA 2023.3.6 Build #IC-233.15026.9 2025-05-27 10:22:28,930 [1375588] SEVERE - #c.i.o.a.i.ApplicationImpl - JDK: 17.0.10; VM: OpenJDK 64-Bit Server VM; Vendor: JetBrains s.r.o. 2025-05-27 10:22:28,930 [1375588] SEVERE - #c.i.o.a.i.ApplicationImpl - OS: Linux 2025-05-27 10:22:45,639 [1392297] WARN - #c.i.o.o.e.ConfigurableCardPanel - auto-dispose '插件' id=preferences.pluginManager hadoop@master:/usr/local/idea/bin$
05-28
[root@yfw ~]# cd /etc/systemd/system [root@yfw system]# sudo chown -R openfire:openfire /opt/openfire [root@yfw system]# sudo chmod -R 755 /opt/openfire [root@yfw system]# ls -l /opt/openfire/{conf,logs,embedded-db,plugins} ls: cannot access '/opt/openfire/embedded-db': No such file or directory /opt/openfire/conf: total 12 -rwxr-xr-x 1 openfire openfire 1530 Feb 1 1980 crowd.properties -rwxr-xr-x 1 openfire openfire 2398 Feb 1 1980 openfire-demoboot.xml -rwxr-xr-x 1 openfire openfire 2947 Nov 15 10:58 security.xml /opt/openfire/logs: total 12 -rwxr-xr-x 1 openfire openfire 2693 Nov 15 11:22 nohup.out -rwxr-xr-x 1 openfire openfire 3893 Nov 15 10:58 openfire.log -rwxr-xr-x 1 openfire openfire 8 Nov 15 11:21 openfire.pid /opt/openfire/plugins: total 88 drwxr-xr-x 3 openfire openfire 4096 Sep 16 00:48 admin drwxr-xr-x 5 openfire openfire 4096 Nov 15 10:49 search -rwxr-xr-x 1 openfire openfire 78784 Jun 26 15:12 search.jar [root@yfw system]# ls -l /opt/openfire/conf/ total 12 -rwxr-xr-x 1 openfire openfire 1530 Feb 1 1980 crowd.properties -rwxr-xr-x 1 openfire openfire 2398 Feb 1 1980 openfire-demoboot.xml -rwxr-xr-x 1 openfire openfire 2947 Nov 15 10:58 security.xml [root@yfw system]# nohup "$JAVA" \ > -server \ > -DopenfireHome="$OPENFIRE_HOME" \ > -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" \ > -classpath "$OPENFIRE_HOME/lib/startup.jar" \ > org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 & [1] 1089228 [root@yfw system]# -bash: : No such file or directory [1]+ Exit 1 nohup "$JAVA" -server -DopenfireHome="$OPENFIRE_HOME" -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" -classpath "$OPENFIRE_HOME/lib/startup.jar" org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 [root@yfw system]# nohup "$JAVA" \ > -server \ > -DopenfireHome="$OPENFIRE_HOME" \ > -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" \ > -Dlog4j.configurationFile=file://$OPENFIRE_HOME/lib/log4j2.xml \ > -classpath "$OPENFIRE_HOME/lib/*" \ > org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 & [1] 1089307 [root@yfw system]# -bash: : No such file or directory [1]+ Exit 1 nohup "$JAVA" -server -DopenfireHome="$OPENFIRE_HOME" -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" -Dlog4j.configurationFile=file://$OPENFIRE_HOME/lib/log4j2.xml -classpath "$OPENFIRE_HOME/lib/*" org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 [root@yfw system]# export OPENFIRE_HOME=/opt/openfire [root@yfw system]# export JAVA_HOME=/usr/lib/jvm/java-17-openjdk [root@yfw system]# export JAVA=$JAVA_HOME/bin/java [root@yfw system]# export LOG_FILE=$OPENFIRE_HOME/logs/nohup.out [root@yfw system]# nohup "$JAVA" \ > -server \ > -DopenfireHome="$OPENFIRE_HOME" \ > -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" \ > -Dlog4j.configurationFile=file://$OPENFIRE_HOME/lib/log4j2.xml \ > -classpath "$OPENFIRE_HOME/lib/*" \ > org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 & [1] 1089714 [root@yfw system]# ls -l /opt/openfire/lib/log4j2.xml -rwxr-xr-x 1 openfire openfire 1648 Feb 1 1980 /opt/openfire/lib/log4j2.xml [1]+ Done nohup "$JAVA" -server -DopenfireHome="$OPENFIRE_HOME" -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" -Dlog4j.configurationFile=file://$OPENFIRE_HOME/lib/log4j2.xml -classpath "$OPENFIRE_HOME/lib/*" org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 [root@yfw system]# cat /opt/openfire/logs/openfire.log 2025.11.15 10:58:06.420 INFO [main]: org.jivesoftware.openfire.XMPPServer - Registering shutdown hook (standalone mode) 2025.11.15 10:58:06.989 INFO [main]: org.jivesoftware.util.cache.ConsistencyMonitor - Applying configuration for cache consistency check. Enabled: false 2025.11.15 10:58:07.021 INFO [main]: org.jivesoftware.openfire.XMPPServer - Openfire 5.0.2 [Nov 15, 2025, 10:58:07 AM] 2025.11.15 10:58:07.316 WARN [PluginMonitorTask-2]: org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console: CertificateStoreManager has not been initialized yet. HTTPS will be unavailable. 2025.11.15 10:58:07.441 ERROR [PluginMonitorTask-2]: org.jivesoftware.openfire.container.AdminConsolePlugin - Could not start admin console server java.io.IOException: Failed to bind to ::/[0:0:0:0:0:0:0:0]:9090 at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349) ~[jetty-server-12.0.24.jar:12.0.24] at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:313) ~[jetty-server-12.0.24.jar:12.0.24] at org.eclipse.jetty.server.Server.lambda$doStart$0(Server.java:571) ~[jetty-server-12.0.24.jar:12.0.24] at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:?] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?] at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?] at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992) ~[?:?] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?] at org.eclipse.jetty.server.Server.doStart(Server.java:567) ~[jetty-server-12.0.24.jar:12.0.24] at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) ~[jetty-util-12.0.24.jar:12.0.24] at org.jivesoftware.openfire.container.AdminConsolePlugin.startup(AdminConsolePlugin.java:269) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.container.AdminConsolePlugin.initializePlugin(AdminConsolePlugin.java:373) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.container.PluginManager.loadPlugin(PluginManager.java:637) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.container.PluginMonitor$MonitorTask.run(PluginMonitor.java:338) [xmppserver-5.0.2.jar:5.0.2] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?] at java.lang.Thread.run(Thread.java:833) [?:?] Caused by: java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) ~[?:?] at sun.nio.ch.Net.bind(Net.java:555) ~[?:?] at sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337) ~[?:?] at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294) ~[?:?] at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344) ~[jetty-server-12.0.24.jar:12.0.24] ... 24 more 2025.11.15 10:58:07.450 INFO [PluginMonitorTask-2]: org.jivesoftware.openfire.container.PluginManager - Successfully loaded plugin 'admin'. 2025.11.15 11:26:32.129 ERROR [main]: org.jivesoftware.openfire.XMPPServer - null java.io.FileNotFoundException: null at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) [xmppserver-5.0.2.jar:5.0.2] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) [?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) [?:?] at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) [?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) [?:?] at java.lang.Class.newInstance(Class.java:645) [?:?] at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) [startup.jar:5.0.2] at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) [startup.jar:5.0.2] 2025.11.15 11:26:32.178 WARN [main]: org.jivesoftware.util.JiveGlobals - Default properties have not been loaded from file. Using a non-persisting dummy properties object. [root@yfw system]# lsof -i :9090 [root@yfw system]# ss -tulnp | grep :9090 [root@yfw system]# -DopenfireHome=/opt/openfire -bash: -DopenfireHome=/opt/openfire: No such file or directory [root@yfw system]# #!/bin/bash [root@yfw system]# [root@yfw system]# export OPENFIRE_HOME=/opt/openfire [root@yfw system]# export JAVA_HOME=/usr/lib/jvm/java-17-openjdk [root@yfw system]# export JAVA="$JAVA_HOME/bin/java" [root@yfw system]# export LOG_FILE="$OPENFIRE_HOME/logs/nohup.out" [root@yfw system]# [root@yfw system]# # 动态构建 classpath [root@yfw system]# CP="" [root@yfw system]# for jar in "$OPENFIRE_HOME/lib"/*.jar; do > CP="$CP:$jar" > done [root@yfw system]# CP="${CP#:}" [root@yfw system]# [root@yfw system]# # 切换到 home 目录并启动 [root@yfw system]# cd "$OPENFIRE_HOME" || { echo "Cannot access OPENFIRE_HOME"; exit 1; } [root@yfw openfire]# [root@yfw openfire]# echo "Starting OpenFire..." Starting OpenFire... [root@yfw openfire]# nohup "$JAVA" \ > -server \ > -DopenfireHome="$OPENFIRE_HOME" \ > -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" \ > -Dlog4j.configurationFile="file://$OPENFIRE_HOME/lib/log4j2.xml" \ > -classpath "$CP" \ > org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 & [1] 1090964 [root@yfw openfire]# [root@yfw openfire]# echo $! > "$OPENFIRE_HOME/logs/openfire.pid" [root@yfw openfire]# echo "OpenFire started (PID $!)" OpenFire started (PID 1090964) [root@yfw openfire]# [root@yfw openfire]# # 实时查看日志 [root@yfw openfire]# tail -f "$LOG_FILE" at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) [?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) [?:?] at java.lang.Class.newInstance(Class.java:645) [?:?] at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) [startup.jar:5.0.2] at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) [startup.jar:5.0.2] 启动服务器时出错。有关详细信息,请查看日志文件。 Critical Error! The home directory has not been configured, which will prevent the application from working correctly. nohup: ignoring input Could not locate home java.io.FileNotFoundException at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) at java.base/java.lang.Class.newInstance(Class.java:645) at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) Error starting the server. Please check the log files for more information. Critical Error! The home directory has not been configured, which will prevent the application from working correctly. ^C [1]+ Done nohup "$JAVA" -server -DopenfireHome="$OPENFIRE_HOME" -Dopenfire.lib.dir="$OPENFIRE_HOME/lib" -Dlog4j.configurationFile="file://$OPENFIRE_HOME/lib/log4j2.xml" -classpath "$CP" org.jivesoftware.openfire.starter.ServerStarter >> "$LOG_FILE" 2>&1 [root@yfw openfire]# ls -l /opt/openfire/ total 492 drwxr-xr-x 3 openfire openfire 4096 Nov 15 11:21 bin -rwxr-xr-x 1 openfire openfire 439708 Feb 1 1980 changelog.html drwxr-xr-x 2 openfire openfire 4096 Nov 15 11:05 conf drwxr-xr-x 4 openfire openfire 4096 Sep 16 00:48 dist drwxr-xr-x 5 openfire openfire 4096 Sep 16 00:48 documentation drwxr-xr-x 2 openfire openfire 12288 Sep 16 00:48 lib -rwxr-xr-x 1 openfire openfire 10837 Feb 1 1980 LICENSE.html drwxr-xr-x 2 openfire openfire 4096 Nov 15 11:21 logs drwxr-xr-x 4 openfire openfire 4096 Nov 15 10:49 plugins -rwxr-xr-x 1 openfire openfire 5350 Feb 1 1980 README.html drwxr-xr-x 6 openfire openfire 4096 Sep 16 00:48 resources [root@yfw openfire]# sudo -u openfire java \ > -DopenfireHome=/opt/openfire \ > -cp "/opt/openfire/lib/*" \ > org.jivesoftware.util.JiveGlobals Error: LinkageError occurred while loading main class org.jivesoftware.util.JiveGlobals java.lang.UnsupportedClassVersionError: org/jivesoftware/util/JiveGlobals has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 [root@yfw openfire]# java -version openjdk version "11.0.13" 2021-10-19 LTS OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing) [root@yfw openfire]# sudo -u openfire /usr/lib/jvm/java-17-openjdk/bin/java \ > -DopenfireHome=/opt/openfire \ > -classpath "/opt/openfire/lib/*" \ > org.jivesoftware.openfire.starter.ServerStarter Could not locate home java.io.FileNotFoundException at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) at java.base/java.lang.Class.newInstance(Class.java:645) at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) 11:35:29.888 [main] ERROR org.jivesoftware.openfire.XMPPServer - null java.io.FileNotFoundException: null at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) [xmppserver-5.0.2.jar:5.0.2] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) [?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) [?:?] at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) [?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) [?:?] at java.lang.Class.newInstance(Class.java:645) [?:?] at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) [startup.jar:5.0.2] at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) [startup.jar:5.0.2] Error starting the server. Please check the log files for more information. Critical Error! The home directory has not been configured, which will prevent the application from working correctly. [root@yfw openfire]# cd /opt/openfire || { echo "Failed to enter /opt/openfire"; exit 1; } [root@yfw openfire]# sudo -u openfire /usr/lib/jvm/java-17-openjdk/bin/java \ > -DopenfireHome=/opt/openfire \ > -Dopenfire.lib.dir=/opt/openfire/lib \ > -classpath "/opt/openfire/lib/*" \ > org.jivesoftware.openfire.starter.ServerStarter Could not locate home java.io.FileNotFoundException at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) at java.base/java.lang.Class.newInstance(Class.java:645) at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) 11:37:06.753 [main] ERROR org.jivesoftware.openfire.XMPPServer - null java.io.FileNotFoundException: null at org.jivesoftware.openfire.XMPPServer.locateOpenfire(XMPPServer.java:1126) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:365) ~[xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:658) [xmppserver-5.0.2.jar:5.0.2] at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:221) [xmppserver-5.0.2.jar:5.0.2] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) [?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) [?:?] at java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) [?:?] at jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347) [?:?] at java.lang.Class.newInstance(Class.java:645) [?:?] at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:92) [startup.jar:5.0.2] at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:56) [startup.jar:5.0.2] Error starting the server. Please check the log files for more information. Critical Error! The home directory has not been configured, which will prevent the application from working correctly. [root@yfw openfire]# public class Test { -bash: public: command not found [root@yfw openfire]# public static void main(String[] args) { -bash: syntax error near unexpected token `(' [root@yfw openfire]# String home = System.getProperty("openfireHome"); -bash: syntax error near unexpected token `(' [root@yfw openfire]# System.out.println("openfireHome = " + home); -bash: syntax error near unexpected token `"openfireHome = "' [root@yfw openfire]# if (home == null) { -bash: syntax error near unexpected token `{' [root@yfw openfire]# System.err.println("ERROR: openfireHome is NULL"); -bash: syntax error near unexpected token `"ERROR: openfireHome is NULL"' [root@yfw openfire]# System.exit(1); -bash: syntax error near unexpected token `1' [root@yfw openfire]# } -bash: syntax error near unexpected token `}' [root@yfw openfire]# java.io.File f = new java.io.File(home); -bash: syntax error near unexpected token `(' [root@yfw openfire]# System.out.println("Exists: " + f.exists()); -bash: syntax error near unexpected token `"Exists: "' [root@yfw openfire]# System.out.println("IsDir : " + f.isDirectory()); -bash: syntax error near unexpected token `"IsDir : "' [root@yfw openfire]# System.out.println("CanRead: " + f.canRead()); -bash: syntax error near unexpected token `"CanRead: "' [root@yfw openfire]# System.out.println("CanWrite: " + f.canWrite()); -bash: syntax error near unexpected token `"CanWrite: "' [root@yfw openfire]# } -bash: syntax error near unexpected token `}' [root@yfw openfire]# } -bash: syntax error near unexpected token `}' [root@yfw openfire]#
11-16
kkFileView-4.4.0-SNAPSHOT把doc转pdf 报错 2025-12-01 09:35:00.167 INFO 43091 --- [tp251210093-627] c.k.w.c.OnlinePreviewController : 预览文件url:http://61.155.96.134:33808/web/userfiles/fileupload/202511/1993219102440484866.doc,previewType:OFFICE 2025-12-01 09:35:00.360 INFO 43091 --- [ter-poolentry-4] o.j.local.task.LocalConversionTask : Executing local conversion task [doc -> pdf]... 2025-12-01 09:37:00.360 INFO 43091 --- [tp251210093-627] o.j.l.office.LocalOfficeProcessManager : Restarting due to task timeout... 2025-12-01 09:37:00.360 INFO 43091 --- [tp251210093-627] o.j.l.office.LocalOfficeProcessManager : Trying to forcibly terminate process: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1;urp;StarOffice.ServiceManager'; pid: 62483 2025-12-01 09:37:00.372 INFO 43091 --- [ssageDispatcher] o.j.local.office.OfficeConnection : Disconnected from 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' 2025-12-01 09:37:00.372 WARN 43091 --- [ssageDispatcher] o.j.l.o.LocalOfficeManagerPoolEntry : Connection lost unexpectedly; attempting restart 2025-12-01 09:37:00.372 INFO 43091 --- [ssageDispatcher] o.j.l.office.LocalOfficeProcessManager : Restarting due to lost connection... 2025-12-01 09:37:00.372 INFO 43091 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Process exited with code 137 2025-12-01 09:37:00.375 ERROR 43091 --- [ter-poolentry-4] o.j.local.task.LocalConversionTask : Local conversion failed. com.sun.star.lang.DisposedException: null at com.sun.star.lib.uno.environments.remote.JobQueue.removeJob(JobQueue.java:210) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:330) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:303) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:87) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:636) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:146) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:128) ~[jurt-4.1.2.jar!/:na] at com.sun.proxy.$Proxy75.loadComponentFromURL(Unknown Source) ~[na:na] at org.jodconverter.local.task.AbstractLocalOfficeTask.loadDocumentFromURL(AbstractLocalOfficeTask.java:240) ~[jodconverter-local-4.4.6.jar!/:4.4.6] at org.jodconverter.local.task.AbstractLocalOfficeTask.loadDocument(AbstractLocalOfficeTask.java:204) ~[jodconverter-local-4.4.6.jar!/:4.4.6] at org.jodconverter.local.task.LocalConversionTask.execute(LocalConversionTask.java:129) ~[jodconverter-local-4.4.6.jar!/:4.4.6] at org.jodconverter.local.office.LocalOfficeManagerPoolEntry.doExecute(LocalOfficeManagerPoolEntry.java:121) [jodconverter-local-4.4.6.jar!/:4.4.6] at org.jodconverter.core.office.AbstractOfficeManagerPoolEntry.lambda$execute$0(AbstractOfficeManagerPoolEntry.java:81) [jodconverter-core-4.4.6.jar!/:4.4.6] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_251] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_251] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_251] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_251] Caused by: java.io.IOException: com.sun.star.io.IOException: EOF reached - socket,host=127.0.0.1,port=2001,tcpNoDelay=1,localHost=localhost,localPort=40674,peerHost=localhost,peerPort=2001 at com.sun.star.lib.uno.bridges.java_remote.XConnectionInputStream_Adapter.read(XConnectionInputStream_Adapter.java:55) ~[jurt-4.1.2.jar!/:na] at java.io.DataInputStream.readInt(DataInputStream.java:387) ~[na:1.8.0_251] at com.sun.star.lib.uno.protocols.urp.urp.readBlock(urp.java:355) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.protocols.urp.urp.readMessage(urp.java:92) ~[jurt-4.1.2.jar!/:na] at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge$MessageDispatcher.run(java_remote_bridge.java:105) ~[jurt-4.1.2.jar!/:na] 2025-12-01 09:37:00.384 INFO 43091 --- [er-offprocmng-0] o.j.local.office.OfficeDescriptor : soffice info (from exec path): Product: LibreOffice - Version: ??? - useLongOptionNameGnuStyle: true 2025-12-01 09:37:00.553 INFO 43091 --- [er-offprocmng-0] o.j.local.office.OfficeDescriptor : soffice info (from help output): Product: LibreOffice - Version: 7.5.3.2 - useLongOptionNameGnuStyle: true 2025-12-01 09:37:00.581 INFO 43091 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Starting process with --accept 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1;urp;StarOffice.ServiceManager' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001_tcpNoDelay-1' 2025-12-01 09:37:01.362 WARN 43091 --- [er-offprocmng-0] o.j.l.o.StartProcessAndConnectRetryable : Office process died with exit code 81; restarting it 2025-12-01 09:37:02.905 INFO 43091 --- [er-offprocmng-0] o.j.local.office.OfficeConnection : Connected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' 2025-12-01 09:37:02.905 INFO 43091 --- [er-offprocmng-0] o.j.l.office.LocalOfficeProcessManager : Started process; pid: 49641 curl: (7) Failed connect to 119.45.16.244:8888; Connection timed out
最新发布
12-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值