廊坊网站建设咨询青橙网络如何建设cpa影视网站

news/2025/10/6 4:48:32/文章来源:
廊坊网站建设咨询青橙网络,如何建设cpa影视网站,首页设计图,网络推广团队分工我的最后两个博客讨论了长时间轮询和Spring的DeferredResult技术#xff0c;并且为了展示这些概念#xff0c;我将我的Producer Consumer项目中的代码添加到了Web应用程序中。 尽管该代码演示了博客所提出的观点#xff0c;但其逻辑上确实包含大量漏洞。 除了在实际的应用程… 我的最后两个博客讨论了长时间轮询和Spring的DeferredResult技术并且为了展示这些概念我将我的Producer Consumer项目中的代码添加到了Web应用程序中。 尽管该代码演示了博客所提出的观点但其逻辑上确实包含大量漏洞。 除了在实际的应用程序中不会使用简单的LinkedBlockingQueue而是会选择JMS或其他一些具有工业实力的消息传递服务的事实以及只有一个用户可以掌握匹配更新的事实之外还有一个问题生成行为不佳的线程这些线程在JVM终止时不会关闭。 您可能想知道为什么这应该是一个问题……对您而言作为开发人员这根本不是问题这只是一点点草率的编程但是对于您的一个操作人员而言它可能会使生活变得不必要地困难。 这样做的原因是如果您有太多行为异常的线程那么键入Tomcat的shutdown.sh命令将几乎没有效果并且您必须通过键入以下命令来大胆地杀死Web服务器 ps -ef | grep java 得到pid然后 kill -9 pid …并且当您有一个Tomcat Web服务器字段来重新启动所有这些额外的问题时这将变得非常痛苦。 当您键入shutdown.sh您希望Tomcat停止。 在我的前两篇博客中我创建的行为不良的线程具有以下run()方法其中第一个方法表现如下 Override public void run() { while (true) { try { DeferredResultMessage result resultQueue.take(); Message message queue.take(); result.setResult(message); } catch (InterruptedException e) { throw new UpdateException(Cannot get latest update. e.getMessage(), e); } } } 在这段代码中我使用了一个无限的while(true) 这意味着线程将一直运行并且永不终止。 Override public void run() { sleep(5); // Sleep to allow the reset of the app to load logger.info(The match has now started...); long now System.currentTimeMillis(); ListMessage matchUpdates match.getUpdates(); for (Message message : matchUpdates) { delayUntilNextUpdate(now, message.getTime()); logger.info(Add message to queue: {}, message.getMessageText()); queue.add(message); } start true; // Game over, can restart logger.warn(GAME OVER); } 上面的第二个示例也表现不佳。 它将继续从MatchUpdates列表中获取消息并在适当的时候将其添加到消息队列中。 它们唯一的优点是它们可能会引发InterruptedException 如果处理不当将导致线程终止。 但是这不能保证。 确实有一个快速修复程序……您要做的就是确保您创建的任何线程都是守护程序线程。 守护程序线程的定义是一个线程它不会阻止JVM在程序完成时退出但该线程仍在运行。 守护程序线程的通常示例是JVM的垃圾回收线程。 要将线程转换为守护程序线程只需调用 thread.setDaemon(true); …然后当您键入shutdown.sh然后输入WHAM时 所有线程将消失。 但是这有一个问题。 如果您的守护程序线程中的一个正在做重要的事情并在其主要时间内将其砍掉会导致丢失一些非常重要的数据怎么办 您需要做的是确保所有线程正常关闭以完成它们当前正在进行的所有工作。 本博客的其余部分演示了针对这些错误线程的修复程序通过使用ShutdownHook优雅地协调了它们的ShutdownHook 。 根据文档 “ shutdown hook”只是一个已初始化但未启动的线程。 当虚拟机开始其关闭序列时它将以某种未指定的顺序启动所有已注册的关闭挂钩并使其同时运行。” 因此在读完最后一句话之后您可能已经猜到您需要做的是创建一个线程该线程负责关闭所有其他线程并作为关闭钩子传递给JVM。 所有这些都可以在几个小类中通用并且可以通过对现有线程run()方法执行一些棘手的操作来实现。 要创建的两个类是ShutdownService和Hook 。 我将首先演示的Hook类用于将ShutdownService链接到您的线程。 Hook的代码如下 public class Hook { private static final Logger logger LoggerFactory.getLogger(Hook.class); private boolean keepRunning true; private final Thread thread; Hook(Thread thread) { this.thread thread; } /** * return True if the daemon thread is to keep running */ public boolean keepRunning() { return keepRunning; } /** * Tell the client daemon thread to shutdown and wait for it to close gracefully. */ public void shutdown() { keepRunning false; thread.interrupt(); try { thread.join(); } catch (InterruptedException e) { logger.error(Error shutting down thread with hook, e); } } } Hook包含两个实例变量 keepRunning和thread 。 thread是该线程的Hook实例负责关闭的线程的引用而keepRunning告诉该线程…继续运行。 Hook有两个公共方法 keepRunning()和shutdown() 。 线程调用keepRunning()以确定是否应继续运行而ShutdownService的shutdown钩子线程调用shutdown()来使线程关闭。 这是两种方法中最有趣的。 首先它将keepRunning变量设置为false。 然后它调用thread.interrupt()来中断线程迫使其引发InterruptedException 。 最后它调用thread.join()并等待thread实例关闭。 请注意此技术依赖于您所有线程的协作。 如果混合中有一个行为不佳的线程那么整个事情可能会死机。 要解决此问题请向thread.join(…)添加超时。 Service public class ShutdownService { private static final Logger logger LoggerFactory.getLogger(ShutdownService.class); private final ListHook hooks; public ShutdownService() { logger.debug(Creating shutdown service); hooks new ArrayListHook(); createShutdownHook(); } /** * Protected for testing */ VisibleForTesting protected void createShutdownHook() { ShutdownDaemonHook shutdownHook new ShutdownDaemonHook(); Runtime.getRuntime().addShutdownHook(shutdownHook); } protected class ShutdownDaemonHook extends Thread { /** * Loop and shutdown all the daemon threads using the hooks * * see java.lang.Thread#run() */ Override public void run() { logger.info(Running shutdown sync); for (Hook hook : hooks) { hook.shutdown(); } } } /** * Create a new instance of the hook class */ public Hook createHook(Thread thread) { thread.setDaemon(true); Hook retVal new Hook(thread); hooks.add(retVal); return retVal; } VisibleForTesting ListHook getHooks() { return hooks; } } ShutdownService是一个Spring服务其中包含一个Hook类的列表并因此通过推断线程负责关闭。 它还包含一个内部类ShutdownDaemonHook 该类扩展了Thread 。 的一个实例ShutdownDaemonHook的施工过程中创建ShutdownService 然后通过调用传递给JVM作为关闭挂钩 Runtime.getRuntime().addShutdownHook(shutdownHook); ShutdownService具有一个公共方法 createHook() 。 该类要做的第一件事是确保传递给它的任何线程都转换为守护程序线程。 然后它创建一个新的Hook实例将线程作为参数传入最后将结果存储在列表中并将其返回给调用者。 现在剩下要做的唯一一件事就是将ShutdownService集成到DeferredResultService和MatchReporter 这两个类包含行为不良的线程。 Service(DeferredService) public class DeferredResultService implements Runnable { private static final Logger logger LoggerFactory.getLogger(DeferredResultService.class); private final BlockingQueueDeferredResultMessage resultQueue new LinkedBlockingQueue(); private Thread thread; private volatile boolean start true; Autowired private ShutdownService shutdownService; private Hook hook; Autowired Qualifier(theQueue) private LinkedBlockingQueueMessage queue; Autowired Qualifier(BillSkyes) private MatchReporter matchReporter; public void subscribe() { logger.info(Starting server); matchReporter.start(); startThread(); } private void startThread() { if (start) { synchronized (this) { if (start) { start false; thread new Thread(this, Studio Teletype); hook shutdownService.createHook(thread); thread.start(); } } } } Override public void run() { logger.info(DeferredResultService - Thread running); while (hook.keepRunning()) { try { DeferredResultMessage result resultQueue.take(); Message message queue.take(); result.setResult(message); } catch (InterruptedException e) { System.out.println(Interrupted when waiting for latest update. e.getMessage()); } } System.out.println(DeferredResultService - Thread ending); } public void getUpdate(DeferredResultMessage result) { resultQueue.add(result); } } 此类的第一个更改是在Shutdown服务实例中自动连线。 接下来要做的是在创建线程之后但在thread.start()之前使用ShutdownService创建Hook的实例 thread new Thread(this, Studio Teletype); hook shutdownService.createHook(thread); thread.start(); 最后的更改是将while(true)替换为 while (hook.keepRunning()) { …告诉线程何时退出while循环并关闭。 您可能还注意到上面的代码中引发了一些System.out.println()调用。 这是有原因的这是因为执行关闭钩子线程的顺序不确定。 请记住不仅您的类试图正常关闭而且其他子系统也试图关闭。 这意味着我的原始代码logger.info(…)失败 logger.info(…)以下异常 Exception in thread Studio Teletype java.lang.NoClassDefFoundError: org/apache/log4j/spi/ThrowableInformationat org.apache.log4j.spi.LoggingEvent.(LoggingEvent.java:159)at org.apache.log4j.Category.forcedLog(Category.java:391)at org.apache.log4j.Category.log(Category.java:856)at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:382)at com.captaindebug.longpoll.service.DeferredResultService.run(DeferredResultService.java:75)at java.lang.Thread.run(Thread.java:722) Caused by: java.lang.ClassNotFoundException: org.apache.log4j.spi.ThrowableInformationat org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)... 6 more 这是因为当我尝试调用记录器时它已经被卸载。 同样如文档所述“ Shutdown hooks在虚拟机生命周期的微妙时间运行因此应进行防御性编码。 尤其应将其编写为线程安全的并尽可能避免死锁。 他们也不应盲目依赖可能已经注册了自己的关闭钩子的服务因此自己可能正在关闭过程中。 尝试使用其他基于线程的服务例如AWT事件调度线程可能会导致死锁。” MatchReport类具有一些非常相似的修改。 主要区别在于hook.keepRunning()代码位于run()方法的for循环内。 public class MatchReporter implements Runnable { private static final Logger logger LoggerFactory.getLogger(MatchReporter.class); private final Match match; private final QueueMessage queue; private volatile boolean start true; Autowired private ShutdownService shutdownService; private Hook hook; public MatchReporter(Match theBigMatch, QueueMessage queue) { this.match theBigMatch; this.queue queue; } /** * Called by Spring after loading the context. Will kick off the match... */ public void start() { if (start) { synchronized (this) { if (start) { start false; logger.info(Starting the Match Reporter...); String name match.getName(); Thread thread new Thread(this, name); hook shutdownService.createHook(thread); thread.start(); } } } else { logger.warn(Game already in progress); } } /** * The main run loop */ Override public void run() { sleep(5); // Sleep to allow the reset of the app to load logger.info(The match has now started...); long now System.currentTimeMillis(); ListMessage matchUpdates match.getUpdates(); for (Message message : matchUpdates) { delayUntilNextUpdate(now, message.getTime()); if (!hook.keepRunning()) { break; } logger.info(Add message to queue: {}, message.getMessageText()); queue.add(message); } start true; // Game over, can restart logger.warn(GAME OVER); } private void sleep(int deplay) { try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { logger.info(Sleep interrupted...); } } private void delayUntilNextUpdate(long now, long messageTime) { while (System.currentTimeMillis() now messageTime) { try { Thread.sleep(100); } catch (InterruptedException e) { logger.info(MatchReporter Thread interrupted...); } } } } 此代码的最终测试是在匹配更新序列中途发出Tomcat shutdown.sh命令。 JVM终止时它将从ShutdownDaemonHook类调用shutdown钩子。 在执行此类的run()方法时它将在整个Hook实例列表中循环告诉它们关闭各自的线程。 如果在服务器日志文件的末尾添加tail -f 在我的案例中为catalina.out但Tomcat可能配置为与我不同则会看到条目痕迹使服务器正常关闭。 该博客随附的代码可在Github上找到 https //github.com/roghughe/captaindebug/tree/master/long-poll 。 参考来自Captain Debugs Blog博客的JCG合作伙伴 Roger Hughes提供的Tomcat通过守护程序和Shutdown Hooks的优美关闭 。 翻译自: https://www.javacodegeeks.com/2013/10/tomcats-graceful-shutdown-with-daemons-and-shutdown-hooks.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业电器网站建设方案服务器租用是什么意思

