簡體   English   中英

如何注冊ColdFusion回調並從Java類調用它?

[英]How do I register a ColdFusion callback and call it from a Java class?

我需要注冊一個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 要使用它,請創建具有所需功能(例如“ onClose”等)的CFC。 然后在您的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

注意:看起來Lucee還具有其他(更酷的)選項,可用於從java與CF引擎進行交互

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM