除了基于在xml文件的静态配置外,还有两种方式的运行期配置, 一种是注册引导服务(bootstrap service),在启动时动态配置;另一种是由外部条件触发,在远程对象方法 内部动态配置组件。
1: 使用Bootstrap Service进行动态配置
public class EmployeeRuntimeRemotingDestination extends AbstractBootstrapService
{
private RemotingService remotingService;
public void initialize(String id, ConfigMap properties)
{
String service = "remoting-service";
MessageBroker mb = getMessageBroker();
remotingService = (RemotingService) mb.getService("remoting-service");
RemotingDestination destination = (RemotingDestination) remotingService.createDestination(id);
destination.setSource("flex.samples.crm.employee.EmployeeDAO");
}
@Override
public void start()
{
// No-op
}
@Override
public void stop()
{
// No-op
}
}
上面类写完之后还要在service-config.xml中进行配置:
<services>
<service class="com.flexbook.dao.DatabaseCheckService" id="hsqldb" />
<service-include file-path="remoting-config.xml" />
<service-include file-path="proxy-config.xml" />
<service-include file-path="messaging-config.xml" />
<service class="com.flexbook.dao.EmployeeRuntimeRemotingDestination" id="runtime-employee-ro" />
</services>
上面的示例很简单,我们获取id为"remoting-service"的RemotingService实例,然后以"testDestination"为id创建一个Destination,并设置了它 的source属性。之所以选择在initialize方法中创建Destination,是因为这个方法由MessageBroker调用,
调用的时机是在所有静态组件都创建完毕但启动之前,并且在此方法内创建的组件会自动启动(如果在start方法内创建组件,那么必须
由我们自己负责启动这些组件)。
2. 使用远程对象进行动态配置
使用远程对象动态配置BlazeDS比bootstrap service更加灵活,它可以接受来自外部的输入被动地进行配置,而不是仅仅在BlazeDS启动时主动读取外部数据进行配置。
示例代码:
public class DestinationBuilder{
String sevice = "message-service";
MessageBroker mb = MessageBroker.getMessageBroker(null);
MessageService rs = (MessageService)mb.getService(service);
if(null == rs.getDestination(destId)){
MessageDestination md = (MessageDestination) rs.createDestination(destId);
md.start();
}
return destId;
}
上面传入的参数为"null"说明我们期望获得默认的MessageBroker实例。
在 remoting-config.xml中DestinationBuilder的配置片段:
<destination>
<properties>
<source>com.flexbook.blazeds.DestinationBuilder</source>
</properties>
</destination>
定义在remoting-config.xml中的原因是由于我们必须手动启动这个配置文件。