[email protected]非同步+多執行緒
阿新 • • 發佈:2019-01-08
博主在寫專案是需要新增非同步操作來提高效率,在網上有很多關於非同步操作的例子 有的是整合訊息佇列mq(kafka等分散式訊息佇列 )有的是整合redis的訊息佇列等操作,關於訊息佇列的好處可以自行百度一下,在下認為整合訊息佇列是需要安裝對應的程式對於小型專案沒有必要,有時專案可能就是需要一個非同步方法當然各有各自的好處下面簡單說一下:
缺點:當時用@Async進行非同步操作時固然簡單但是當整個專案掛掉的時候訊息可能不會及時消費
mq優點:整合訊息佇列生產者和消費者可能兩個單獨的應用 當生產者掛掉的時候消費者可以進行正常消費
好了廢話不說了,趕緊上程式碼
1:整合@Async進行一步操作
在啟動類上加上@EnableAsync註解開啟非同步操作
@SpringBootApplication@EnableAsync public class Neo4jV2Application {
public static void main(String[] args) { SpringApplication.run(Neo4jV2Application.class, args); }}
在方法上使用@Async註解
@Async public void getWbswryxxMessage(ConsumerRecord record) { }
好了非同步操作完成了是不是很簡單,可是可是。。。。。。。。。。。。。。。。。
這裡一定要注意千萬注意!!!!!!俺就被坑了一次 呼叫被@Async標記的方法的呼叫者不能和被呼叫的方法在同一類中不然不會起作用!!!!!!!
2:整合多執行緒操作
這裡使用的是執行緒池
@Bean(name = "taskExecutorWbswryxx") public Executor taskExecutorWbswryxx() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(10); executor.setQueueCapacity(200); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("taskExecutorWbswryxx-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(60); return executor; }
@Bean要起個名字,然後怎麼使用呢?很簡單隻需要在@Async註解新增一個屬性
@Async(value = "taskExecutorWbswryxx") public void getWbswryxxMessage(ConsumerRecord record){ }
這裡千萬也要注意使用@Async時要求是不能有返回值的不然會報錯的 因為非同步要求是不關心結果的