我正在开发一个需要并发性的Java守护进程:一个无限循环,它侦听作业队列(redis)并将每个作业分发给一个工作进程。工作者不必返回值。
我发现执行器非常有用,我正在使用ThreadPoolExecutor来维护许多工作线程。
不过,这些工作人员运行需要尽可能隔离运行的第三方代码,避免共享静态属性。
我的问题:是否有任何Java库/框架提供类似于执行器的功能,例如:
...但是产卵过程而不是线程?
您是否考虑过使用ProcessBuilder来管理您的独立流程?
String myJar = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", myJar, "package.MainClass");
Process p = pb.start();
我不知道将管理子流程的可运行任务提交给执行者是否是一个好主意,但这可能是隔离工作人员的解决方案。
github中有一个创建进程池的项目。看一看https://github.com/shri30/ProcessPool
这是一个例子:
示例代码:
public class UsageExample implements JTask{
public static void main(String args[]) throws Exception{
//Create a pool with name : UsageExample-Process and number of processes : 3
ExecutorService pool = ProcessPool.createProcessPool("UsageExample-Process", 3);
ProcessFuture<TaskStatus> pf1 = pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf2 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf3 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf4 =pool.submit(Task.class, args);
ProcessFuture<TaskStatus> pf5 =pool.submit(Task.class, args);
//the get method blocks the call to get the result
TaskStatus ts= pf1.get();
Status status = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts2= pf2.get();
Status status2 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts3= pf3.get();
Status status3 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
TaskStatus ts4= pf4.get();
Status status4 = ts.getStatus();
if(status == Status.SUCESS){
//code goes here
}
//terminate the pool - pass true for graceful termination, the second parameter is minutes
//wait for task completion
pool.terminate(true, 3000);
}
}
class Task implements JTask{
public static void main(String[] args) {
System.out.println("Executing the sample task");
}
}
我知道您有第三方库,您希望以某种方式隔离运行,因此它们无法访问静态变量。
我会在另一个类加载器中运行您的任务。有一些web框架使用这种机制来隔离web请求。在类加载器之间传递数据有点棘手。我不知道Jetty是怎么做到的。也许使用某种插座?这里有一篇关于使用<代码>系统的有趣文章。out共享对象。当然是黑客。
我的问题是:是否有任何Java库/框架提供类似于执行器的功能。。。但是生成进程而不是线程?
现代操作系统将利用现代多处理器体系结构来充分利用Java线程。在当前进程中生成另一个线程将在另一个处理器上运行(如果可用),并且比在完全独立的进程中运行该任务效率要高得多,尤其是像另一个JVM进程这样繁重的进程。
版本库维护 维护一个Subversion版本库是一项令人沮丧的工作,主要因为有数据库后端与生俱来的复杂性。做好这项工作需要知道一些工具——它们是什么,什么时候用以及如何使用。这一节将会向你介绍Subversion自带的版本库管理工具,以及如何使用它们来完成诸如版本库移植、升级、备份和整理之类的任务。 管理员的工具箱 Subversion提供了一些用来创建、查看、修改和修复版本库的工具。让我们首先详
Navicat 为 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 和 MariaDB 的数据库和数据库对象维护提供完整的解决方案。 要维护服务器对象,你可以在它上右击并在弹出菜单中 维护。 维 护 MySQL 或 MariaDB 维护表分析表 分析及保存表的键分布。在分析期间,MyISAM 及 BDB 表是以读入锁被锁定的。InnoDB 表是以写入锁被锁定的。
节点数据同步 MongoDB 复制集中当从节点无法跟上主节点数据时,则该节点就需要节点数据同步,MongoDB 提供了两种数据同步的方式: 初始化节点数据同步 拷贝数据文件数据同步 初始化节点数据同步的优点是不需要集群停机,但会会一定程度上适度影响集群的正常读写,数据同步所花时间也稍微长于拷贝数据文件数据同步;而拷贝数据文件数据同步需要步骤较多,且需要停机窗口。本部分从三个方面说明节点数据同步,并
守护(Daemon)进程 我们可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。 实现守护进程 首先要保证进程在后台运行,可以在启动程序后面加&,当然更原始的方法是进程自己fork然后结束父进程。 if (pid=fork()) { exit(0); // Parent process } 然后是与终端、进程组、会话(Ses
Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。 Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。 Daemonset典型用法如下: 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行
建议使用 systemd 管理我们的服务进程。 可以参考swoole官方文档 使用方法 请确保cabal.php配置文件中的swoole.daemonize配置为关闭状态(0或false)! 'swoole' => [ // ... 'daemonize' => 0, // ... ], 在 /etc/systemd/system/目录中,创建一个 cabal.