2017-12-27 57 views

답변

0

기본적으로 구성 할 수는 없지만 그런 일을 아주 쉽게 할 수있는 플러그인을 만들 수 있습니다.

플러그인이 addConsumer을 가로 채고 이미 너무 많은 가입자가있는 경우 SecurityException을 던집니다. activemq.xml 구성에서도 구성 가능하게 만들 수 있습니다.

이 예는 빠르고 더러운 예이므로주의해야 할 것입니다.

MaxSubscribersPlugin.java는

import org.apache.activemq.broker.BrokerPluginSupport; 
import org.apache.activemq.broker.ConnectionContext; 
import org.apache.activemq.broker.region.Destination; 
import org.apache.activemq.broker.region.Subscription; 
import org.apache.activemq.command.ActiveMQDestination; 
import org.apache.activemq.command.ConsumerInfo; 

import java.util.Map; 

public class MaxSubscribersPlugin extends BrokerPluginSupport{ 

    private int maxSubscribers = 1000; 

    @Override 
    public Subscription addConsumer(ConnectionContext ctx, ConsumerInfo info) throws Exception { 
     ActiveMQDestination dest = info.getDestination(); 
     if (dest.isTopic() && !dest.getQualifiedName().contains("Advisory")) { // TODO better way to filter out Advisories 
      Map<ActiveMQDestination, Destination> destinations = ctx.getBroker().getBrokerService() 
                    .getAdminView().getBroker().getDestinationMap(); 
      Destination activeTopic = destinations.get(info.getDestination()); 
      if(activeTopic != null && activeTopic.getConsumers().size() >= getMaxSubscribers()) { 

       throw new SecurityException("Too many active subscribers on topic " 
         + info.getDestination().getPhysicalName() 
         + ". Max is " + getMaxSubscribers()); 
      } 
     } 

     return super.addConsumer(ctx, info); 
    } 

    public int getMaxSubscribers() { 
     return maxSubscribers; 
    } 

    public void setMaxSubscribers(int maxSubscribers) { 
     this.maxSubscribers = maxSubscribers; 
    } 

} 

의 .jar에 그것을 포장하고 ActiveMQ를 해방 폴더에 넣어. 그런 다음 구성 할 수 있습니다. - 너무 많은 소비자들이 연결하면

<plugins> 
      <bean xmlns="http://www.springframework.org/schema/beans" id="throttler" 
       class="my.package.MaxSubscribersPlugin"> 
      <property name="maxSubscribers" value="10"/> 
     </bean> 
    </plugins> 

그런 다음, 예외를 얻을 것이다 : javax.jms.JMSSecurityException: Too many active subscribers on topic topicX. Max is 10

거기의 ActiveMQ에서 로그 항목뿐만 아니라 기록 될 것입니다 :

WARN | Security Error occurred on connection to: tcp://127.0.0.1:52335, Too many active subscribers on topic topicX. Max is 10