На компьютере с Windows 10 и Java 11.0.21. Я загрузил последнюю версию JMeter 5.6.3.
У меня есть файл jmx с сэмплером JMS Publisher Sampler, который настроен для подключения и публикации в очереди, работающей на удаленном сервере ActiveMQ Artemis.
Я использую activemq-all-5.18.3.jar
, чтобы JMS Publisher Sampler мог взаимодействовать с удаленной очередью ActiveMQ Artemis.
activemq-all-5.18.3.jar
помещается в папку Dependencies
на моем локальном пути, и я загружаю его в путь к классам через файл config.properties
:
user.classpath=./Dependencies
Файл конфигурации вызывается следующим образом:
$ jmeter -q .\config.properties -t .\test.jmx
После запуска графического интерфейса я запускаю тест и получаю следующую ошибку в журнале JMeter:
ERROR o.a.j.JMeter: Uncaught exception in thread Thread[Create 1-1,6,main]
java.lang.NoSuchMethodError: javax.jms.Message.setJMSDeliveryTime(J)V
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1993) ~[activemq-all-5.18.3.jar:5.18.3]
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:329) ~[activemq-all-5.18.3.jar:5.18.3]
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:289) ~[activemq-all-5.18.3.jar:5.18.3]
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:224) ~[activemq-all-5.18.3.jar:5.18.3]
at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:298) ~[activemq-all-5.18.3.jar:5.18.3]
at org.apache.jmeter.protocol.jms.client.Publisher.setPropertiesAndSend(Publisher.java:191) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.client.Publisher.publish(Publisher.java:148) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.sampler.PublisherSampler.sample(PublisherSampler.java:233) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.sampler.BaseJMSSampler.sample(BaseJMSSampler.java:98) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.6.3]
at java.base/java.lang.Thread.run(Thread.java:834) [?:?]
Я хочу иметь возможность публиковать сообщение с помощью семплера JMS Publisher.
Я попытался изменить версию зависимости jar на последнюю (activemq-all-6.1.0.jar
) и получил другую ошибку:
java.lang.UnsupportedClassVersionError: org/apache/activemq/jndi/ActiveMQInitialContextFactory 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
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) ~[?:?]
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) ~[?:?]
at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:555) ~[?:?]
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458) ~[?:?]
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452) ~[?:?]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[?:?]
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451) ~[?:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[?:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
at java.base/java.lang.Class.forName0(Native Method) ~[?:?]
at java.base/java.lang.Class.forName(Class.java:398) ~[?:?]
at java.naming/com.sun.naming.internal.VersionHelper.loadClass(VersionHelper.java:127) ~[?:?]
at java.naming/com.sun.naming.internal.VersionHelper.loadClass(VersionHelper.java:133) ~[?:?]
at java.naming/com.sun.naming.internal.VersionHelper.loadClass(VersionHelper.java:100) ~[?:?]
at java.naming/javax.naming.spi.NamingManager.getFactory(NamingManager.java:757) ~[?:?]
at java.naming/javax.naming.spi.NamingManager.lambda$getInitialContext$1(NamingManager.java:722) ~[?:?]
at java.base/jdk.internal.loader.AbstractClassLoaderValue$Memoizer.get(AbstractClassLoaderValue.java:329) ~[?:?]
at java.base/jdk.internal.loader.AbstractClassLoaderValue.computeIfAbsent(AbstractClassLoaderValue.java:205) ~[?:?]
at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:722) ~[?:?]
at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) ~[?:?]
at java.naming/javax.naming.InitialContext.init(InitialContext.java:236) ~[?:?]
at java.naming/javax.naming.InitialContext.<init>(InitialContext.java:208) ~[?:?]
at org.apache.jmeter.protocol.jms.client.InitialContextFactory.lookupContext(InitialContextFactory.java:66) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.client.InitialContextFactory.getContext(InitialContextFactory.java:155) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.client.Publisher.<init>(Publisher.java:126) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.sampler.PublisherSampler.initClient(PublisherSampler.java:185) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.sampler.PublisherSampler.sample(PublisherSampler.java:209) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.protocol.jms.sampler.BaseJMSSampler.sample(BaseJMSSampler.java:98) ~[ApacheJMeter_jms.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.6.3]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.6.3]
at java.base/java.lang.Thread.run(Thread.java:834) [?:?]
Кто-нибудь знает, в чем причина и как я могу это исправить?
Вы используете клиент OpenWire JMS, который поставляется с ActiveMQ Classic. Версия 5.18.3 не поддерживает метод JMS 2 javax.jms.Message.setJMSDeliveryTime(), поэтому вы нажимаете NoSuchMethodError
. Для версии 6.0.1 требуется Java 17 или выше, поэтому вы нажимаете UnsupportedClassVersionError
.
Я рекомендую вам использовать клиент Core JMS, который поставляется с ActiveMQ Artemis. Он полностью поддерживает JMS 2 и не требует Java 17. Для него требуется только Java 11. Если вы загружаете его и добавляете в путь к классам JMeter, я рекомендую этот.
Вы где-то указали использование org.apache.activemq.jndi.ActiveMQInitialContextFactory
для JNDI — либо в конфигурации сэмплера JMeter, либо, возможно, в файле jndi.properties
, который находится в пути к классам. Вам нужно найти место, где вы указали этот класс, и изменить его на org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
.
Действительно, ваш комментарий оказался в точку! И у издателя JMS, и у подписчика JMS есть свойство с именем «Фабрика начального контекста». Это нужно было изменить с org.apache.activemq.jndi.ActiveMQInitialContextFactory
на org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
; Первоначально скрипт работал без этих изменений, но на другой машине, на которой работал openjdk 21.0.1
. Теперь, когда я изменил машину и версию Java на 11, мне нужно было адаптировать и это свойство, и используемый jar-файл зависимостей. Большое спасибо за ваши содержательные комментарии!
Спасибо. При использовании рекомендованного
artemis-jms-client-all-2.32.0.jar
мне действительно удается обойти первоначальное сообщение об ошибке, но теперь сэмплер JMS Publisher выдает следующую ошибку:javax.naming.NamingException: javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory] at org.apache.jmeter.protocol.jms.client.InitialContextFactory.lookupContext(InitialContextFactory.java:68)...
Есть идеи, что еще мне не хватает?