我有这个配置:
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,如果是,请如何使用?
答案 0 :(得分:1)
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));