WSO2动态地将EndPoint添加到LoadBalance端点

时间:2013-11-25 17:18:56

标签: wso2 load-balancing wso2esb wso2mb

我有这个配置:

  

1)WSO2 4.7.0 ESB

     

2)WSO2 MB 2.1.0

     

3)主题= MyTopic

     

4)MyTopic的一个订户

     

5)MyTopic

上的 N 发布者      

6)在ESB上部署静态LoadBalance端点

我的目标是当其中一个 N 端点在MyTopic上发布消息时,ESB上的订阅者应该能够将端点添加到LoadBalanceEndpoint列表中。

这可能吗?我是否需要使用DynamicLoadBalanceEndpoint,如果是,请如何使用?

1 个答案:

答案 0 :(得分:1)

好吧,我自己找到了答案。 可以通过访问WSO2注册表来完成。 您必须将loadbalance节点保存到注册表中。 然后参考这些链接

1)这里说明了访问注册表的方式: http://vvratha.blogspot.it/2013/02/accessing-registry-resources-from-class.html

2)在这里你可以找到如何将由regInstance.getResource(resourceKey)产生的OMElment转换为LoadBalance端点 https://svn.wso2.org/repos/wso2/carbon/platform/branches/4.0.0/dependencies/synapse/2.1.1-wso2v1/modules/core/src/test/java/org/apache/synapse/config/xml/endpoints/LoadBalanceEndpointSerializationTest.java

3)通过此代码,您可以向其添加新的AddressEndpoint:

    List<Endpoint>list = le.getChildren(); //le is LoadBalanceEndpoint instance
    AddressEndpoint ad = new AddressEndpoint();
    EndpointDefinition  def = new EndpointDefinition();
    def.setAddress("http:///your_address_url");
    def.setAddressingOn(false);
    def.setTimeoutAction(100);
    ad.setDefinition(def);
    list.add(ad);
    le.setChildren(list);

注意:如果要访问loadbalance端点并在内存中修改它,请使用:

LoadbalanceEndpoint le =(LoadbalanceEndpoint) synapseMsgContext.getConfiguration().getEndpoint("test");

4)添加地址点后,使用

regInstance.updateResource("key", LoadbalanceEndpointSerializer.getElementFromEndpoint(endpoint));

更新注册表的声明。

这是处理本地注册表的完整代码:

Registry regInstance = synapseMsgContext.getConfiguration()
            .getRegistry();                         
    Object obj = (Object) regInstance.getResource(new Entry("diogene/diogeneEndpoints.xml"),null);
    LoadbalanceEndpoint endpoint = (LoadbalanceEndpoint) LoadbalanceEndpointFactory.getEndpointFromElement((OMElement) obj, false, null);
    List<Endpoint>list = endpoint.getChildren();
    AddressEndpoint ad = new AddressEndpoint();
    EndpointDefinition  def = new EndpointDefinition();
    def.setAddress("http://your_address_url/");
    def.setAddressingOn(false);
    def.setTimeoutAction(100);
    ad.setDefinition(def);
    list.add(ad);
    endpoint.setChildren(list);
    regInstance.updateResource("key", LoadbalanceEndpointSerializer.getElementFromEndpoint(endpoint));