已經對SpringCloud和熟悉了,但是今天在用Feign去調用其他微服務的時候遇到了兩個問題:
1.把其他微服務當做service層來調用時,怎樣傳遞一個對象參數,而不是基本類型的參數;
2.當我傳遞基本類型的參數時,服務總是啟動不起來;
問題再現1
@RequestMapping(value = "/callLog/saveCallLog",method = RequestMethod.POST) ResultVO<Boolean> saveCallLog(BuTaskCallLogDTO buTaskCallLogDTO,@RequestParam("companyCode")Long companyCode);
對方的微服務里需要傳遞一個對象BuTaskCallLogDTO
其實這種問題需要對方的微服務處理一下即可
@ApiOperation(value = "添加呼叫記錄") @PostMapping("/saveCallLog") public ResultVO saveCallLog(@RequestBody BuTaskCallLogDTO buTaskCallLogDTO,@RequestParam("companyCode")Long companyCode){ String date=getThisMonth(); String tableName=tableStart+companyCode+"_"+date.replace("-","_"); buTaskCallLogDTO.setTableName(tableName); /** 添加呼叫記錄 */ callLogService.saveOrUpdateCallLog(buTaskCallLogDTO); return ResultVOUtil.success(true); }
標紅的地方就是需要注意的點
問題再現2
@GetMapping("/user/testUserTimeOut") ResultVO<Boolean> testUserTimeOut(Long mills,String token);
服務啟動時報錯:
2018-11-27 14:11:22,387 [localhost-startStop-1] WARN org.apache.catalina.loader.WebappClassLoaderBase - The web application [ROOT] appears to have started a thread named [RxIoScheduler-1 (Evictor)] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745) Disconnected from the target VM, address: '127.0.0.1:61806', transport: 'socket'
其實對於這種錯,很懵逼的。。。你不知道具體錯誤出現在哪里,只是報內存泄露!
對於這種錯,那就用一個方法:排除法!
case1: 把自己剛才寫的代碼注釋掉,運行項目能起來那就是以前的問題,需要繼續排除。。。
case2: 代碼注釋掉之后程序能正常運行,那就說明是自己剛寫的bug。。。
我剛才就注釋掉自己的代碼,發現項目能正常運行,哈哈哈,找到問題的所在之處:
反復對比之前寫的代碼,竟然發現自己沒有加參數的注解
@GetMapping("/user/testUserTimeOut") ResultVO<Boolean> testUserTimeOut(@RequestParam(value = "mills")Long mills,@RequestParam(value = "token")String token);
結論:Feign調用其他微服務時,必須有必要的參數注解
@RequestParam 這個是默認的參數注解
@PathVariable 這個是路徑傳參時要用的