如何注册ColdFusion回调并从Java类调用它?



我需要注册一个ColdFusion回调(使用Lucee),它将从Java类中执行,如下所示:

(我在下面的注释中指出了我如何设想调用回调)

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。要使用它创建一个CFC与所需的功能,即"onClose",等等。然后在java类中导入coldfusion.cfc.CFCProxy并创建该组件的实例。然后调用相应的函数,如

CFCProxy yourInstance = new CFCProxy("c:/path/to/yourComponent.cfc");
yourInstance.invoke( "onClose", args );

CFCProxy类应该已经在核心类路径中。如果您不确定在哪里可以找到它,请尝试这个技巧来查找包含该类的jar。只需将createObject("java", "coldfusion.cfc.CFCProxy")替换为"testClass"。我用Lucee 4.5 Express试过了,它说它位于{luccee_root}/lib/ext/lucee.jar

NB:看起来Lucee还有其他(更酷的)选项来与java的CF引擎进行交互。

相关内容

  • 没有找到相关文章

最新更新