我需要能够更改ThreadPoolExecutor的任务队列的大小.当然,BlockingQueue不支持更改大小,并且ThreadPoolExecutor不支持更改队列.
因此,我提出的方法是使用ThreadPoolExecutor.shutdownNow(),它返回一个尚未执行的Runnables列表.然后我可以创建一个具有所需队列大小的新执行程序并重新提交所有任务.
问题在于shutdownNow()调用时正在进行的任务.据我所知,javadoc中,执行程序将在当前执行taks的所有线程上调用Thread.interrupt().我不希望我的任务被杀死.这个问题可能是一个冗长的方式,询问如何编写我的任务,以便Thread.interrupt()不会有任何影响?
我正在尝试部署仅使用 UDP 端口的 ECS 服务。通过 NetworkLoadBalancers 添加了对 UDP 负载平衡的支持,因此我部署了我的服务,允许为我的任务动态分配主机端口,并使用适当的侦听器和目标组设置 NLB。
我遇到的问题是NLB显然必须进行健康检查,并且必须基于 TCP。对于健康检查端口,您可以保留默认的“目标”端口(这适用于动态主机端口分配),或者您可以指定一个端口。我不能做的是为 TCP 公开的端口与我的负载均衡器目标 UDP 端口不同。我可以让我的容器在同一个端口上同时侦听用于生产的 UDP 和用于健康检查的 TCP,但即使 Docker 很好地支持它,任务定义似乎也不允许这样做。
这似乎会使 UDP NLB 对 ECS 服务无用,除非我遗漏了什么?我想出的唯一替代方法是使用静态配置的主机端口,以便我可以在受控主机端口上为 TCP 公开第二个端口,并将其作为 NLB 运行状况检查的目标。问题是我们现在已经失去了 ECS 的所有可扩展性优势,因为无法在一个实例上运行多个任务。
我想这只适用于Hibernate(我现在才开始使用这两个框架).我有一个跟踪用户会话的应用程序.会话处于活动状态时,会话实体存储在活动会话的表中.当用户离线并且会话结束时,会话将移至辅助历史表.
如何使用Hibernate实现这一目标?现在我有一个Session.hbm.xml文件,它将Session对象映射到活动会话表.我可以将它映射到辅助表,并以某种方式指定在调用saveOrUpdate时我希望它保留在哪个表中吗?
我目前的声誉不允许我快速回答我自己的问题.我不希望任何人浪费时间在这上面,因为我找到了答案,所以我在这里作为编辑发布.
我可以通过在映射文件中使用entity-name属性来完成此操作.我创建了第二个映射,与Session.hbm.xml相同,名为HistoricalSession.hbm.xml.在这个新的映射文件中,我引用了相同的Session类,但是添加:
entity-name="HistoricalSession"
Run Code Online (Sandbox Code Playgroud)
然后我像往常一样将对象映射到我的第二个(历史)表.调用save()或saveOrUpdate()默认使用classname作为实体名称,并像以前一样保存在我的主表中.现在,当我想将会话保存到历史表时,我使用允许您指定实体名称的Hibernate API覆盖:
saveOrUpdate("HistoricalSession",session);
Run Code Online (Sandbox Code Playgroud)
这完全符合我的要求,而无需为历史会话创建另一个Java类
java ×2
amazon-ec2 ×1
amazon-ecs ×1
aws-elb ×1
hibernate ×1
persistence ×1
spring ×1
threadpool ×1
udp ×1