我们正在尝试从 ColdFusion 8 更新到 ColdFusion 2016,并且在迁移一些很久以前由其他人构建的自定义 Java 服务时遇到了一些问题。为了促进 ColdFusion 启动/运行/与服务对话,它们是用 Java 编写的,并使用 JRun 作为依赖项。
我相信jrunx.kernel.ServiceMBean
首先扩展接口以定义 ColdFusion 将有权调用的任何函数调用(即来自 ColdFusion->Java 的 API 访问)。
public interface MyMBean
extends ServiceMBean {
/**
* Adds a Request object to the RequestList
*/
public boolean addRequest(String destination, String body, etc.);
// etc.
}
然后,通过扩展jrunx.kernel.ServiceAdapter
和实现MyMBean
上面的接口来实现这个接口java.lang.Runnable
。我相信这就是 ColdFusion 可以运行/与之对话的“使代码成为服务”,然后继续实现自定义代码(包括上面定义的 API 调用、各种线程管理等),以及实现面向服务的方法对于诸如ColdFusion 何时启动/停止可能或需要的服务之start()
类的事情。stop()
ServiceMBean
ServiceAdapter
/**
* Main class
*/
public class MyService extends ServiceAdapter
implements MyMBean, Runnable {
// Declare various custom member variables
/**
* Invoked as soon as this class is called
*/
public void init() { ... }
/**
* Invoked when this service is started
*/
public void start() { ... }
/**
* Invoked when this service is stopped
*/
public void stop() { ... }
/**
* Run the service
*/
public void run() { ... }
// Custom functions, etc.
}
编译后,将MyPackage.jar
文件放入C:\ColdFusion8\runtime\lib\
其中,然后注册C:\ColdFusion8\runtime\servers\coldfusion\SERVER-INF\jrun.xml
以告诉 ColdFusion 启动服务。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jrun-server PUBLIC "-//Macromedia, Inc.//DTD jrun-server 4.0//EN" "http://jrun.macromedia.com/dtds/jrun-server.dtd">
<jrun-server>
<!-- Various ColdFusion Core Services -->
<!-- ...etc --->
<!-- Register MyService --->
<service class="jrunx.MyPackage.MyService" name="MyService">
<attribute name="bindToJNDI">true</attribute>
<attribute name="activeHandlerThreads">25</attribute>
<attribute name="maxHandlerThreads">1000</attribute>
<attribute name="minHandlerThreads">20</attribute>
<attribute name="threadWaitTimeout">180</attribute>
<attribute name="timeout">600</attribute>
</service>
</jrun-server>
为了让 ColdFusion 能够“调用上述实现所公开的 API 调用” ServiceMBean
,我们将使用简单的代码,例如:
<cfset scheduler = initContext.lookup("jrun:service/SchedulerService")>
<cfset schedulerRoot = XmlParse(scheduler.getServerStatus())>
我们的理解是,虽然 ColdFusion 8 基于 JRun,但它已被 Tomcat 取代,因此我们期望我们需要更新 Java 代码(即 和 的 JRun 服务接口声明ServiceMBean
)ServiceAdapter
以兼容等效的 Tomcat 服务。最后,我们需要找到一种新方法将其注册到 ColdFusion 2016(我怀疑是在 Tomcat 中C:\ColdFusion2016\cfusion\runtime\conf\servers.xml
还是C:\ColdFusion2016\cfusion\runtime\conf\web.xml
?)。
如果相关,上面有 3 个抽象为“MyService”的实现: 1. “DirectoryWatcherService” - 监视文件夹以查找文件,然后调用 ColdFusion 对其进行处理 2. “SchedulerService” - 监视数据库以获取通过预定的日期/时间,然后调用 ColdFusion 对其进行处理 3. “GatewayService” - 允许 ColdFusion 向其发送消息,以通过持久 TCP 连接传递到第 3 方服务。它还侦听来自网关的入站请求,然后调用 ColdFusion 对数据进行处理。