Listener method 'public void com.config.mq.MsgReceiver.process(java.lang.String) throw

RabbitMQ监听消息时遇到的错误,项目启动就会持续跳出来,其实仔细可以明白其意思,就是有一个公有化的监听方法参数是String类型,所以抛出异常;

开始的时候这样是不会报错的,因为RabbitMQ中队列接受的就是String类型,如果中途因为某种原因,修改了参数的类型,这时参数的类型应该是Message类型,再次切换回String类型或其他类型,就会导致参数类型不匹配,消息无法消费,这是消息的类型会一直保持Message类型,它的类型是向下兼容改变方式;

  • 解决这样的问题我有两种方式:
  1. 简单粗暴,直接打开RabbitMQ服务,找到对应的坐标(交换机、路由器、队列)直接删除,让其重新生成;
  2. 使用Message(org.springframework.amqp.core.Message),getBody()将参数取出转换成所需要的类型即可;

经过线上多次测试,由于消息生成者和消费者已经配置好了,短时间内上面的两种方式可以解决问题,长时间后还是会出现消费不掉的消息,最后解决采用以下方式:

  • 开启线程,参数类型继续为String类型

线程池配置(SpringBoot)

package com.config.async;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;/*** 线程池配置 by CHENYB date 2019-07-29*/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {@Bean@Overridepublic Executor getAsyncExecutor() {//线程池设置ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize( 8 );//核心线程taskExecutor.setMaxPoolSize( 16 );//最大线程taskExecutor.setQueueCapacity( 64 );//队列大小taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.setThreadNamePrefix( "async-token-" );taskExecutor.initialize();return taskExecutor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return new SpringAsyncExceptionHandler();}class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable throwable, Method method, Object... obj) {//logger.error("Exception occurs in async method", throwable.getMessage());}}
}

消费者配置:

其中@Component注解,一定不可以是@Service,会导致消息一旦监听失败,不会重复发起请求,会报错线程问题

在SpringBoot中@Async开启异步

package com.config.mq;import com.exception.ExceptionEnum;
import com.exception.MyException;
import com.jwt.service.JwtService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** RabbitMQ监听者 by CHENYB of date 2019-07-22*/
@Component
public class MsgReceiver {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate JwtService jwtService;/*** 异步处理&MQ监听整合* @param message*/@RabbitListener(queues = MQCoordinate.TOKENTIMEOUT_QUEUE_A)@Asyncpublic void process(String message) {if (StringUtils.isNotBlank( message )){String userId = message;logger.info("Token时效队列 监听1(String) {} 中消息: {}",MQCoordinate.TOKENTIMEOUT_QUEUE_A,userId);if (!this.jwtService.tokenValid( userId ))//更新Token时效throw new MyException( ExceptionEnum.EXCEPTION_ANALYSIS_TOKEN );}}}

当初就是用的@Service注解,导致线程报错产生,后想去掉线程回归原始,接受消息时采用Message类型,最后标题错误出现,解决本次问题采用的最后的解决方案,即开启了异步消费消息,又解决了消费参数类型不匹配问题,还是有点懵,但是问题解决了

chenyb 随笔记录,只为方便自己学习

2019-10-24

Listener method 'public void com.config.mq.MsgReceiver.process(java.lang.String) throw相关推荐

  1. springboot启动报错Parameter 0 of method a in com.* required a bean of type 'java.lang.String' that could

    springboot服务启动报错,报错信息如下 *************************** APPLICATION FAILED TO START ******************** ...

  2. java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.String.equals(j

    今天切正式环境出现的空指针 记录一下 下面是错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean j ...

  3. Cannot resolve method ‘call(java.lang.String, org.apache.flink.table.api.ApiExpression)‘

    intellij提示: Cannot resolve method 'call(java.lang.String, org.apache.flink.table.api.ApiExpression)' ...

  4. Operator ‘+‘ cannot be applied to ‘java.lang.String‘, ‘void

    Operator '+' cannot be applied to 'java.lang.String', 'void 解决方案 今天在写题的时候,发现一个问题,如下图 这个报错的原因是 运算符 + ...

  5. Factory method ‘redisConnectionFactory‘ threw exception; nested exception is java.lang.NoClassDefFou

    Factory method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFou ...

  6. Factory method ‘sqlSessionFactory‘ threw exception; nested exception is java.lang.NoSuchMethodError:

    springboot 引入mybatis-plus后报错: Factory method 'sqlSessionFactory' threw exception; nested exception i ...

  7. 在Junit调试中,出现警告: Method 'public void classname' could not be resolved.并报initializationError错误

    具体信心如图所示 说明在调试时,没有在方法的上面加@Test调用Junit导致的. 通常是因为你在一个方法中定义了多个方法,你可能在你写的第一个方法加了@Test,但是后面的由于粗心忘记加了而已. 切 ...

  8. Binary XML file line #98: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lan

    错误如下图 看到提示在 98行, 到布局中看到view 用小写了, 改成大写即可.

  9. Rabbitmq学习笔记008---AmqpException: No method found for class java.lang.String

    JAVA技术交流QQ群:170933152 1.我这里报错是因为,接收的地方,写的是process(byte[] by) 而发送的地方,是send(String message),不统一造成的, 2. ...

最新文章

  1. maven项目密码md5加密_加密Spring Boot中的application.properties
  2. 使用LS2J技术在LotusScript中使用Java
  3. How to change windows applicatioin's position via Win32 API
  4. AJAX中的请求方式以及同步异步的区别
  5. codeforces 的一些数学题
  6. 虚拟服务器放2个网站,如何一个虚拟主机空间放两个网站的基本原理
  7. 老鸟程序员才知道的40个小技巧
  8. lm_license_file 冲突怎么办_【微课+语音】孩子一个多月没有上学了怎么办?
  9. rocket mq 监听端口_如何使用Jmeter实现MQ数据的发送和接收?性能测试实战篇
  10. git本地给远程仓库创建分支
  11. extThree20XML extThree20JSON 引入到工程中的方式
  12. java虚拟机的heap监狱_JVM垃圾回收--垃圾收集器总结
  13. openstack手动部署简单记录
  14. ADS软件的使用教程
  15. KinectV2 qt opencv 实现平面测量
  16. 物联网技术:射频识别技术RFID解析
  17. gst-rtsp-server 编译日志
  18. Microsoft 提供的 USB 驱动程序
  19. linux报错Error: /proc must be mounted
  20. 在轮询系统如何将A站订单在B站自动建立,并调用B站产品

热门文章

  1. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...
  2. WEBGUI配置和如何启动WEBGUI
  3. vue实现3D饼状图
  4. Navicat Premium使用
  5. mysql的ole db 访问接口msdasql的数据源对象_无法从链接服务器 (null) 的 OLE DB 访问接口 MSDASQL 获取列信息...
  6. Google signin 引发的崩溃(人)
  7. Linux软件raid删除
  8. 【矩阵论笔记】线性变换在不同基偶下的矩阵之间的关系
  9. Golang(1)-简介及特性
  10. 关于a21A11+a22A12+a23A13=0的证明