2 Replies Latest reply: Nov 15, 2011 1:16 AM by Amit Singh RSS

JMS durable subscriber problem

Tomasz Wolak Newbie

Hi:

This is driving me crazy.  I don't seem to be alble to setup jboss 5 to use durable JMS. 

My setup is typical (followed Jboss in Action) and here are the highlighgts

 

messaging-jboss-beans.xml

<bean name="SecurityStore" class="org.jboss.jms.server.jbosssx.JBossASSecurityMetadataStore">

      <!-- default security configuration -->

      <property name="defaultSecurityConfig">

         <![CDATA[

            <security>

               <role name="guest" read="true" write="true" create="true"/>

            </security>

         ]]>

      </property>

      <property name="suckerPassword">CHANGE ME!!</property>

      <property name="securityDomain">JMSRealm</property>

      <property name="securityManagement"><inject bean="JNDIBasedSecurityManagement"/></property>

      <!-- @JMX annotation to export the management view of this bean -->

      <annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.messaging:service=SecurityStore",exposedInterface=org.jboss.jms.server.jbosssx.JBossASSecurityMetadataStoreMBean.class)</annotation>

      <!-- Password Annotation to inject the password from the common password utility

       <annotation>@org.jboss.security.integration.password.Password(securityDomain="messaging",methodName="setSuckerPassword")</annotation>

       -->

   </bean>

 

Destinations-service.xml

 

   <mbean code="org.jboss.jms.server.destination.TopicService"
         name="jbia.jms:service=Topic,name=secureTopic"
         xmbean-dd="xmdesc/Topic-xmbean.xml">


    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
    <depends>jboss.messaging:service=PostOffice</depends>
    <attribute name="SecurityConfig">
      <security>        
        <role name="publisher" read="true" create="true" />
      </security>
    </attribute>
  </mbean>

login-config.xml

 

 <application-policy name="JMSRealm">
    <authentication>
     <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
       <module-option name="dsJndiName">java:/MySqlDS</module-option>
       <module-option name="principalsQuery">
         SELECT passwd from jbm_user WHERE user_id=?
        </module-option>
        <module-option name="rolesQuery">
                  SELECT role_id,'Roles' FROM jbm_role WHERE user_id=?
        </module-option>
      </login-module>
    </authentication>
  </application-policy>

I am using MySql and datasource has been defined.  On startup the jms tables have been created.  The table have valid data

Now when I try to run a simple jms subscriber:

 

public class DurableTopicRecvClient {
          TopicConnection conn = null;
          TopicSession session = null;
          Topic topic = null;


          public void setupPubSub() throws JMSException, NamingException {
                    Context iniCtx = getInitialContext();
                    Object tmp = iniCtx.lookup("ConnectionFactory");


                    TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;
                    conn = tcf.createTopicConnection("dynsub", "dynsub");
                    topic = (Topic) iniCtx.lookup("topic/secureTopic");


                    session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
                    conn.start();
          }


          public void recvSync() throws JMSException, NamingException {
                    System.out.println("Begin recvSync");
                    // Setup the pub/sub connection, session
                    setupPubSub();
                    // Wait upto 5 seconds for the message
                    TopicSubscriber recv = session.createDurableSubscriber(topic,
                                        "chap6-ex1dtps");
                    Message msg = recv.receive(5000);
                    if (msg == null) {
                              System.out.println("Timed out waiting for msg");
                    } else {
                              System.out.println("DurableTopicRecvClient.recv, msgt=" + msg);
                    }
          }


          public void stop() throws JMSException {
                    conn.stop();
                    session.close();
                    conn.close();
          }


          public static void main(String args[]) throws Exception {
                    System.out.println("Begin DurableTopicRecvClient, now="
                                        + System.currentTimeMillis());
                    DurableTopicRecvClient client = new DurableTopicRecvClient();
                    client.recvSync();
                    client.stop();
                    System.out.println("End DurableTopicRecvClient");
                    System.exit(0);
          }


          public static Context getInitialContext()
                              throws javax.naming.NamingException {
                    Properties p = new Properties();
                    p.put(Context.INITIAL_CONTEXT_FACTORY,
                                        "org.jnp.interfaces.NamingContextFactory");
                    p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces");
                    p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
                    return new javax.naming.InitialContext(p);
          }
}

I get this: in the clients log

 

