سؤال

باستخدام: Hornetq 2.0.0.cr2 التكوينات الافتراضية لخادم مستقل/غير محدد.

عندما أحاول بدء تشغيل الخادم بمجلة كبيرة (> 1 جيجابايت) ، حصلت على استثناء OutofMemory:

[main] 12:59:43,505 INFO [org.hornetq.integration.bootstrap.HornetQBootstrapServer]  Starting HornetQ Server
[main] 12:59:44,526 INFO [org.hornetq.core.server.impl.HornetQServerImpl]  live server is starting..
[main] 12:59:44,532 WARNING [org.hornetq.core.server.management.impl.ManagementServiceImpl]  It has been detected that the cluster admin user and password which are used to replicate management operation from one node to the other have not been changed from the installation default. Please see the HornetQ user guide for instructions on how to do this.
[main] 12:59:44,564 WARNING [org.hornetq.core.persistence.impl.journal.JournalStorageManager]  AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal
[main] 12:59:44,565 INFO [org.hornetq.core.persistence.impl.journal.JournalStorageManager]  Using NIO Journal
Exception in thread "hornetq-expiry-reaper-thread" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.concurrent.ConcurrentHashMap.values(ConcurrentHashMap.java:1011)
at org.hornetq.core.postoffice.impl.PostOfficeImpl$Reaper.run(PostOfficeImpl.java:1083)
at java.lang.Thread.run(Thread.java:637)
[main] 13:00:17,135 SEVERE [org.hornetq.integration.bootstrap.HornetQBootstrapServer]  Failed to start server
java.lang.IllegalStateException: Incompletely deployed:

DEPLOYMENTS IN ERROR:
  Deployment "JMSServerManager" is in error due to: java.lang.OutOfMemoryError: GC overhead limit exceeded

at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.internalValidate(AbstractKernelDeployer.java:278)
at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.validate(AbstractKernelDeployer.java:174)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.bootstrap(HornetQBootstrapServer.java:159)
at org.jboss.kernel.plugins.bootstrap.AbstractBootstrap.run(AbstractBootstrap.java:83)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.run(HornetQBootstrapServer.java:117)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.main(HornetQBootstrapServer.java:73)
Exception in thread "main" java.lang.IllegalStateException: Incompletely deployed:

DEPLOYMENTS IN ERROR:
  Deployment "JMSServerManager" is in error due to: java.lang.OutOfMemoryError: GC overhead limit exceeded

at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.internalValidate(AbstractKernelDeployer.java:278)
at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.validate(AbstractKernelDeployer.java:174)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.bootstrap(HornetQBootstrapServer.java:159)
at org.jboss.kernel.plugins.bootstrap.AbstractBootstrap.run(AbstractBootstrap.java:83)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.run(HornetQBootstrapServer.java:117)
at org.hornetq.integration.bootstrap.HornetQBootstrapServer.main(HornetQBootstrapServer.java:73)

قد يحدث هذا في الحياة الحقيقية عندما يتوقف المستهلك عن معالجة الرسائل وأحتاج إلى إعادة تشغيل الخادم.

هناك أي حلول لهذا؟ أو ما هي التكوينات التي يجب أن أحاول تعديلها؟

هل كانت مفيدة؟

المحلول

اتضح أنه كان من السهل تجنب هذه المشكلة تمامًا.

ال الترحيل لم يتم تمكينه في التكوين الافتراضي!

إضافة هذين الخطين على hornetq-configuration.xml يجب أن تقوم بالخدعة:

   <address-settings>
      <!--default for catch all-->
      <address-setting match="#">
         <dead-letter-address>jms.queue.DLQ</dead-letter-address>
         <expiry-address>jms.queue.ExpiryQueue</expiry-address>
         <redelivery-delay>0</redelivery-delay>
         <page-size-bytes>10485760</page-size-bytes>
         <message-counter-history-day-limit>10</message-counter-history-day-limit>

         <!-- Add these 2 lines -->
         <max-size-bytes>104857600</max-size-bytes>
         <address-full-policy>PAGE</address-full-policy>

      </address-setting>
   </address-settings>

الآن من الممكن أن يكون لديك طوابير ضخمة تنتظر معالجتها.

نصائح أخرى

من عند هنا يبدو أن كومةك صغيرة جدًا.

سيقوم المجمع المتوازي بإلقاء OutofMemoryError إذا تم إنفاق الكثير من الوقت في جمع القمامة: إذا تم إنفاق أكثر من 98 ٪ من إجمالي الوقت في جمع القمامة وتم استرداد أقل من 2 ٪ من الكومة ، فسيتم إلقاء OutofMemoryerror. تم تصميم هذه الميزة لمنع التطبيقات من الركض لفترة طويلة من الزمن مع إحراز تقدم ضئيل أو معدوم لأن الكومة صغيرة جدًا. إذا لزم الأمر ، يمكن تعطيل هذه الميزة عن طريق إضافة الخيار -xx: -usegCoverheadLimit إلى سطر الأوامر.

هل حاولت تعديل خيارات ذاكرة JVM الخاصة بك ، و -Xmx (الحد الأقصى للذاكرة المتخصصة) على وجه الخصوص؟ أظن أنك بحاجة إلى زيادة ذاكرة JVM Max الخاصة بك ، لمنحها مساحة كافية لمعالجة رسائلك.

إذا كان على مطور ، يمكنك ببساطة إسقاط قائمة الانتظار الخاصة بك عن طريق حذف دليل عمل HornetQ الخاص بك (على سبيل المثال/Work/Hornetq).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top