如何在不接收来自 Flex 客户端的消息的情况下从 BlazeDS 推送数据? [英] how to push data from BlazeDS without receive message from Flex client?

查看:23
本文介绍了如何在不接收来自 Flex 客户端的消息的情况下从 BlazeDS 推送数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的 Flex 应用程序项目中使用 BlazeDS 来实现数据推送功能.来自官方教程 BlazeDS 入门,它显示了消息传递示例来自 API 的生产者/消费者.

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/consumer from API.

但是我如何实现不需要从 Flex 客户端调用的服务器端,而是从服务器端内部调用.我有一些想法,但我不知道该怎么做,因为我是 Flex 开发人员,而不是 Java 开发人员,所以我想你可以帮助我.

but how can I implement server side which doesn't need to be invoke from Flex client, but from within server-side instead. I got some idea but I don't know how to do because I'm a Flex developer, not Java developer, so I think you can help me.

  1. 在 Google 中,有一个教程显示我需要在 Java 端扩展 ServiceAdapter 类,该类扩展了 Invoke 方法.我需要扩展其他类而不是这个来做我想做的事吗?

  1. In Google, there's a tutorial show about I need to extend ServiceAdapter class in Java-side, which extends Invoke method. Do I need to extend other class instead of this to do what I want?

如何配置 message-config.xml 以获得我上面描述的结果?

How to configure the message-config.xml to get the result like I describe above?

推荐答案

这是我编写的测试代码,有时用来测试向我们的客户端发送数据.这是 ServiceAdapter 实现的一个精简的、简单的 Java 示例.它从网络上的现有示例中删除了许多不必要的代码.它编译,工作,我经常在测试中使用它.

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();
        }
    }        
}

您需要在 tomcat 中设置一些属性才能使其工作.

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

messaging-config.xml中,你需要添加一个适配器和目的地:

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"/>

将此目的地添加到相同的 messaging-config.xml 文件:

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

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

最后,确保在 services-config.xml 中定义了my-streaming-amf"频道,如:

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>

注意,在blazeDS中,这两个配置文件(messaging-config.xml和services-config.xml)位于以下目录:

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/

其中 [nameOfYourApp] 是您的 web 应用所在的目录.

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

希望对您有所帮助!

-公斤

这篇关于如何在不接收来自 Flex 客户端的消息的情况下从 BlazeDS 推送数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