这个edge服务器不会限制客户端对它的直接访问,只是不会再有重定向到它的连接请求。
注意: 这个模块是针对LoadBalancer 2.0版本的附加模块,这个服务器必须按照如何获得Wowza的动态负载均衡模块的介绍,被配置为Load Balancer Listener edge服务器。
package com.wowza.wms.plugin.collection.module;
// com.wowza.wms.plugin.collection.module.ModuleLoadBalancerEdgeLimitConnections
import com.wowza.wms.amf.AMFDataList;
import com.wowza.wms.application.IApplicationInstance;
import com.wowza.wms.client.ConnectionCounter;
import com.wowza.wms.client.IClient;
import com.wowza.wms.httpstreamer.cupertinostreaming.httpstreamer.HTTPStreamerSessionCupertino;
import com.wowza.wms.httpstreamer.sanjosestreaming.httpstreamer.HTTPStreamerSessionSanJose;
import com.wowza.wms.httpstreamer.smoothstreaming.httpstreamer.HTTPStreamerSessionSmoothStreamer;
import com.wowza.wms.logging.WMSLoggerIDs;
import com.wowza.wms.module.ModuleBase;
import com.wowza.wms.plugin.loadbalancer.LoadBalancerSender;
import com.wowza.wms.plugin.loadbalancer.ServerListenerLoadBalancerSender;
import com.wowza.wms.request.RequestFunction;
import com.wowza.wms.rtp.model.RTPSession;
import com.wowza.wms.server.Server;
public class ModuleLoadBalancerEdgeLimitConnections extends ModuleBase
{
static final public int MAXCONNECTIONS = 200;
private ConnectionCounter counter;
private int maxEdgeConnections = MAXCONNECTIONS;
private LoadBalancerSender loadBalancerSender;
public void onAppStart(IApplicationInstance appInstance)
{
this.counter = appInstance.getConnectionCounter();
this.maxEdgeConnections = appInstance.getProperties().getPropertyInt("maxEdgeConnections", maxEdgeConnections);
loadBalancerSender = (LoadBalancerSender)Server.getInstance().getProperties().get(ServerListenerLoadBalancerSender.PROP_LOADBALANCERSENDER);
getLogger().info("ModuleLoadBalancerEdgeLimitConnections maxEdgeConnections: " + maxEdgeConnections);
}
public void changeLimitEdge(IClient client, RequestFunction function,
AMFDataList params) {
Integer newLimit = params.getInt(PARAM1);
this.maxEdgeConnections = newLimit;
getLogger().info("ModuleLoadBalancerEdgeLimitConnections New Limit: " + newLimit);
}
private void addConnection() {
loadBalancerSender = (LoadBalancerSender)Server.getInstance().getProperties().get(ServerListenerLoadBalancerSender.PROP_LOADBALANCERSENDER);
if (loadBalancerSender == null)
{
getLogger().info("ModuleLoadBalancerEdgeLimitConnections Error (addConnection): Load Balancer Sender is not installed", WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
return;
}
long count = counter.getCurrent();
if ((count+1) > this.maxEdgeConnections)
{
loadBalancerSender.pause();
getLogger().info("ModuleLoadBalancerEdgeLimitConnections Pause", WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
}
getLogger().info("ModuleLoadBalancerEdgeLimitConnections Count: " + count, WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
}
private void removeConnection() {
loadBalancerSender = (LoadBalancerSender)Server.getInstance().getProperties().get(ServerListenerLoadBalancerSender.PROP_LOADBALANCERSENDER);
if (loadBalancerSender == null)
{
getLogger().info("ModuleLoadBalancerEdgeLimitConnections Error (removeConnection): Load Balancer Sender is not installed", WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
return;
}
long count = counter.getCurrent();
if ((count-1) < this.maxEdgeConnections)
{
loadBalancerSender.unpause();
getLogger().info("ModuleLoadBalancerEdgeLimitConnections UnPause", WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
}
getLogger().info("ModuleLoadBalancerEdgeLimitConnections Count: " + count, WMSLoggerIDs.CAT_application, WMSLoggerIDs.EVT_comment);
}
public void onConnect(IClient client, RequestFunction function, AMFDataList params)
{
addConnection();
}
public void onDisconnect(IClient client) {
removeConnection();
}
public void onHTTPSmoothStreamingSessionCreate(HTTPStreamerSessionSmoothStreamer httpSmoothStreamingSession)
{
addConnection();
}
public void onHTTPSmoothStreamingSessionDestroy(HTTPStreamerSessionSmoothStreamer httpSmoothStreamingSession)
{
removeConnection();
}
public void onHTTPCupertinoStreamingSessionCreate(HTTPStreamerSessionCupertino httpCupertinoStreamingSession)
{
addConnection();
}
public void onHTTPCupertinoStreamingSessionDestroy(HTTPStreamerSessionCupertino httpCupertinoStreamingSession)
{
removeConnection();
}
public void onHTTPSanjoseStreamingSessionCreate(HTTPStreamerSessionSanJose httpSanJoseStreamingSession)
{
addConnection();
}
public void onHTTPSanjoseStreamingSessionDestroy(HTTPStreamerSessionSanJose httpSanJoseStreamingSession)
{
removeConnection();
}
public void onRTPSessionCreate(RTPSession rtpSession)
{
addConnection();
}
public void onRTPSessionDestroy(RTPSession rtpSession)
{
removeConnection();
}
}
这个模块编译后的版本已经被包含在Wowza的可选自定义模块。
下载并解压缩后,将/lib/wms-plugin-collection.jar 拷贝到Wowza安装目录下的 /lib 文件夹下。然后重启Wowza。
在/conf/[app-name]/Application.xml文件的模块列表的最后添加下面的模块。
<Module> <Name>ModuleLoadBalancerEdgeLimitConnections</Name> <Description>Limit connects to an edge</Description> <Class>com.wowza.wms.plugin.collection.module.ModuleLoadBalancerEdgeLimitConnections</Class> </Module>将下面的属性参数添加到属性列表中(在模块列表的下面)
<Property> <Name>maxEdgeConnections</Name> <Value>200</Value> </Property>
