Hello,

we have an application where each user has ists own queue and each user-group has its 
own topic. when i put a user into a group i need to add a durable subscription for the 
user on the topic associated with that group. the -service.xml file of the topic 
allows every member of the group to create a durable subscription.

i add a member to a group by getting the DynamicStateManager mbean and calling 
addUserToRole() on it. afterwards i call saveConfig(). 
i actually create the subscription for "newMember" on "groupTopic" using the following 
code:

Context ctx = null;
  | TopicConnection topicConnection = null;
  | TopicSession topicSession = null;
  | TopicSubscriber subscriber = null;
  | try {
  |   Hashtable env = new Hashtable();
  |   env.put(Context.PROVIDER_URL, providerURL);
  |   env.put(Context.SECURITY_PRINCIPAL, principal);
  |   env.put(Context.SECURITY_CREDENTIALS, credentials);
  |   ctx = new InitialContext(env);  
  |   
  |   TopicConnectionFactory factory = (TopicConnectionFactory) 
ctx.lookup(connectionFactory);
  |   topicConnection = factory.createTopicConnection(principal, credentials);
  |   topicConnection.setClientID(newMember);
  |                             
  |   topicSession = topicConnection.createTopicSession(false, 
javax.jms.Session.AUTO_ACKNOWLEDGE);
  | 
  |   Topic messageTopic = (Topic)ctx.lookup(groupTopic);
  |   subscriber = topicSession.createDurableSubscriber(messageTopic, groupTopic, 
null, true);
  | 
  |   // getStateManager() returns the statemanager mbean
  |   getStateManager().saveConfig();
  | }
  | catch (Exception e) {
  |   e.printStackTrace();
  | } 
  | finally {
  |   if (subscriber != null)
  |     subscriber.close();
  |   if (topicSession != null)
  |     try { topicSession.close(); }
  |     catch (JMSException e) {}
  |   if (topicConnection != null)
  |     try { topicConnection.close(); }
  |     catch (JMSException e) {}
  |   if (ctx != null)
  |     try { ctx.close(); }
  |     catch (Exception e) {}
  | }

the code above works fine if the clientId (newMember) is not in use. so i check this 
first and if it is in use i only use the statemanager procedure above - giving the 
user the permission to create its durable subscription when it logs in the next time.
but when he tries to do the following exception is thrown:

javax.jms.JMSSecurityException: Connection not authorized to do durable subscription 
on topic: g7000
        at 
org.jboss.mq.security.ServerSecurityInterceptor.subscribe(ServerSecurityInterceptor.java:142)
        at 
org.jboss.mq.server.TracingInterceptor.subscribe(TracingInterceptor.java:816)
        at org.jboss.mq.server.JMSServerInvoker.subscribe(JMSServerInvoker.java:297)
        at 
org.jboss.mq.il.uil2.ServerSocketManagerHandler.handleMsg(ServerSocketManagerHandler.java:160)
        at 
org.jboss.mq.il.uil2.SocketManager$ReadTask.handleMsg(SocketManager.java:355)
        at org.jboss.mq.il.uil2.msgs.BaseMsg.run(BaseMsg.java:377)
        at 
EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:732)
        at java.lang.Thread.run(Thread.java:536)

what am i missing here. do i have to restart the topic (which i cannot do because 
there may be users logged in using it)? are there any sideeffects in the statemanager 
i do not know? is there another, more preferable method to create a durable 
subscription? i use jboss 3.2.3.
any idea would be appreciated.

ingo

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3822128#3822128

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3822128


-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to