一天,我对ActiveMQ很陌生,我正在努力学习,但是当我在发布之前使用JMSDeliveryTime来延迟我的消息时,我会收到这个错误。任何遇到这个错误的人请帮忙。我搜索了类似的主题,我注意到人们说这是因为JMS2.0,但它并没有这么说。我使用的是ActiveMQ经典。
java.lang.AbstractMethodError: Receiver class org.apache.activemq.command.ActiveMQTextMessage does not define or inherit an implementation of the resolved method 'abstract void setJMSDeliveryTime(long)' of interface javax.jms.Message.
at com.activemq.poc5.ProducerResource$1.postProcessMessage(ProducerResource.java:38) ~[classes/:na]
at org.springframework.jms.core.JmsTemplate.lambda$convertAndSend$6(JmsTemplate.java:682) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:604) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.jms.core.JmsTemplate.lambda$send$2(JmsTemplate.java:577) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:504) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:576) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:680) ~[spring-jms-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at com.activemq.poc5.ProducerResource.publish(ProducerResource.java:35) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at 我要发送的API调用
@GetMapping("/{message}")
public String publish(@PathVariable("message")
final String message) {
for (int i = 1; i <= 3; i++) {
// jmsTemplate.setPriority(2);
// jmsTemplate.convertAndSend(queue, message); //this method sends the given object to the queue destination, converting the object to JMS message
jmsTemplate.convertAndSend(queue, message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message msg) throws JMSException {
msg.setJMSDeliveryTime(20000);
return msg;
}
});
}
return "Published Successfully";
}发布于 2020-06-24 14:23:34
的确,错误消息并没有明确指出问题与JMS 2不兼容,但这实际上就是问题所在。ActiveMQ 5.x (即“经典”)只实现JMS1.1。它没有实现JMS2.0。在JMS2.0中添加了setJMSDeliveryTime方法。因此,不能在setJMSDeliveryTime 5.x客户端上使用ActiveMQ。
在一条评论中,您说您使用的是spring-boot-starter-activemq依赖项。此依赖性显式地排除了JMS1.1API:
<exclusions>
<exclusion>
<artifactId>geronimo-jms_1.1_spec</artifactId>
<groupId>org.apache.geronimo.specs</groupId>
</exclusion>
</exclusions>相反,它包含了雅加达版本:
<dependency>
<groupId>jakarta.jms</groupId>
<artifactId>jakarta.jms-api</artifactId>
<scope>compile</scope>
</dependency>这种依赖的版本是2.0.3,它支持JMS2.0。这意味着JMS版本实际上与ActiveMQ 5.x客户机不兼容,这就是为什么您的IDE和/或编译器没有抱怨您使用的是不受支持的方法(即setJMSDeliveryTime)。
我建议您从类路径中删除JMS2.0API(例如,在Maven依赖项中使用您自己的<excludes> ),这样您就可以在构建时捕获这类错误,此时您可以利用ActiveMQ的预定消息功能或移动到实际上支持ActiveMQ Artemis之类的客户机/代理。
如果您选择坚持使用ActiveMQ 5.x并使用其预定的消息功能,那么您的应用程序在将来迁移到不同的JMS时将无法正常工作,因为ActiveMQ 5.x用于实现预定消息功能的属性是ActiveMQ特有的。但是,如果迁移到一个支持JMS2.0并使用标准setJMSDeliveryTime的代理,那么您的应用程序将能够在任何支持JMS2.0的代理上工作。
发布于 2020-06-24 10:15:19
我用ScheduledMessage而不是JMSDeliveryDelay来解决我的问题
jmsTemplate.convertAndSend(queue, message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message msg) throws JMSException {
msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
return msg;
}
});
}https://stackoverflow.com/questions/62551179
复制相似问题