0

我一直在尝试配置我的 activemq 服务器,以便匿名客户端可以订阅主题(他们将无法创建或发布主题)。

我已经在我的代理配置上相应地设置了权限:

<plugins>
    <simpleAuthenticationPlugin anonymousAccessAllowed="true">
        <users>
            <authenticationUser username="system" password="manager"
                groups="anonymous,admins"/>
        </users>
    </simpleAuthenticationPlugin>


  <!--  Lets configure a destination based authorization mechanism -->
  <authorizationPlugin>
    <map>
      <authorizationMap>
        <authorizationEntries>
          <authorizationEntry queue=">" read="admins,anonymous" write="admins" admin="admins" />

          <authorizationEntry topic=">" read="admins,anonymous"  write="admins" admin="admins" />

        </authorizationEntries>
      </authorizationMap>
    </map>
  </authorizationPlugin>

</plugins>

根据我在网上找到的几个教程,我一直在使用下面的代码进行订阅。但是,这个主题消费者代码以及我找到的所有主题代码都创建了一个要绑定的 activemq 主题(如果该主题已经存在,则为事件),因此,只有当我也向用户授予管理员权限时,它才会被授权。 ..有没有办法在不创建主题的情况下订阅主题?

     ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory(connectionString);
     connection = connectionFactory.createConnection();
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     destination = session.createTopic(topicName);
     MessageConsumer consumer = null;
     consumer = session.createConsumer(destination);
     consumer.setMessageListener(this);
     connection.start();
4

1 回答 1

1

该主题必须由某人创建才能被阅读。创建需求的替代方法是通过<destinations>块内的<broker>块创建主题:

<destinations>
    <topic physicalName="someTopic"/>
</destinations>

当您说“创建一个要绑定的 activemq 主题(如果该主题已经存在,则为事件)”时,您可能会看到按需创建的咨询主题(这是正常的)。您应该将以下内容添加到您的授权配置中:

<authorizationEntry topic="ActiveMQ.Advisory.>" 
    read="admins" 
    write="admins,anonymous" 
    admin="admins,anonymous" />
于 2013-05-31T08:00:09.377 回答