Missed Signals : state-dependent in concurrent

本文深入探讨了Java并发编程中常见的陷阱,如错过信号、过早唤醒等问题,并提供了正确的等待-通知模式实现方法。此外,还讨论了条件谓词、条件队列、单一通知与全部通知的区别及其适用场景。

In my work, I find guys often  make a mistaken of missed signals 

 

 

thread_1 test condition and find it true, before it enters synchronize block to wait, thread_2 change the condition and sends out notification. CPU cycle come back for thread_1, thread_1 wait for a missed signal. May be a long time potentially forever. 

If thread_1 is a executing service  thread (engine thread) to process task, then it may be in danger of task accumulating, the whole system is blocked. 

 

A similar error is invalid clean up

 

If thread_2 execute before thread_1, then the 'target' object would be never removed and exist in container forever. If the target is limited resources such as thread, connection pool, socket... Then it  has dangerous all of limited resources are consumed and exhausted.

 

 


 

 

Java Concurrency in Practice chapter 14  Building Custom Synchronizers
The Condition Predicate
The condition predicate is the precondition that makes an operation state-dependent in the first place. In a bounded buffer, take can proceed only if the buffer is not empty; otherwise it must wait. For take, the condition predicate is "the buffer is not empty", which take must test for before proceeding. Similarly, the condition predicate for put is "the buffer is not full". Condition predicates are expressions constructed from the state variables of the class; BaseBoundedBuffer tests for "buffer not empty" by comparing count to zero, and tests for "buffer not full" by comparing countto the buffer size.

Wait - Waking Up Too Soon

When control re-enters the code calling wait, it has reacquired the lock associated with the condition queue. Is the condition predicate now true? Maybe. It might have been true at the time the notifying thread called notifyAll, but could have become false again by the time you reacquire the lock. Other threads may have acquired the lock and changed the object's state between when your thread was awakened and when wait reacquired the lock. Or maybe it hasn't been true at all since you called wait

 

 

When using condition waits (Object.wait or Condition.await):

  • Always have a condition predicatesome test of object state that must hold before proceeding;

  • Always test the condition predicate before calling wait, and again after returning from wait;

  • Always call wait in a loop;

  • Ensure that the state variables making up the condition predicate are guarded by the lock associated with the condition queue;

  • Hold the lock associated with the the condition queue when calling wait,notify, or notifyAll; and

  • Do not release the lock after checking the condition predicate but before acting on it.

Wait - Missed Signals

A missed signal occurs when a thread must wait for a specific condition that is already true, but fails to check the condition predicate before waiting. Now the thread is waiting to be notified of an event that has already occurred.

Listing 14.7. Canonical Form for State-dependent Methods.

 

 

Notification

Whenever you wait on a condition, make sure that someone will perform a notification whenever the condition predicate becomes true.

 

Because multiple threads could be waiting on the same condition queue for different condition predicates, using notify instead of notifyAll can be dangerous, primarily because single notification is prone to a problem akin to missed signals.

 

Single notify can be used instead of notifyAll only when both of the following conditions hold:

  • Uniform waiters. Only one condition predicate is associated with the condition queue, and each thread executes the same logic upon returning from wait; and
  • One-in, one-out. A notification on the condition variable enables at most one thread to proceed.

The notification done by put and take in BoundedBuffer is conservative: a notification is performed every time an object is put into or removed from the buffer. This could be optimized by observing that a thread can be released from a wait only if the buffer goes from empty to not empty or from full to not full, and notifying only if a put or take  one of these state transitions. This is called conditional notification

 

 

Listing 14.1. Structure of Blocking State-dependent Actions.

 

Propagating Precondition Failure to Callers

 

Polling and Sleeping

 

Condition Queues

 

 

