首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Activemq JmsTemplate JMSDeliveryTime错误

Activemq JmsTemplate JMSDeliveryTime错误
EN

Stack Overflow用户
提问于 2020-06-24 08:50:26
回答 2查看 757关注 0票数 0

一天,我对ActiveMQ很陌生,我正在努力学习,但是当我在发布之前使用JMSDeliveryTime来延迟我的消息时,我会收到这个错误。任何遇到这个错误的人请帮忙。我搜索了类似的主题,我注意到人们说这是因为JMS2.0,但它并没有这么说。我使用的是ActiveMQ经典。

代码语言:javascript
复制
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调用

代码语言:javascript
复制
    @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";
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
复制
      <exclusions>
        <exclusion>
          <artifactId>geronimo-jms_1.1_spec</artifactId>
          <groupId>org.apache.geronimo.specs</groupId>
        </exclusion>
      </exclusions>

相反,它包含了雅加达版本:

代码语言:javascript
复制
    <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的代理上工作。

票数 2
EN

Stack Overflow用户

发布于 2020-06-24 10:15:19

我用ScheduledMessage而不是JMSDeliveryDelay来解决我的问题

代码语言:javascript
复制
    jmsTemplate.convertAndSend(queue, message, new MessagePostProcessor() {
        @Override
        public Message postProcessMessage(Message msg) throws JMSException {
            msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
            return msg;
        }
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62551179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档