{"id":316307,"date":"2021-02-04T03:44:54","date_gmt":"2021-02-03T19:44:54","guid":{"rendered":"http:\/\/4563.org\/?p=316307"},"modified":"2021-02-04T03:44:54","modified_gmt":"2021-02-03T19:44:54","slug":"%e5%bc%82%e6%ad%a5%e4%bb%bb%e5%8a%a1%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=316307","title":{"rendered":"\u5f02\u6b65\u4efb\u52a1\u95ee\u9898"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  \u5f02\u6b65\u4efb\u52a1\u95ee\u9898               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : qm332207252 <\/span>  <span><i><\/i> 7<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<p>\u4e00\u4e2a\u63a5\u53e3,\u63a5\u6536\u5230\u4e00\u6b21\u8bf7\u6c42,\u8c03\u7528 service \u6267\u884c\u5f02\u6b65\u4efb\u52a1,\u5f02\u6b65\u4efb\u52a1\u6267\u884c\u4e2d,\u76f4\u63a5\u8fd4\u56de\u54cd\u5e94,\u518d\u6b21\u8bf7\u6c42\u8be5\u63a5\u53e3\u6216\u8005\u5176\u4ed6\u7528\u6237\u8bf7\u6c42\u8be5\u63a5\u53e3(\u66f4\u6216\u8005\u662f\u81ea\u52a8\u4efb\u52a1\u6267\u884c),\u8c03\u7528 service,\u4e0a\u6b21\u8bf7\u6c42\u8fd9\u4e2a\u4efb\u52a1\u8fd8\u5728\u6267\u884c\u4e2d,\u56e0\u6b64\u8fd4\u56de\u5904\u7406\u4e2d,\u8fd9\u79cd java \u540e\u53f0\u6709\u6bd4\u8f83\u597d\u7684\u5b9e\u73b0\u5417?<\/p>\n<\/p><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>15<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"5036392\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : dqzcwxb <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u52a0\u4e2a\u9501                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036393\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : stonewu <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u6700\u7b80\u5355\u7684\u65b9\u5f0f\u5c31\u662f\u5b9a\u4e49\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036394\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : qm332207252 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @dqzcwxb \u80fd\u8be6\u7ec6\u70b9\u8bf4\u660e\u4e0b\u4e0d                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036395\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : zoharSoul <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u8bb0\u5230\u4efb\u52a1\u8868.                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036396\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : qm332207252 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @stonewu \u6211\u4e5f\u60f3\u8fc7\u5728\u8c03\u7528\u5f02\u6b65\u65b9\u6cd5\u5916\u9762\u7528\u4e2a\u4ec0\u4e48\u53d8\u91cf\u6807\u8bb0\u6267\u884c\u72b6\u6001                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036397\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : MicroGalaxy <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u8fd9\u79cd\u9700\u6c42\u8fd8\u662f\u5168\u5c40\u53d8\u91cf\u6700\u7b80\u5355\u597d\u7528                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036398\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : qm332207252 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @MicroGalaxy \u7c7b\u4f3c\u524d\u7aef\u505a\u767b\u5f55\u6309\u94ae,\u8bf7\u6c42\u8868\u683c\u6570\u636e\u4ec0\u4e48\u7684\u5f02\u6b65\u8bf7\u6c42\u52a0\u72b6\u6001\u6807\u8bb0\u90a3\u6837\u54af?                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036399\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : killergun <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             Ticket \uff1f\u6839\u636e Ticket \u6765\u83b7\u53d6\u8fdb\u5c55                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036400\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : guoyuchuan <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5f02\u6b65\u4efb\u52a1\u53ef\u4ee5\u914d\u7f6e\u7ebf\u7a0b\u6c60\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u5b58\u5728\u4f60\u8bf4\u7684\u8fd9\u4e2a\u95ee\u9898\u4e86                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036401\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : guoyuchuan <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @guoyuchuan #9 \u4e0d\u5bf9\uff0c\u8bf4\u9519\u4e86                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036402\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : liian2019 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5355\u673a\u5c31\u6574\u4e2a AtomicBoolean\uff0c\u5206\u5e03\u5f0f\u5c31\u6574\u4e2a redis \u8bb0\u4e00\u4e0b                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036403\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : RedBeanIce <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             java \u5f02\u6b65\u4efb\u52a1\u6709\u5f88\u591a\u65b9\u6cd5\uff0cCompletableFuture.runAsync<\/p>\n<p>\u81f3\u4e8e\u7b2c\u4e8c\u6b21\u8fdb\u6765\u7684\u95ee\u9898\uff0c\u52a0\u4e2a\u9501\u5c31\u884c\uff0c\u4e0a\u6709\u8bf4\u660e\uff0c\u5355\u673a\u548c\u5206\u5e03\u5f0f                                                            <\/p><\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036404\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : oneisall8955 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5355\u673a\u8fd8\u662f\u96c6\u7fa4\uff0c\u5355\u673a\u914d\u53ea\u9759\u6001\u53d8\u91cf\uff0c\u96c6\u7fa4\u641e redis\uff0c\u52a0\u4e2a key \u6807\u8bc6                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036405\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : siweipancc <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5360\u5751#                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"5036406\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : siweipancc <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @Log<br \/>@RestController<br \/>@SpringBootApplication<br \/>public class WebApplication {<\/p>\n<p> public static void main(String[] args) {<br \/> SpringApplication.run(WebApplication.class, args);<br \/> }<\/p>\n<p> static final String CREATED = &#8220;create&#8221;;<br \/> static final String PROCESS = &#8220;process&#8221;;<br \/> static final String COMPLETE = &#8220;complete&#8221;;<\/p>\n<p> @PostMapping(&#8220;generate&#8221;)<br \/> public ResponseEntity&lt;Response&gt; generate(@RequestBody Request request) {<br \/> return ResponseEntity.ok(generate(request.input, request.taskId));<br \/> }<\/p>\n<p> @Autowired<br \/> private RedisTemplate&lt;Object, Object&gt; redisTemplate;<br \/> @Autowired<br \/> private ThreadPoolTaskExecutor executor;<\/p>\n<p> @PostConstruct<br \/> public void init() {<br \/> redisTemplate.setKeySerializer(RedisSerializer.string());<br \/> redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());<br \/> }<\/p>\n<p> Function&lt;UUID, String&gt; valKeyFunc = uuid -&gt; &#8220;value::&#8221; + uuid;<br \/> Duration expire = Duration.ofMinutes(30L);<\/p>\n<p> public Response generate(Integer input, UUID taskId) {<\/p>\n<p> if (taskId == null) {<br \/> check(input != null, &#8220;\u8bf7\u8f93\u5165\u503c&#8221;);<br \/> UUID uuid = createTask(input);<br \/> return new Response(CREATED, null, uuid, expire.getSeconds());<br \/> }<\/p>\n<p> String key = valKeyFunc.apply(taskId);<br \/> Long expire = redisTemplate.getExpire(key);<br \/> Entity value;<br \/> try {<br \/> value = (Entity) redisTemplate.opsForValue().get(key);<br \/> } catch (ClassCastException e) {<br \/> log.warning(e.getMessage());<br \/> e.printStackTrace();<br \/> throw new RuntimeException(&#8220;\u670d\u52a1\u5668\u5185\u90e8\u9519\u8bef&#8221;);<br \/> }<br \/> check(value != null, &#8220;\u4efb\u52a1 &#8221; + taskId + &#8221; \u4e0d\u5b58\u5728\u6216\u8005\u5df2\u7ecf\u8fc7\u671f&#8221;);<br \/> assert value != null;<br \/> check(value.complete != null, &#8220;\u670d\u52a1\u5668\u5185\u90e8\u9519\u8bef&#8221;);<br \/> if (!value.complete) {<br \/> return new Response(PROCESS, null, taskId, expire);<br \/> }<\/p>\n<p> return new Response(COMPLETE, value, taskId, expire);<br \/> }<\/p>\n<p> private static void check(Boolean condition, String msg) {<br \/> if (!Boolean.TRUE.equals(condition)) {<br \/> throw new RuntimeException(msg);<br \/> }<br \/> }<\/p>\n<p> private UUID createTask(Integer input) {<br \/> UUID uuid = UUID.randomUUID();<br \/> executor.execute(() -&gt; {<br \/> try {<br \/> Entity entity = new Entity(uuid, false, new Date(), null, input, null);<br \/> log.info(String.format(&#8220;begin task: %s, input: %s&#8221;, uuid, input));<br \/> String key = valKeyFunc.apply(uuid);<br \/> redisTemplate.opsForValue().set(key, entity, expire);<br \/> log.info(String.format(&#8220;set task: %s, input: %s, key: %s&#8221;, uuid, input, key));<br \/> TimeUnit.SECONDS.sleep(RandomUtil.randomInt(10, 20));<br \/> String value = RandomUtil.randomString(Math.abs(input));<br \/> entity.complete = true;<br \/> entity.completeTime = new Date();<br \/> entity.output = value;<br \/> log.info(String.format(&#8220;end task: %s, input: %s, generated: %s&#8221;, uuid, input, value));<br \/> redisTemplate.opsForValue().set(key, entity, expire);<br \/> } catch (InterruptedException e) {<br \/> log.warning(e.getMessage());<br \/> e.printStackTrace();<br \/> }<br \/> });<br \/> return uuid;<br \/> }<\/p>\n<p> @Data<br \/> static class Request {<br \/> Integer input;<br \/> UUID taskId;<br \/> }<\/p>\n<p> @AllArgsConstructor<br \/> @NoArgsConstructor<br \/> @Data<br \/> static class Response {<br \/> String status;<br \/> Object data;<br \/> UUID taskId;<br \/> Long expire;<br \/> }<\/p>\n<p> @Data<br \/> @AllArgsConstructor<br \/> @NoArgsConstructor<br \/> static class Entity {<br \/> UUID taskId;<br \/> Boolean complete;<br \/> Date beginTime;<br \/> Date completeTime;<\/p>\n<p> Integer input;<br \/> String output;<br \/> }<\/p>\n<p>}                                                            <\/p><\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>\u5f02\u6b65\u4efb\u52a1\u95ee\u9898 \u8cc7\u6df1\u5927\u4f6c : qm3&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/316307"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=316307"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/316307\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=316307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=316307"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=316307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}