简体   繁体   中英

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

I need to register a ColdFusion callback (using Lucee) that will be executed from within a Java class as follows:

(I stubbed out how I envision invoking the callback - in comments below)

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": {
            }
        });
        */
    }
}

Creating the "object" in ColdFusion looks like this (this already works):

// create the websocket client
uriObject = createObject( "java", "java.net.URI" ).init("ws://local.websockets");
wsClient = CreateObject("java", "WSClient").init(uriObject);

Now I need to register a callback, and I'm thinking it would be done like this:

function void wsCallback (data) {

    switch(data.action) {
        case "onOpen":
            break;
        case "onClose":
            break;
        case "onMessage":
            break;
        case "onError":
            break;
    }

};

wsClient.setCallback(wsCallback);

The question is, how do I do the last part (setting the callback in the class)?

Since it is an abstract class, try using the CFCProxy . To use it create a CFC with the desired functions, ie "onClose", etcetera. Then inside your java class, import coldfusion.cfc.CFCProxy and create an instance of that component. Then invoke the appropriate function, ie

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

The CFCProxy class should already be in the core class path. If you are not sure where to find it, try this tip to find out which jar contains that class. Just substitute createObject("java", "coldfusion.cfc.CFCProxy") for the "testClass". I tried it with Lucee 4.5 Express, and it said it is located in {luccee_root}/lib/ext/lucee.jar .

NB: It looks like Lucee also has other (cooler) options for interacting with the CF engine from java .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM