2013-05-31 40 views
0

我一直在嘗試配置我的activemq服務器,以便匿名客戶端可以只訂閱主題(他們將無法創建或發佈到主題)。如何訂閱僅具有讀取權限的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主題(如果該主題已存在,則爲event),因此只有在授予用戶管理權限的情況下才會授權。 .. 有沒有一種方法來訂閱主題而不創建它?

 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(); 

回答

1

題目必須由某人爲了創建被讀出。創造需求的另一種方法是<broker>塊內通過<destinations>塊創建主題:

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

當你說「創建綁定到(事件如果主題已經存在)的ActiveMQ的主題」你可能會看到advisory topics按需創建(這是正常的)。你應該添加下列到您的授權配置:

<authorizationEntry topic="ActiveMQ.Advisory.>" 
    read="admins" 
    write="admins,anonymous" 
    admin="admins,anonymous" /> 
+0

我的意思現有的主題是已被授權的Java客戶端以前創建的(與管理員權限),並在我的情況一個話題,消息被公佈到它。然後,訂閱者連接到已存在並訂閱該主題的主題。問題是,我只能通過首先調用'destination = session.createTopic(topicName);'來訂閱Java上現有的主題;並且爲了能夠這樣做,我必須授予該用戶的管理權限,而像他一樣的Id剛剛閱讀權限 – Thomas

+1

實際上,createTopic方法不會與Broker產生任何通信,因此即使只有讀取權限,您也可以從客戶端代碼中調用它。只有當客戶端繼續訂閱或產生一個不存在的目的地時,事情纔會失敗,在這種情況下會拋出異常。您應該將createTopic和createQueue視爲它們返回的對象的本地工廠方法。 –