【发布时间】:2025-11-25 00:00:03
【问题描述】:
我有一个 java 应用程序(实际上它是 grails)我需要执行一个外部程序。最好我希望我的应用程序是独立的,即外部脚本/程序成为战争文件的一部分。这个外部脚本/程序也需要产生一些文件。
我想,我的问题是,是否有某种最佳实践来做这些事情,以便最终产品不会太不稳定,具体取决于应用权限,什么不是?
【问题讨论】:
标签: java servlets grails execute
我有一个 java 应用程序(实际上它是 grails)我需要执行一个外部程序。最好我希望我的应用程序是独立的,即外部脚本/程序成为战争文件的一部分。这个外部脚本/程序也需要产生一些文件。
我想,我的问题是,是否有某种最佳实践来做这些事情,以便最终产品不会太不稳定,具体取决于应用权限,什么不是?
【问题讨论】:
标签: java servlets grails execute
您需要确保的一件事是,一次只有一个线程执行您的程序的一个实例。所以你需要一些锁定和同步。
想象一个场景,多个用户/请求/线程尝试使用不同的输入执行同一个程序,这将是一场灾难。因此,您要么需要在一个程序正在执行而其他程序等待时锁定程序,要么每次要运行程序时都需要创建新实例。你应该对此非常小心。
此外,您希望在程序运行后以及它是否产生任何输出后进行清理。
如果用户可以向您的系统传递恶意命令并试图劫持其他应用程序,您需要小心。
总的来说,你必须注意安全性和正确性(我提到的第一个方案。)
【讨论】:
安全性 - 确保您的应用不允许在主机系统上执行任意(用户提供的)代码。想想 SQL 注入式攻击。如果您需要传递数据,我建议先将其插入数据库,然后将主键传递给您的外部进程,这将有助于避免缓冲区溢出类型的情况。
鲁棒性 - 该程序是否会失败,或者需要时间,或者有其他未知的副作用。通过从不同的线程甚至不同的进程执行,将您的主 Web 应用程序与该程序隔离开来。
日志记录 - 如果您需要从该外部应用收集日志记录,您可能需要传入一个会话 ID(或等效项),以便您可以将任何错误追溯到 Web 会话。
【讨论】:
您可以设计一个小型管理系统来跟踪服务请求。这将是一个非常有用的组件,因为大多数项目都有这样的目的。
应用程序应该从服务执行,对该服务本身的请求应该是异步的。此外,您还可以获得反馈并跟踪该服务状态。
【讨论】: