flex java blazeds_flex+java+blazeds 多通道好文

环境:

MyEclipse 7.5

Flash Builder 4 plugin for eclipse

Tomcat 6

BlazeDS 4.0.0

springframework 3.0.3

Spring-flex整合 org.springframework.flex-1.0.3.RELEASE.jar (适用于spring2.5.6+,blazeds3.2+)

步骤:

2. 导入spring包和spring-flex集成包。

3. 配置web.xml,配置DispatcherServlet,使用spring进行管理,并将请求映射到MessageBroker。

4. 创建web-application-config.xml,配置flex服务,主要是在spring中配置MessageBroker。

5. 创建remoting-destination和 message-destination,修改channel属性。

6. 创建mxml文件,定义channelSet,注册remote-object和定义Productor, Consumer.

注意:

当不使用spring直接配置blazeDS实现RPC和消息服务时,仅需要在remoting-config.xml和messaging-config.xml中配置destination,只要在这些文件中配置了默认通道,mxml文件中不需要再定义channelSet即可执行。而使用spirng时,仅当将default-channels定义在services-config.xml的services标签中才有效,若在services-config.xml的services标签中加载其他配置文件,在这些文件中配置各自的default-channels,会报如下错误:[MessagingError message='×××'artgallerydataservice' either does not exist or the destination has no channels defined (and the application does not define any default channels.)'],原因是没有找到通道。如果仅将通道定义在或中,也会出现同样的情况。

对于以上的两个问题,我觉得几乎不可理解,解决方案是在mxml文件中定义channelSet以找到amf通道。

项目代码:

目录结构:

ce1e29697b11b5c4992b64a9a74104a4.png

Web.xml:

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngweb.xml

xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Spring MVC Dispatcher Servlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/web-application-config.xml

1

Spring MVC Dispatcher Servlet

/messagebroker/*

index.jsp

48304ba5e6f9fe08f3fa1abda7d326ab.png

web-application-config.xml:

是非常重要的,它还有其它的几种表示方法,但以这种最为简单,它通过MessageBrokerHandlerAdapter和HandlerMapping将请求发送给spring管理的MessageBroker。

注意这里一定要导入spring-flex集成的schemaLocation,remoting-destination和 message-destination也在这里定义。

961ddebeb323a10fe0623af514929fc1.pngweb-application-config.xml

48304ba5e6f9fe08f3fa1abda7d326ab.png

xmlns:flex="http://www.springframework.org/schema/flex"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/flex

http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">

48304ba5e6f9fe08f3fa1abda7d326ab.png

services-config.xml:

这里最重要的是channels的定义和配置。

961ddebeb323a10fe0623af514929fc1.pngservices-config.xml

48304ba5e6f9fe08f3fa1abda7d326ab.png

false

true

1

[BlazeDS] 

false

false

false

false

Endpoint.*

Service.*

Configuration

false

48304ba5e6f9fe08f3fa1abda7d326ab.png

messaging-config.xml, proxy-config.xml, remoting-config.xml:

略。和blazeDS提供的几乎一样。

test.Test.java:

这里只定义了一个方法,用以测试远程方法调用。

48304ba5e6f9fe08f3fa1abda7d326ab.png

package test;

public class Test {

public void done(){

System.out.println("OK.");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

flex_test.mxml:

这个不做过多解释。 这里定义了AMFChannel和ChannelSet,避免找不到通道的问题。Productor和Consumer是实现BlazeDS消息服务的两个组件,AsyncMessage是用来发送消息的。

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngflex_test.mxml

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"

creationComplete="consumer.subscribe();">

import mx.controls.Alert;

import mx.messaging.messages.*;

import mx.messaging.events.*;

import mx.rpc.events.FaultEvent;

import mx.rpc.events.ResultEvent;

// Write received message to TextArea control.

private function messageHandler(event: MessageEvent):void {

ta.text += event.message.body + "\n";

}

// Compose the message as an instance of AsyncMessage,

// then use the Producer.send() method to send it.

private function sendMessage():void {

var message: AsyncMessage = new AsyncMessage();

message.body = userName.text + ": " + msg.text;

producer.send(message);

msg.text = "";

}

protected function button_clickHandler(event:MouseEvent):void

{

// TODO Auto-generated method stub

object.done();

}

protected function resulth(event:ResultEvent):void

{

label.text="succeed!";

}

protected function faulth(event:FaultEvent):void

{

label.text="failed!";

Alert.show("远程对象调用失败:\n"+event.fault);

}

]]>

message="messageHandler(event)"/>

channelSet="{amf_channel}"

result="resulth(event);" fault="faulth(event);" />

48304ba5e6f9fe08f3fa1abda7d326ab.png

执行结果:

f3179f0a3b9ba5fe71ebf06986b17b0f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值