如何注册 ColdFusion 回调并从 Java 类调用它?
Posted
技术标签:
【中文标题】如何注册 ColdFusion 回调并从 Java 类调用它?【英文标题】:How do I register a ColdFusion callback and call it from a Java class? 【发布时间】:2016-09-22 19:37:54 【问题描述】:我需要注册一个 ColdFusion 回调(使用 Lucee),它将在 Java 类中执行,如下所示:
(我在下面的 cmets 中删除了我设想调用回调的方式)
package com.bonnydoonmedia.io;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_10;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
/*
* author: Robert Munn
* date: 3/15/15
*
* WSClient.java
*
* Simple extension of WebSocketClient by Too Tall Nate
*
* based on example client at
*
* https://github.com/TooTallNate/Java-WebSocket
*
* License: Mozilla Public License 2.0
*
*/
public class WSClient extends WebSocketClient
public WSClient( URI serverUri , Draft_10 draft )
super( serverUri, draft );
public WSClient( URI serverURI )
super( serverURI );
public void connect()
super.connect();
public void send( String message )
super.send( message );
@Override
public void onOpen( ServerHandshake handshakedata )
System.out.println( "opened connection" );
System.out.println( "ready state : " + super.getReadyState() );
/* INVOKE THE CALLBACK HERE LIKE:
callback(
"action": "onOpen",
"data":
);
*/
@Override
public void onMessage( String message )
System.out.println( "received: " + message );
/* INVOKE THE CALLBACK HERE LIKE:
callback(
"action": "onMessage",
"data":
"message": message
);
*/
@Override
public void onClose( int code, String reason, boolean remote )
// The codecodes are documented in class org.java_websocket.framing.CloseFrame
System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) );
/* INVOKE THE CALLBACK HERE LIKE:
callback(
"action": "onClose",
"data":
);
*/
@Override
public void onError( Exception ex )
ex.printStackTrace();
// if the error is fatal then onClose will be called additionally
/* INVOKE THE CALLBACK HERE LIKE:
callback(
"action": "onMessage",
"data":
);
*/
在 ColdFusion 中创建“对象”看起来像这样(这已经有效):
// create the websocket client
uriObject = createObject( "java", "java.net.URI" ).init("ws://local.websockets");
wsClient = CreateObject("java", "WSClient").init(uriObject);
现在我需要注册一个回调,我想应该是这样的:
function void wsCallback (data)
switch(data.action)
case "onOpen":
break;
case "onClose":
break;
case "onMessage":
break;
case "onError":
break;
;
wsClient.setCallback(wsCallback);
问题是,最后一部分怎么做(在类中设置回调)?
【问题讨论】:
既然是抽象类,请尝试使用CFCProxy。创建具有所需功能(“onClose”等)的 CFC。然后在您的 java 类中,使用 Coldfusion.cfc.CFCProxy 创建该组件的实例,并调用适当的函数,即CFCProxy yourInstance = new CFCProxy(cfcPath...); yourInstance.invoke("onClose", args)
。
嗯...我以前没有使用过 CFCProxy。我得调查一下。感谢您的提示!
(编辑)应该很简单。 CF方面没什么特别的。在 java 中,只需使用 new CFCProxy(cfcPath...)
和 invoke(...)
进行 crate 和实例化,你应该很高兴:)
我看到的示例使用import coldfusion.cfc.CFCProxy;
,但我不确定在编译针对 Lucee 的 java 时该位置在哪里。有任何想法吗? (顺便说一句,我对 Java 不是很熟练)
我的错。我错过了 Lucee 标签。由于 CFCProxy 应该已经在核心类路径中,请尝试this tip 找出哪个 jar 包含该类。只需将createObject("java", "coldfusion.cfc.CFCProxy")
替换为“testClass”即可。我用 Lucee 4.5 Express 试过了,它说它位于 /lib/ext/lucee.jar
【参考方案1】:
由于它是一个抽象类,请尝试使用CFCProxy。要使用它,请创建一个具有所需功能的 CFC,例如“onClose”等。然后在您的 java 类中,导入 coldfusion.cfc.CFCProxy
并创建该组件的实例。然后调用相应的函数,即
CFCProxy yourInstance = new CFCProxy("c:/path/to/yourComponent.cfc");
yourInstance.invoke( "onClose", args );
CFCProxy 类应该已经在核心类路径中。如果您不确定在哪里可以找到它,请尝试this tip 找出哪个 jar 包含该类。只需将createObject("java", "coldfusion.cfc.CFCProxy")
替换为“testClass”即可。我用Lucee 4.5 Express试了一下,它说它位于luccee_root/lib/ext/lucee.jar
。
注意:看起来 Lucee 也有 other (cooler) options for interacting with the CF engine from java。
【讨论】:
以上是关于如何注册 ColdFusion 回调并从 Java 类调用它?的主要内容,如果未能解决你的问题,请参考以下文章
如何连接到已注册的节点(Erlang)并从 Ejabberd 使用它
如何在 ColdFusion 中获取计划任务列表和上次运行结果?