在linux下使用rz,就可以从本机上传到Linux服务器 在linux中rz 和 sz 命令允许开发者与主机通过串口进行传递文件了,下面我们就来简单的介绍一下rz 和 sz 命令的例子。 sz:将选定的文件发送(send)到本地机器 rz:运行该命…

网站建设对企业的好处有哪些全方位营销型网站

目录 AVL树概念 AVL树结构 AVL树插入 LL型 - 右单旋 RR型 - 左单旋 LR型 - 左右双旋 RL型 - 右左双旋 插入代码实现 AVL树测试 附AVL树实现完整代码 AVL树概念 前面的博客介绍了搜索二叉树,二叉搜索树-CSDN博客 在某些特定的情况下,⼆叉搜索树…

计算机作业做网站网站页脚信息

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 1月6日消息 谷歌起草“机器人宪法” 极越与福耀集团达成合作 三星电子宣布与现代汽车集团合作 OpenAI下周将推GP…

网站建设廴金手指花总壹柒昆山网站建设及推广

目录 1.认识PDCA: 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点: 5.案例 6.其他作用 1.认识PDCA: PDCA循环最早由美国质量统计控制之父Shewhat(休哈特)提出的PDS(Plan Do Se…

个人网站数据库大小深圳网站建设ucreator

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意:之前已经创建过容器的,需要打包成镜像,重新创建容器,因为要在创建…

网站网站娱乐建设wordpress置顶文章不生效

简介 将实例化代码提取出来,放到一个类中统一管理和维护,达到和主项目依赖关系的解耦,从而提高项目的扩展性和维护性。 工厂模式将复杂的对象创建工作隐藏起来,而仅仅暴露出一个接口供客户使用,具体的创建工作由工厂管…

口碑好的秦皇岛网站建设哪里有手机建网站制作

一、章节内容概述 战略规划帮助做好当前的业务以迎接未来。战略规划需要思考业务应该是什么,当前必须做什么才能赢得未来。战略规划需要进行风险决策,需要有组织地抛弃过去的业务,要求清晰界定和明确安排为实现理想的未来而开展的工作。战略…

建网站需要软件国内经典网站

1.程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现&…

自学网站编程有多少种做网站后台程序

几天前, WildFly 9发布了,可以肯定的重点之一是Undertow Web子系统中对HTTP / 2.0的支持。 由于Hawkular最近已开始使用WildFly 9(从8.2开始)作为其基础服务器,因此尝试将http2用于从Hawkular-Wildfly-Monitor客户端到…

上海网站推广多少钱wordpress实现pdf浏览

力扣 解题报告: 二分。但是有不少细节要考虑清楚。 所以干脆考虑另一种二分的方式。也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量取模完成。这样就不需要考虑边界情况了。 …

macOS 编辑字幕

只是为了记录。我使用的软件是 Tero Subtitler 参见:Subtitle editor software | Reddit

公司如何申请一个网站网址南京华璋建设网站

安装和创建虚拟环境 参考:linux系统下Python虚拟环境的安装和使用安装Django包 先进入虚拟环境,在联网下执行:pip install django1.8.7 1.8.7表示django的版本,如果不指定,会默认安装最新版的django。包会被安装到/usr…

网站建设是无形资产网页页面布局

这一节介绍一下 Django 的中间件。 关于中间件,官方文档的解释为:中间件是一个嵌入 Django 系统的 request 和 response 的钩子框架,是一个能够全局改变 Django 输入/输出的系统。 我们可以这样理解,一个 request 请求发送到 Dj…

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 - MKT

reLeetCode 热题 100- 438. 找到字符串中所有字母异位词 1 map 固定窗口实现 不够速度 词频统计 class Solution { public:vector<int> findAnagrams(string s, string p) {map<char,int> p_map;map<…

网站维护怎么样本溪网站设计公司

问题 你是否在项目中使用线程池遇到过以下问题&#xff1f; 1.创建线程池核心参数不好评估&#xff0c;随着业务流量的波动&#xff0c;极有可能出现生产故障。 2.不支持优雅关闭&#xff0c;当项目关闭时&#xff0c;大量正在运行的线程池任务被丢弃。 3.不支持运行时监控…

做产品表情的网站深圳罗湖网站建设

/*问题出现&#xff1a;如何检查一个目录是否可写&#xff0c;如何目录下还有目录和文件&#xff0c;那么都要检查思路&#xff1a;(1)首先先写出检查空目录是否可写的算法&#xff1a;在该目录中生成一个文件&#xff0c;如果不能生成&#xff0c;表明该目录没有写的权限(2)使…

一个网站两个域名吗软件工程开发流程

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…

网站投资多少钱网站建设标准合同

一、极验请求分析 滑块测试网站入口 我们首先访问极验滑块验证码测试主页&#xff0c;以便获取后续请求中的url。 滑块验证过程抓包 通过抓包工具分析滑块验证过程&#xff0c;发现与第三代滑块验证码相比&#xff0c;第四代简化了验证过程&#xff0c;加密参数w的生成也变得…

杭州网站建设官方蓝韵网络宁夏自治区住房城乡建设厅网站

目录 执行流程 拦截路径 过滤器链 小结 执行流程 过滤器Filter拦截到请求之后&#xff0c;首先执行方放行之前的逻辑&#xff0c;然后执行放行操作&#xff08;doFilter&#xff09;&#xff0c;然后会访问对应的Web资源&#xff08;对应的Controller类&#xff09;&#…