Exception in thread "main" javax.jms.JMSSecurityException: User: dynsub is not authorized to create durable sub on destination secureTopic
          at org.jboss.jms.server.container.SecurityAspect.check(SecurityAspect.java:312)
          at org.jboss.jms.server.container.SecurityAspect.handleCreateConsumerDelegate(SecurityAspect.java:120)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          at java.lang.reflect.Method.invoke(Unknown Source)
          at org.jboss.aop.advice.PerInstanceAdvice.invoke(PerInstanceAdvice.java:122)
          at org.jboss.jms.server.endpoint.advised.SessionAdvised$createConsumerDelegate_8721389917985689973.invokeNext(SessionAdvised$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.server.container.ServerLogInterceptor.invoke(ServerLogInterceptor.java:105)
          at org.jboss.jms.server.endpoint.advised.SessionAdvised$createConsumerDelegate_8721389917985689973.invokeNext(SessionAdvised$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.server.endpoint.advised.SessionAdvised.createConsumerDelegate(SessionAdvised.java)
          at org.jboss.jms.wireformat.SessionCreateConsumerDelegateRequest.serverInvoke(SessionCreateConsumerDelegateRequest.java:100)
          at org.jboss.jms.server.remoting.JMSServerInvocationHandler.invoke(JMSServerInvocationHandler.java:157)
          at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:897)
          at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:768)
          at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:721)
          at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:575)
          at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
          at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:213)
          at org.jboss.remoting.Client.invoke(Client.java:1917)
          at org.jboss.remoting.Client.invoke(Client.java:768)
          at org.jboss.remoting.Client.invoke(Client.java:756)
          at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:189)
          at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:160)
          at org.jboss.jms.client.delegate.ClientSessionDelegate.org$jboss$jms$client$delegate$ClientSessionDelegate$createConsumerDelegate$aop(ClientSessionDelegate.java:267)
          at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.client.container.StateCreationAspect.handleCreateConsumerDelegate(StateCreationAspect.java:136)
          at org.jboss.aop.advice.org.jboss.jms.client.container.StateCreationAspect_z_handleCreateConsumerDelegate_1835992178.invoke(StateCreationAspect_z_handleCreateConsumerDelegate_1835992178.java)
          at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.client.container.ConsumerAspect.handleCreateConsumerDelegate(ConsumerAspect.java:76)
          at org.jboss.aop.advice.org.jboss.jms.client.container.ConsumerAspect_z_handleCreateConsumerDelegate_1835992178.invoke(ConsumerAspect_z_handleCreateConsumerDelegate_1835992178.java)
          at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.client.container.FailoverValveInterceptor.invoke(FailoverValveInterceptor.java:92)
          at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
          at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
          at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
          at org.jboss.jms.client.delegate.ClientSessionDelegate$createConsumerDelegate_8721389917985689973.invokeNext(ClientSessionDelegate$createConsumerDelegate_8721389917985689973.java)
          at org.jboss.jms.client.delegate.ClientSessionDelegate.createConsumerDelegate(ClientSessionDelegate.java)
          at org.jboss.jms.client.JBossSession.createDurableSubscriber(JBossSession.java:279)
          at com.tomek.jms.topic.DurableTopicRecvClient.recvSync(DurableTopicRecvClient.java:50)
          at com.tomek.jms.topic.DurableTopicRecvClient.main(DurableTopicRecvClient.java:70)

I tried this for half a day and I am not getting anywehre.  Abviously I am missing something trivial and I am hoping that a second set of eyes might spot the problem. 

 

Additional files are attached.

 

Thanks for your help.

  • 1. Re: JMS durable subscriber problem
    Tomasz Wolak Newbie

    I fixed this.  Helps to step away from a problem for few hours

    Two issues. First destinations-services where the topic is defined another privliage needs to be added "create" this one allows you to create durable subscribers.

     

    <mbean code="org.jboss.jms.server.destination.TopicService"
             name="jbia.jms:service=Topic,name=secureTopic"
             xmbean-dd="xmdesc/Topic-xmbean.xml">
    
    
        <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
        <depends>jboss.messaging:service=PostOffice</depends>
        <attribute name="SecurityConfig">
          <security>       
                  <role name="publisher" read="true" write="true" create="true"/>
          </security>
        </attribute>
      </mbean>
    
    

    Second problem is that the creation of durable subscritpion requires a Client id on the connection.  I changed the setupPubSub() method to do just that

     

    public void setupPubSub() throws JMSException, NamingException {
                        Context iniCtx = getInitialContext();
                        Object tmp = iniCtx.lookup("ConnectionFactory");
    
    
                        TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;
      
                        conn = tcf.createTopicConnection("dynsub","dynsub");
                        conn.setClientID("myId");
                  topic = (Topic) iniCtx.lookup("topic/secureTopic"); 
                  session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
                        conn.start();
      
              }
    
    

    Hoe this helps someone else.

    Cheers

    Tomasz

  • 2. Re: JMS durable subscriber problem
    Amit Singh Newbie

    thanks!!!