ActiveMq 인스턴스가 있고 Topic을 수신하는 클라이언트가 100 개 있다고 가정 해 봅시다. 새 메시지가 주제에 게시되면 수신하는 구독자 수를 제한 할 수 있습니까 (예 : 10)?ActiveMq의 Topic에서 메시지가 전달되는 최대 구독자 수를 제한합니다.
이제 다른 메시징 구성 요소가이를 수행 할 수 있거나 문제 해결/통합 된 모범 사례가 있습니까?
ActiveMq 인스턴스가 있고 Topic을 수신하는 클라이언트가 100 개 있다고 가정 해 봅시다. 새 메시지가 주제에 게시되면 수신하는 구독자 수를 제한 할 수 있습니까 (예 : 10)?ActiveMq의 Topic에서 메시지가 전달되는 최대 구독자 수를 제한합니다.
이제 다른 메시징 구성 요소가이를 수행 할 수 있거나 문제 해결/통합 된 모범 사례가 있습니까?
기본적으로 구성 할 수는 없지만 그런 일을 아주 쉽게 할 수있는 플러그인을 만들 수 있습니다.
플러그인이 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