Line 30363: 10-12 16:45:01.939706 5473 5473 D CarrierSvcBindHelper: onPackageModified: com.google.android.apps.bard Line 30367: 10-12 16:45:01.947034 5473 6010 I SatelliteAppTracker: onPackageModified : com.google.android.apps.bard Line 30376: 10-12 16:45:01.965915 5638 5726 D PackageUpdatedTask: Package updated: mOp=UPDATE packages=[com.google.android.apps.bard], user=UserHandle{0} Line 30379: 10-12 16:45:01.969288 1570 5152 D WifiService: Remove settings for package:com.google.android.apps.bard Line 30384: 10-12 16:45:01.981725 1570 5152 D WifiConfigManager: Remove all networks for app ApplicationInfo{df0e8e2 com.google.android.apps.bard} Line 30386: 10-12 16:45:01.988466 5638 5726 W AllAppsList: updatePackage: no Activities matched updated package, removing any AppInfo with package=com.google.android.apps.bard, user=UserHandle{0} Line 30387: 10-12 16:45:01.988815 5638 5726 D PackageUpdatedTask: OP_UPDATE - AllAppsList.trackRemoves callback: removed component=ComponentInfo{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity} id=-1 Look for earlier AllAppsList logs to find more information. Line 30387: 10-12 16:45:01.988815 5638 5726 D PackageUpdatedTask: OP_UPDATE - AllAppsList.trackRemoves callback: removed component=ComponentInfo{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity} id=-1 Look for earlier AllAppsList logs to find more information. Line 30404: 10-12 16:45:02.012584 1570 5152 V WifiScanRequestProxy: Clearing scan request timestamps for uid=10103, packageName=com.google.android.apps.bard Line 30487: 10-12 16:45:02.041847 1570 5152 I PasspointManager: No app ops listener found for com.google.android.apps.bard Line 30499: 10-12 16:45:02.081338 6414 7084 I Finsky : [195] AIM: AppInfoManager-Perf > OnDeviceAppInfo > cacheHitCount=0, cacheMissCount=1. Missed in cache (limit 10) : [com.google.android.apps.bard] Line 30500: 10-12 16:45:02.081553 5638 5726 D PackageUpdatedTask: OP_UPDATE: package com.google.android.apps.bard is disabled, removing package. Line 30501: 10-12 16:45:02.081978 5638 5726 D ModelWriter: removing items from db com.google.android.apps.bard. Reason: [removed because the corresponding package or component is removed. mOp=2 removedPackages=[com.google.android.apps.bard] removedComponents=[{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity}]] Line 30501: 10-12 16:45:02.081978 5638 5726 D ModelWriter: removing items from db com.google.android.apps.bard. Reason: [removed because the corresponding package or component is removed. mOp=2 removedPackages=[com.google.android.apps.bard] removedComponents=[{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity}]] Line 30501: 10-12 16:45:02.081978 5638 5726 D ModelWriter: removing items from db com.google.android.apps.bard. Reason: [removed because the corresponding package or component is removed. mOp=2 removedPackages=[com.google.android.apps.bard] removedComponents=[{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity}]] Line 30501: 10-12 16:45:02.081978 5638 5726 D ModelWriter: removing items from db com.google.android.apps.bard. Reason: [removed because the corresponding package or component is removed. mOp=2 removedPackages=[com.google.android.apps.bard] removedComponents=[{com.google.android.apps.bard/com.google.android.apps.bard.shellapp.BardEntryPointActivity}]] Line 30513: 10-12 16:45:02.107869 5638 5638 D EXT-LAUNCHER3: LauncherAppMonitor, onPackagesUpdated, packageNames:[com.google.android.apps.bard] user:UserHandle{0} type:2 Line 30514: 10-12 16:45:02.108107 5638 5638 D EXT-LAUNCHER3: LauncherAppMonitor, onPackagesUpdated, packageNames:[com.google.android.apps.bard] user:UserHandle{0} type:2 Line 30516: 10-12 16:45:02.117572 5473 6004 D ImsResolver: maybeAddedImsService, packageName: com.google.android.apps.bard Line 30517: 10-12 16:45:02.117764 5473 6004 V ImsResolver: searchForImsServices: package=com.google.android.apps.bard, users=[UserHandle{0}] Line 30518: 10-12 16:45:02.118200 5473 6004 V ImsResolver: searchForImsServices: package=com.google.android.apps.bard, users=[UserHandle{0}] Line 30522: 10-12 16:45:02.121760 5473 5473 D SatelliteController: packageStateChanged: package:com.google.android.apps.bard DefaultSmsPackageName:com.google.android.apps.messaging Line 30541: 10-12 16:45:02.142427 6414 7127 I Finsky : [209] AIM: AppInfoManager-Perf > ItemModel > CacheSize=0, cacheHitCount=0, cacheMissCount=1, total appsWithNoServerDataCount=0. Missed in cache (limit 10) : [com.google.android.apps.bard] Line 30546: 10-12 16:45:02.152202 6414 7127 I Finsky : [209] ItemStore: Not cached: com.google.android.apps.bard Line 30591: 10-12 16:45:02.356832 6059 6059 D MediaProvider: Removing disabled package: com.google.android.apps.bard from providers list if required. Line 30638: 10-12 16:45:02.497047 7702 12626 I Icing : doRemovePackageData com.google.android.apps.bard Line 30700: 10-12 16:45:02.656556 7702 12626 I Icing : doRemovePackageData com.google.android.apps.bard Line 31209: 10-12 16:45:03.900034 6414 7084 I Finsky : [195] AU: Cannot update com.google.android.apps.bard because package is disabled 请详细解读一下
10-14
ERROR Failed to compile with 1 error 01:07:53 error in ./src/views/SuperAdmin/TopicManagment/HotTopicManagement.vue Syntax Error: SyntaxError (164:21) E:\InformationSystemDevelopment\MyNews2025\yunxun-future_-isd\code\adminfront\src\views\SuperAdmin\TopicManagment\HotTopicManagement.vue Missed semicolon 162 | props: { 163 | visible: { > 164 | type: Boolean, | ^ 165 | required: true 166 | } ERROR in ./src/views/SuperAdmin/TopicManagment/HotTopicManagement.vue (./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/views/SuperAdmin/TopicManagment/HotTopicManagement.vue) Module build failed (from ./node_modules/postcss-loader/dist/cjs.js): SyntaxError (164:21) E:\InformationSystemDevelopment\MyNews2025\yunxun-future_-isd\code\adminfront\src\views\SuperAdmin\TopicManagment\HotTopicManagement.vue Missed semicolon 162 | props: { 163 | visible: { > 164 | type: Boolean, | ^ 165 | required: true 166 | } @ ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/SuperAdmin/TopicManagment/HotsearchManagement.vue?vue&type=style&index=0&id=03eaf36e&scoped=true&lang=css 4:0-301 6:26-59 @ ./node_modules/vue-style-loader/index.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/SuperAdmin/TopicManagment/HotsearchManagement.vue?vue&type=style&index=0&id=03eaf36e&scoped=true&lang=css 4:14-412 15:3-20:5 16:22-420 @ ./src/views/SuperAdmin/TopicManagment/HotsearchManagement.vue?vue&type=style&index=0&id=03eaf36e&scoped=true&lang=css 1:0-479 1:0-479 @ ./src/views/SuperAdmin/TopicManagment/HotsearchManagement.vue 4:0-102 @ ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/SuperAdmin/TopicManagement.vue?vue&type=script&lang=js 8:0-75 19:4-23 @ ./src/views/SuperAdmin/TopicManagement.vue?vue&type=script&lang=js 1:0-214 1:230-233 1:235-446 1:235-446 @ ./src/views/SuperAdmin/TopicManagement.vue 2:0-66 3:0-61 3:0-61 10:2-8 @ ./src/router/index.js 99:19-99 @ ./src/main.js 3:0-30 27:2-8 webpack compiled with 1 error 这个错误发生的原因
06-17
[root@yfw ~]# cd /opt/openfire/enterprise/Spark-master [root@yfw Spark-master]# cd /opt/openfire/enterprise/Spark-master/spark-client/distribution [root@yfw distribution]# java -cp "lib/*:resources" org.jivesoftware.Spark 错误: 在类 org.jivesoftware.Spark 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application [root@yfw distribution]# java -cp "lib/*:resources" org.jivesoftware.launcher.Startup Warning: no working directory set. This might cause updated data to be missed. Please set a system property 'appdir' to the location where Spark is installed to correct this. java.lang.reflect.InvocationTargetException at java.awt.EventQueue.invokeAndWait(EventQueue.java:1349) at java.awt.EventQueue.invokeAndWait(EventQueue.java:1324) at org.jivesoftware.Spark.startup(Spark.java:186) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jivesoftware.launcher.Startup.start(Startup.java:75) at org.jivesoftware.launcher.Startup.main(Startup.java:31) Caused by: java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204) at java.awt.Window.<init>(Window.java:536) at java.awt.Frame.<init>(Frame.java:420) at java.awt.Frame.<init>(Frame.java:385) at javax.swing.JFrame.<init>(JFrame.java:189) at org.jivesoftware.Spark.lambda$startup$0(Spark.java:188) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) [root@yfw distribution]# cd /opt/openfire/enterprise/Spark-master [root@yfw Spark-master]# zip -r spark-client.zip spark-client/distribution/ adding: spark-client/distribution/ (stored 0%) adding: spark-client/distribution/resources/ (stored 0%) adding: spark-client/distribution/resources/sounds/ (stored 0%) adding: spark-client/distribution/resources/sounds/presence_changed.wav (deflated 39%) adding: spark-client/distribution/resources/sounds/incoming.wav (deflated 31%) adding: spark-client/distribution/resources/sounds/outgoing.wav (deflated 31%) adding: spark-client/distribution/resources/sounds/bell.wav (deflated 13%) adding: spark-client/distribution/resources/sounds/chat_request.wav (deflated 11%) adding: spark-client/distribution/resources/systeminfo.dll (deflated 66%) adding: spark-client/distribution/resources/Info.plist (deflated 64%) adding: spark-client/distribution/resources/jniwrap.lic (deflated 19%) adding: spark-client/distribution/resources/startup.bat (deflated 57%) adding: spark-client/distribution/resources/jniwrap.dll (deflated 79%) adding: spark-client/distribution/resources/startup.sh (deflated 51%) adding: spark-client/distribution/plugins/ (stored 0%) adding: spark-client/distribution/plugins/growl.jar (deflated 0%) adding: spark-client/distribution/plugins/fileupload.jar (deflated 0%) adding: spark-client/distribution/plugins/roar.jar (deflated 0%) adding: spark-client/distribution/plugins/meet.jar (deflated 0%) adding: spark-client/distribution/plugins/tictactoe.jar (deflated 0%) adding: spark-client/distribution/plugins/fastpath.jar (deflated 0%) adding: spark-client/distribution/plugins/transferguard.jar (deflated 1%) adding: spark-client/distribution/plugins/translator.jar (deflated 0%) adding: spark-client/distribution/plugins/flashing.jar (deflated 2%) adding: spark-client/distribution/plugins/apple.jar (deflated 0%) adding: spark-client/distribution/plugins/spelling.jar (deflated 0%) adding: spark-client/distribution/plugins/reversi.jar (deflated 0%) adding: spark-client/distribution/documentation/ (stored 0%) adding: spark-client/distribution/documentation/ide-vscode-setup.html (deflated 65%) adding: spark-client/distribution/documentation/ide-intellij-setup.html (deflated 68%) adding: spark-client/distribution/documentation/spark guide/ (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/ (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image021.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image033.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image015.png (deflated 1%) adding: spark-client/distribution/documentation/spark guide/images/image003.png (deflated 13%) adding: spark-client/distribution/documentation/spark guide/images/image027.png (deflated 0%) adding: spark-client/distribution/documentation/spark guide/images/image007.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image001.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image009.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image031.png (deflated 3%) adding: spark-client/distribution/documentation/spark guide/images/image011.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image025.png (deflated 1%) adding: spark-client/distribution/documentation/spark guide/images/image017.png (deflated 1%) adding: spark-client/distribution/documentation/spark guide/images/image029.png (deflated 6%) adding: spark-client/distribution/documentation/spark guide/images/image023.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/filelist.xml (deflated 74%) adding: spark-client/distribution/documentation/spark guide/images/image013.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image005.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/images/image019.png (stored 0%) adding: spark-client/distribution/documentation/spark guide/Spark.default.properties.guide.html (deflated 90%) adding: spark-client/distribution/documentation/spark.doap (deflated 89%) adding: spark-client/distribution/documentation/changelog.html (deflated 81%) adding: spark-client/distribution/documentation/sparkplug_compile.html (deflated 56%) adding: spark-client/distribution/documentation/images/ (stored 0%) adding: spark-client/distribution/documentation/images/IntelliJ-8.JPG (deflated 21%) adding: spark-client/distribution/documentation/images/VSCode-4.png (deflated 8%) adding: spark-client/distribution/documentation/images/VSCode-6.png (deflated 6%) adding: spark-client/distribution/documentation/images/IntelliJ-3.JPG (deflated 27%) adding: spark-client/distribution/documentation/images/VSCode-2.png (deflated 18%) adding: spark-client/distribution/documentation/images/IntelliJ-10.JPG (deflated 26%) adding: spark-client/distribution/documentation/images/login-dialog.png (deflated 0%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-1.png (deflated 4%) adding: spark-client/distribution/documentation/images/IntelliJ-6.JPG (deflated 52%) adding: spark-client/distribution/documentation/images/IntelliJ-1.JPG (deflated 43%) adding: spark-client/distribution/documentation/images/contact-list.png (deflated 9%) adding: spark-client/distribution/documentation/images/IntelliJ-9.JPG (deflated 43%) adding: spark-client/distribution/documentation/images/IntelliJ-5.JPG (deflated 26%) adding: spark-client/distribution/documentation/images/VSCode-1.png (deflated 12%) adding: spark-client/distribution/documentation/images/chat-room.png (deflated 13%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-5.png (deflated 3%) adding: spark-client/distribution/documentation/images/VSCode-5.png (deflated 16%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-6.png (deflated 5%) adding: spark-client/distribution/documentation/images/IntelliJ-2.JPG (deflated 32%) adding: spark-client/distribution/documentation/images/banner-spring.gif (deflated 14%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-2.png (deflated 6%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-3.png (deflated 4%) adding: spark-client/distribution/documentation/images/IntelliJ-7.JPG (deflated 18%) adding: spark-client/distribution/documentation/images/eclipse-maven-step-4.png (deflated 6%) adding: spark-client/distribution/documentation/images/VSCode-3.png (deflated 13%) adding: spark-client/distribution/documentation/images/banner-spark.gif (stored 0%) adding: spark-client/distribution/documentation/images/IntelliJ-4.JPG (deflated 55%) adding: spark-client/distribution/documentation/sample_plugin_repository.xml (deflated 69%) adding: spark-client/distribution/documentation/changes.xsl (deflated 59%) adding: spark-client/distribution/documentation/ide-eclipse-setup.html (deflated 67%) adding: spark-client/distribution/documentation/style.css (deflated 67%) adding: spark-client/distribution/documentation/LICENSE.html (deflated 67%) adding: spark-client/distribution/documentation/builder.jar (deflated 30%) adding: spark-client/distribution/documentation/sparkplug_dev_guide.html (deflated 75%) adding: spark-client/distribution/documentation/README.html (deflated 63%) adding: spark-client/distribution/xtra/ (stored 0%) adding: spark-client/distribution/xtra/emoticons/ (stored 0%) adding: spark-client/distribution/xtra/emoticons/sparkEmoticonSet.zip (stored 0%) adding: spark-client/distribution/xtra/emoticons/GTalk.AdiumEmoticonset.zip (stored 0%) adding: spark-client/distribution/xtra/emoticons/Default.adiumemoticonset.zip (stored 0%) adding: spark-client/distribution/xtra/emoticons/POPO.adiumemoticonset.zip (stored 0%) adding: spark-client/distribution/lib/ (stored 0%) adding: spark-client/distribution/lib/jxmpp-jid-1.0.3.jar (deflated 13%) adding: spark-client/distribution/lib/smack-debug-4.4.8.jar (deflated 16%) adding: spark-client/distribution/lib/bcpkix-jdk18on-1.78.1.jar (deflated 13%) adding: spark-client/distribution/lib/flatlaf-3.1.1.jar (deflated 5%) adding: spark-client/distribution/lib/minidns-core-1.0.5.jar (deflated 9%) adding: spark-client/distribution/lib/linux/ (stored 0%) adding: spark-client/distribution/lib/linux/libcivil.so (deflated 72%) adding: spark-client/distribution/lib/linux/libjng722.so (deflated 55%) adding: spark-client/distribution/lib/linux/libjnvpx.so (deflated 60%) adding: spark-client/distribution/lib/linux/libjnscreencapture.so (deflated 55%) adding: spark-client/distribution/lib/linux/libjnspeex.so (deflated 46%) adding: spark-client/distribution/lib/linux/libjnpulseaudio.so (deflated 72%) adding: spark-client/distribution/lib/linux/libjnvideo4linux2.so (deflated 76%) adding: spark-client/distribution/lib/linux/libjnawtrenderer.so (deflated 53%) adding: spark-client/distribution/lib/linux/libjnopus.so (deflated 45%) adding: spark-client/distribution/lib/linux/libjnffmpeg.so (deflated 68%) adding: spark-client/distribution/lib/linux/libjnportaudio.so (deflated 58%) adding: spark-client/distribution/lib/jna-platform-5.12.1.jar (deflated 15%) adding: spark-client/distribution/lib/jaxen-1.2.0.jar (deflated 12%) adding: spark-client/distribution/lib/slf4j-api-1.8.0-beta4.jar (deflated 12%) adding: spark-client/distribution/lib/bcutil-jdk18on-1.78.1.jar (deflated 15%) adding: spark-client/distribution/lib/swingx-all-1.6.5-1.jar (deflated 11%) adding: spark-client/distribution/lib/smack-xmlparser-4.4.8.jar (deflated 24%) adding: spark-client/distribution/lib/smack-legacy-4.4.8.jar (deflated 14%) adding: spark-client/distribution/lib/smack-tcp-4.4.8.jar (deflated 10%) adding: spark-client/distribution/lib/commons-lang3-3.15.0.jar (deflated 10%) adding: spark-client/distribution/lib/xstream-1.4.20.jar (deflated 12%) adding: spark-client/distribution/lib/mac/ (stored 0%) adding: spark-client/distribution/lib/mac/libjng722.jnilib (deflated 77%) adding: spark-client/distribution/lib/mac/libSystemUtilities.jnilib (deflated 89%) adding: spark-client/distribution/lib/mac/libjnspeex.jnilib (deflated 55%) adding: spark-client/distribution/lib/mac/JavaSoundStream.fix.jar (deflated 58%) adding: spark-client/distribution/lib/mac/libjnscreencapture.jnilib (deflated 79%) adding: spark-client/distribution/lib/mac/libjnopus.jnilib (deflated 56%) adding: spark-client/distribution/lib/mac/libjnffmpeg.jnilib (deflated 64%) adding: spark-client/distribution/lib/mac/libjnportaudio.jnilib (deflated 56%) adding: spark-client/distribution/lib/mac/libjnquicktime.jnilib (deflated 79%) adding: spark-client/distribution/lib/mac/libjnawtrenderer.jnilib (deflated 79%) adding: spark-client/distribution/lib/mac/libjnmaccoreaudio.jnilib (deflated 60%) adding: spark-client/distribution/lib/mac/libjnvpx.jnilib (deflated 58%) adding: spark-client/distribution/lib/bctls-jdk18on-1.78.1.jar (deflated 12%) adding: spark-client/distribution/lib/dom4j-2.1.4.jar (deflated 6%) adding: spark-client/distribution/lib/spark-core-3.0.3-SNAPSHOT.jar (deflated 7%) adding: spark-client/distribution/lib/smack-java8-4.4.8.jar (deflated 18%) adding: spark-client/distribution/lib/smack-debug-slf4j-4.4.8.jar (deflated 21%) adding: spark-client/distribution/lib/windows64/ (stored 0%) adding: spark-client/distribution/lib/windows64/jng722.dll (deflated 56%) adding: spark-client/distribution/lib/windows64/jnvpx.dll (deflated 60%) adding: spark-client/distribution/lib/windows64/jnffmpeg.dll (deflated 64%) adding: spark-client/distribution/lib/windows64/civil.dll (deflated 58%) adding: spark-client/distribution/lib/windows64/jnopus.dll (deflated 46%) adding: spark-client/distribution/lib/windows64/jndirectshow.dll (deflated 71%) adding: spark-client/distribution/lib/windows64/jnwasapi.dll (deflated 70%) adding: spark-client/distribution/lib/windows64/jnspeex.dll (deflated 46%) adding: spark-client/distribution/lib/windows64/jnwincoreaudio.dll (deflated 67%) adding: spark-client/distribution/lib/windows64/jnscreencapture.dll (deflated 53%) adding: spark-client/distribution/lib/windows64/jnportaudio.dll (deflated 54%) adding: spark-client/distribution/lib/windows64/jnawtrenderer.dll (deflated 54%) adding: spark-client/distribution/lib/mxparser-1.2.2.jar (deflated 5%) adding: spark-client/distribution/lib/linux64/ (stored 0%) adding: spark-client/distribution/lib/linux64/libcivil.so (deflated 71%) adding: spark-client/distribution/lib/linux64/libjng722.so (deflated 55%) adding: spark-client/distribution/lib/linux64/libjnvpx.so (deflated 65%) adding: spark-client/distribution/lib/linux64/libodbcinst.so (deflated 56%) adding: spark-client/distribution/lib/linux64/libjnscreencapture.so (deflated 64%) adding: spark-client/distribution/lib/linux64/libodbc.so (deflated 61%) adding: spark-client/distribution/lib/linux64/libjnspeex.so (deflated 47%) adding: spark-client/distribution/lib/linux64/libjnpulseaudio.so (deflated 74%) adding: spark-client/distribution/lib/linux64/libjnvideo4linux2.so (deflated 78%) adding: spark-client/distribution/lib/linux64/libjnawtrenderer.so (deflated 60%) adding: spark-client/distribution/lib/linux64/libjnopus.so (deflated 44%) adding: spark-client/distribution/lib/linux64/libjnffmpeg.so (deflated 67%) adding: spark-client/distribution/lib/linux64/libjnportaudio.so (deflated 60%) adding: spark-client/distribution/lib/jaxb-api-2.3.1.jar (deflated 12%) adding: spark-client/distribution/lib/httpcore5-h2-5.2.4.jar (deflated 10%) adding: spark-client/distribution/lib/smack-resolver-javax-4.4.8.jar (deflated 22%) adding: spark-client/distribution/lib/jxmpp-core-1.0.3.jar (deflated 14%) adding: spark-client/distribution/lib/install4j-runtime-11.0.4.jar (deflated 9%) adding: spark-client/distribution/lib/jna-5.12.1.jar (deflated 2%) adding: spark-client/distribution/lib/smack-sasl-javax-4.4.8.jar (deflated 23%) adding: spark-client/distribution/lib/javax.activation-api-1.2.0.jar (deflated 7%) adding: spark-client/distribution/lib/smack-extensions-4.4.8.jar (deflated 14%) adding: spark-client/distribution/lib/smack-im-4.4.8.jar (deflated 11%) adding: spark-client/distribution/lib/smack-xmlparser-stax-4.4.8.jar (deflated 21%) adding: spark-client/distribution/lib/thumbnailator-0.4.20.jar (deflated 15%) adding: spark-client/distribution/lib/xmlpull-1.1.3.1.jar (deflated 12%) adding: spark-client/distribution/lib/LoboBrowser-1.0.0.jar (deflated 10%) adding: spark-client/distribution/lib/windows/ (stored 0%) adding: spark-client/distribution/lib/windows/jng722.dll (deflated 55%) adding: spark-client/distribution/lib/windows/jnvpx.dll (deflated 61%) adding: spark-client/distribution/lib/windows/jnffmpeg.dll (deflated 65%) adding: spark-client/distribution/lib/windows/civil.dll (deflated 56%) adding: spark-client/distribution/lib/windows/jnopus.dll (deflated 46%) adding: spark-client/distribution/lib/windows/jndirectshow.dll (deflated 63%) adding: spark-client/distribution/lib/windows/jnwasapi.dll (deflated 70%) adding: spark-client/distribution/lib/windows/jnspeex.dll (deflated 46%) adding: spark-client/distribution/lib/windows/jnwincoreaudio.dll (deflated 62%) adding: spark-client/distribution/lib/windows/jnscreencapture.dll (deflated 53%) adding: spark-client/distribution/lib/windows/jnportaudio.dll (deflated 61%) adding: spark-client/distribution/lib/windows/jnawtrenderer.dll (deflated 52%) adding: spark-client/distribution/lib/httpclient5-5.2.3.jar (deflated 9%) adding: spark-client/distribution/lib/httpcore5-5.2.4.jar (deflated 11%) adding: spark-client/distribution/lib/smack-experimental-4.4.8.jar (deflated 17%) adding: spark-client/distribution/lib/smack-streammanagement-4.4.8.jar (deflated 21%) adding: spark-client/distribution/lib/hsluv-0.2.jar (deflated 13%) adding: spark-client/distribution/lib/smack-core-4.4.8.jar (deflated 13%) adding: spark-client/distribution/lib/jxmpp-util-cache-1.0.3.jar (deflated 17%) adding: spark-client/distribution/lib/bcprov-jdk18on-1.78.1.jar (deflated 13%) adding: spark-client/distribution/security/ (stored 0%) adding: spark-client/distribution/bin/ (stored 0%) adding: spark-client/distribution/bin/startup.bat (deflated 57%) adding: spark-client/distribution/bin/startup.sh (deflated 51%) [root@yfw Spark-master]# scp root@your-server-ip:/opt/openfire/enterprise/Spark-master/spark-client.zip ./ ssh: Could not resolve hostname your-server-ip: Name or service not known [root@yfw Spark-master]#
10-31
你已经完成了 **构建和打包 Spark 客户端** 的关键步骤 ✅ 现在的问题是: ```bash scp root@your-server-ip:/opt/openfire/enterprise/Spark-master/spark-client.zip ./ ssh: Could not resolve hostname your-server-ip: Name or service not known ``` 这是因为 `your-server-ip` 是一个占位符,你需要替换成你服务器的真实 IP 地址。 --- ## ✅ 正确操作:从你的本地电脑下载 `spark-client.zip` ### 第一步:确认服务器的 IP 地址 在服务器上运行: ```bash hostname -I | awk '{print $1}' ``` 或者: ```bash ip addr show | grep inet ``` 你会看到类似: ``` 192.168.1.100 ``` 或公网 IP(如 `43.157.123.45`) 记下这个 IP! --- ### 第二步:在你自己的 **本地电脑** 上执行 `scp` 命令 打开你本地的终端(Mac/Linux)或使用工具如 **WinSCP / MobaXterm / PowerShell**(Windows),然后运行: #### macOS/Linux 用户: ```bash scp root@192.168.1.100:/opt/openfire/enterprise/Spark-master/spark-client.zip ./spark-client.zip ``` > 🔁 替换 `192.168.1.100` 为你的实际服务器 IP 输入密码后,文件就会下载到当前目录。 --- #### Windows 用户(推荐方式) ##### 方法一:使用 **WinSCP**(图形化工具) 1. 下载安装 [WinSCP](https://winscp.net/) 2. 新建连接: - 文件协议:SFTP - 主机名:`你的服务器IP`(例如 `43.157.123.45`) - 端口:`22` - 用户名:`root` - 密码:你的 root 密码 3. 登录后导航到: ``` /opt/openfire/enterprise/Spark-master/ ``` 4. 找到 `spark-client.zip`,右键 → 下载 ##### 方法二:PowerShell + scp(需 OpenSSH 已安装) ```powershell scp root@43.157.123.45:"/opt/openfire/enterprise/Spark-master/spark-client.zip" . ``` --- ## 📦 下载完成后做什么? 解压并运行 Spark 客户端! ### 解压 ```bash unzip spark-client.zip cd spark-client/distribution ``` ### 运行(Linux/macOS) ```bash chmod +x bin/startup.sh ./bin/startup.sh ``` ### 运行(Windows) 双击: ``` spark-client\distribution\bin\startup.bat ``` 或者命令行: ```cmd java -cp "lib/*;resources" org.jivesoftware.launcher.Startup ``` --- ## 💡 小贴士:如何避免每次手动打包? 你可以写一个自动脚本生成可分发版本: ```bash #!/bin/bash # build-and-export.sh cd /opt/openfire/enterprise/Spark-master || exit rm -f spark-client.zip zip -r spark-client.zip spark-client/distribution/ echo "✅ 打包完成!请从以下命令下载:" echo " scp root@$(hostname -I | awk '{print $1}'):/opt/openfire/enterprise/Spark-master/spark-client.zip ./" ``` 保存为 `build-export.sh`,运行: ```bash chmod +x build-export.sh ./build-export.sh ``` --- ## 🎉 成功标志 当你看到这个窗口弹出时,说明一切成功! ``` +--------------------------------------------------+ | Spark 3.x | | | | Server Address: [openfire.example.com] | | Username: [admin ] | | Password: [******** ] | | [Login] | +--------------------------------------------------+ ``` 你可以用它登录你的 OpenFire 服务器进行聊天了! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FireCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值