how to push data from BlazeDS without receive message from Flex client?

前端 未结 3 561
温柔的废话
温柔的废话 2020-12-10 08:34

I am using BlazeDS for data-push feature in my Flex application project. From the official tutorial, Getting started with BlazeDS, it shows messaging example with producer/c

相关标签:
3条回答
  • 2020-12-10 09:31

    Here is test code I wrote and use, at times, to test sending data to our client. It's a stripped down, bare bones Java example of a ServiceAdapter implementation. It removes a lot of unnecessary code from the existing examples on the web. It Compiles, works and I use it often in testing.

    package your.package.structure.adapter;
    
    import your.package.structure.device.DevicePort;
    import flex.messaging.messages.AsyncMessage;
    import flex.messaging.messages.Message;
    import flex.messaging.services.MessageService;
    import flex.messaging.services.ServiceAdapter;
    import flex.messaging.util.UUIDUtils;
    
        /**
         * Test service adapter.  Great for testing when you want to JUST SEND AN OBJECT and nothing
         * else.  This class has to stay in the main codebase (instead of test) because, when it's used
         * it needs to be deployed to Tomcat.
         * @author Kevin G
         *
         */
    
    public class TestServiceAdapter extends ServiceAdapter {
    
        private volatile boolean running;
    
        private Message createTestMessage() {
            DevicePort objectToSend = new DevicePort("RouterDevice");
    
            final AsyncMessage msg = new AsyncMessage();
            msg.setDestination(getClass().getSimpleName() + "Destination");
            msg.setClientId(UUIDUtils.createUUID());
            msg.setMessageId(UUIDUtils.createUUID());
            msg.setBody(objectToSend);
    
            return msg;
        }
    
        private void sendMessageToClients(Message msg) {
            ((MessageService) getDestination().getService()).pushMessageToClients(msg, false);
        }
    
        /**
         * @see flex.messaging.services.ServiceAdapter#start()
         */
        @Override
        public void start(){    
            super.start();
    
            Thread messageSender = new Thread(){
                public void run(){
                    running = true;
                    while(running){
                        sendMessageToClients(createTestMessage());
                        secondsToSleep(3);
                    }
                }
            };
    
            messageSender.start();        
        }
        /**
         * @see flex.messaging.services.ServiceAdapter#stop()
         */
        @Override
        public void stop(){
            super.stop();
            running = false;
        }
        /**
         * This method is called when a producer sends a message to the destination. Currently,
         * we don't care when that happens.
         */
        @Override
        public Object invoke(Message message) {
            if (message.getBody().equals("stop")) {
                running = false;
            }
            return null;
        }
        private void secondsToSleep(int seconds) {
            try{
                Thread.sleep(seconds * 1000);
            }catch(InterruptedException e){
                System.out.println("TestServiceAdapter Interrupted while sending messages");
                e.printStackTrace();
            }
        }        
    }
    

    You need to set a few properties in tomcat to get this to work.

    In messaging-config.xml, you need to add an adapter and destination:

    Add this line to the existing <adapters> tag:

     <adapter-definition id="TestServiceAdapter" class="your.package.structure.adapter.TestServiceAdapter"/>
    

    Add this destination to that same messaging-config.xml file:

    <destination id="TestServiceAdapterDestination">
            <channels>
                <channel ref="my-streaming-amf"/>
            </channels>
            <adapter ref="TestServiceAdapter"/>
        </destination>
    

    Finally, make sure the "my-streaming-amf" channel is defined in services-config.xml, as in:

    <channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/>
            <properties>
                 <!-- you don't need to set all these properties, this is just what we set, included for illustration, only -->
                <idle-timeout-minutes>0</idle-timeout-minutes>
                <max-streaming-clients>10</max-streaming-clients>
                    <server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis>
                <user-agent-settings>
                    <user-agent match-on="Safari" kickstart-bytes="2048" max-streaming-connections-per-session="10"/>  
                    <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="15"/> 
                    <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="10"/>
                </user-agent-settings>
            </properties>
        </channel-definition>
    

    Note that in blazeDS, these two config files (messaging-config.xml and services-config.xml) are located in the following directory:

    /blazeds/tomcat/webapps/[nameOfYourApp]/WEB-INF/flex/
    

    where [nameOfYourApp] is the directory your webapp lives in.

    I hope all that helps!

    -kg

    0 讨论(0)
  • 2020-12-10 09:33

    Do you need to push messages from the server to the client? In this case take a look in the BlazeDS samples. There is a sample in a folder called traderdesktop. The piece of code which is sending the messages is below:

    MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
    
    AsyncMessage msg = new AsyncMessage();
    
    msg.setDestination(yourdestination);
    
    msg.setClientId(clientID);
    
    msg.setMessageId(UUIDUtils.createUUID());
    
    msg.setTimestamp(System.currentTimeMillis());
    
    msg.setBody("dummy");
    
    msgBroker.routeMessageToService(msg, null);
    
    0 讨论(0)
  • 2020-12-10 09:33

    If you want to set the url to the stream at runtime do the following:

    //assumes _consumer is an instance variable mx.messaging.Consumer
    var channelSet:ChannelSet = new ChannelSet();
    //change {server.name}:{server.port} to the end point you wanna hit
    var ep:String = "http://{server.name}:{server.port}/messagebroker/streamingamf";
    var channel:StreamingAMFChannel = new StreamingAMFChannel("my-streaming-amf", ep);
    channelSet.addChannel(channel);
    
    _consumer = new Consumer();
    _consumer.channelSet = channelSet;
    _consumer.destination = "TestServiceAdapterDestination";
    _consumer.subscribe(); 
    _consumer.addEventListener(MessageEvent.MESSAGE, onMsg); 
    _consumer.addEventListener(MessageFaultEvent.FAULT, faultHandler); 
    

    Just a heads up. This took some head banging to get going. I hope it helps someone.

    0 讨论(0)
提交回复
热议问题