实现目标:java做后台service,每隔300毫秒,生成一个uuid,以 testJob做为订阅关键词,发布给所有订阅此关键词的flex客户端。
配置过程和源码:
1.修改blazeds自动生成的WEB-INF/flex/services-config.xml文件。由于原来没有polling-amf的定义,所以需要加入。代码如下:
2.在spring的配置文件中定义 defaultMessageTemplate class="org.springframework.flex.messaging.MessageTemplate"
之所以要定义这个bean,是为了在做service的时候。可以用注解@Autowired来引入这个MessageTemplate的实例。
3.在web.xml中定义spring和flex的集成。这个配置是使用spring和flex集成时候的配置,和push技术无关。
4.由于web.xml配置中引入了WEB-INF/classes/META-INF/springFlex.xml这个文件,所以在springFlex.xml文件中进行详细配置
5.springFlex.xml文件如下,主要是定义flex:message-destination ,既是监听的数据的关键词
6.编写后台推送的java service bean:
注意:这里使用了@Service,@@RemotingDestination 注解和 @Autowired MessageTemplate template; 这样就避免了在spring中利用配置文件进行定义bean。
如果要使用spring 配置文件来定义。可以参考下面代码(来自blazeds的官方例子中的spring配置文件)
具体的业务实现是在 内联线程类FeedThread 里面的run()中实现。
这要做的目标是为了让这个线程启动,是一定要通过flex的一个客户端连上来,才能启动。而不能随着spring context启动而启动。否则会报告messageBroke没有设置在flexContext之类的错误。
那么:如果我们想后台在没有任何一个客户端连上来的情况下,也要启动这个发送服务应该如何做?
典型场景: 后台web应用启动,并且定义了一个定时器。每隔 5s 进行一个逻辑处理,然后把处理结果发送给前台 flex(无论是否有felx客户端连上)
这就需要用下面代码:
这个work2 方法可以通过 quartz或者spring 的@Scheduled注解来进行定时器调用。
主要的关键代码是
MessageBroker msgBroker = MessageBroker.getMessageBroker("_messageBroker");
这个就是获得一个 _messageBroker的实例。"_messageBroker"字符串是由 <flex:message-broker > 标签中的id来指定。
如果没有id 指定,则缺省使用 “"_messageBroker"”这个字符串
7.前台的订阅flex程序:
其中关键代码是:
注意:
<s:StreamingAMFChannel uri="/Aerie/messagebroker/streamingamf"/>
<s:AMFChannel uri="/Aerie/messagebroker/amflongpolling"/>
<s:AMFChannel uri="/Aerie/messagebroker/amfpolling"/>
这三个通道的设置中用到的
Aerie是代表context名字。
messagebroker 是代码 web.xml中的配置的MessagebrokerServlet中的url-pattern
amfpolling 等是指 在services-config.xml文件中设置的 channel-definition 下的endpoint 名字