我们正在尝试从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“调用上面ServiceMBean
实现所公开的API调用”,我们将使用简单的代码,例如:
<cfset scheduler = initContext.lookup("jrun:service/SchedulerService")>
<cfset schedulerRoot = XmlParse(scheduler.getServerStatus())>
我们的理解是,虽然ColdFusion 8基于JRun,但它已被弃用而支持Tomcat,所以我们期望我们需要更新Java代码(即{{1}的JRun服务接口声明}和ServiceMBean
)与等效的Tomcat服务兼容。最后,我们需要找到一种新的方式来注册ColdFusion 2016(我怀疑在Tomcat的ServiceAdapter
或C:\ColdFusion2016\cfusion\runtime\conf\servers.xml
中?)。
如果相关,则上面有3个实现抽象为“MyService”: 1.“DirectoryWatcherService” - 监视文件夹以显示要显示的文件,然后调用ColdFusion对其执行某些操作 2.“SchedulerService” - 监视数据库的预定日期/时间以通过,然后调用ColdFusion来执行某些操作 3.“GatewayService” - 允许ColdFusion向其发送消息,以通过与第三方服务的持久TCP连接进行传递。它还侦听来自网关的入站请求,然后调用ColdFusion对数据执行某些操作。