tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Felix Schumacher <felix.schumac...@internetallee.de>
Subject Re: Global JNDI resources lookup behavior difference between version 6.0.39 and 6.0.41/7.0.55
Date Wed, 03 Sep 2014 19:11:08 GMT
Am 03.09.2014 um 20:33 schrieb Robert Anderson:
> This is the complete code that was working:
> https://code.google.com/p/psi-probe/source/browse/trunk/core/src/main/java/com/googlecode/psiprobe/beans/ResourceResolverBean.java
>
>
> public List getApplicationResources() throws NamingException {
>          logger.info("Reading GLOBAL resources");
>          List resources = new ArrayList();
>
>          MBeanServer server = getMBeanServer();
>          if (server != null) {
>              try {
>                  Set dsNames = server.queryNames(new ObjectName(
> "Catalina:type=Resource,resourcetype=Global,*"), null);
>                  for (Iterator it = dsNames.iterator(); it.hasNext();) {
>                      ObjectName objectName = (ObjectName) it.next();
>                      ApplicationResource resource = new ApplicationResource
> ();
>
>                      logger.info("reading resource: " + objectName);
>                      resource.setName(getStringAttribute(server, objectName,
> "name"));
>                      resource.setType(getStringAttribute(server, objectName,
> "type"));
>                      resource.setScope(getStringAttribute(server, objectName,
> "scope"));
>                      resource.setAuth(getStringAttribute(server, objectName,
> "auth"));
>                      resource.setDescription(getStringAttribute(server,
> objectName, "description"));
>
>                      lookupResource(resource, true, true);
>
>                      resources.add(resource);
>                  }
>              } catch (Exception e) {
>                  logger.error("There was an error querying JMX server:", e);
>              }
>          }
>          return resources;
>      } public void lookupResource(ApplicationResource resource, boolean
> contextBound, boolean global) {
>          DataSourceInfo dataSourceInfo = null;
>          if (contextBound) {
>              try {
>                  String jndiName = resolveJndiName(resource.getName(), global
> );
>                  Object o = new InitialContext().lookup(jndiName); //The
> exception is here
>                  resource.setLookedUp(true);
>                  for (Iterator it = datasourceMappers.iterator(); it.hasNext
> ();) {
>                      DatasourceAccessor accessor = (DatasourceAccessor) it.
> next();
>                      dataSourceInfo = accessor.getInfo(o);
>                      if (dataSourceInfo != null) {
>                          break;
>                      }
>                  }
>
>              } catch (Throwable e) {
>                  resource.setLookedUp(false);
>                  dataSourceInfo = null;
>                  logger.error("Failed to lookup: " + resource.getName(), e);
>                  //
>                  // make sure we always re-throw ThreadDeath
>                  //
>                  if (e instanceof ThreadDeath) {
>                      throw (ThreadDeath) e;
>                  }
>              }
>          } else {
>              resource.setLookedUp(false);
>          }
>
> We are suspecting that this fix broke something:
> https://issues.apache.org/bugzilla/show_bug.cgi?id=56451.
You could use the code from the ManagerServlet which is a 
ContainerServlet and gets access to the Context (catalina not servlet).

Or you could use a valve and get the context from the request (both 
catalina ones). From that context you can get to its parent (a host) to 
its parent (an engine) and from there to the service and its server. 
 From that server you can get the global naming context which might be 
what you want.

The code from ManagerServlet looks like this

         // Acquire global JNDI resources if available
         Server server = 
((Engine)host.getParent()).getService().getServer();
         if (server != null) {
             global = server.getGlobalNamingContext();
         }

In a Valve you can get it the host in the invoke(Request req, Response 
res) method with

       Host host = (Host) req.getContext().getParent();

Regards
  Felix
>
>
>
> 2014-09-03 15:25 GMT-03:00 Filip Hanik <filip@hanik.com>:
>
>> On Wed, Sep 3, 2014 at 11:09 AM, Robert Anderson <ranomail@gmail.com>
>> wrote:
>>
>>> Thanks, Daniel. But my question the question is why that was working in
>>> 6.0.39 and the firsts releases of 7.0.x?
>>> Tomcat is not bind in java:<global name> anymore. Was it a feature
>> request
>>> or is it a bug?
>>>
>> ‚ÄčNot sure, the resource links have been around for a long time. It may have
>> been a security feature to not expose .
>> However, I'm sure there was a reason for it, and very unlikely it will
>> change back
>> You can get around it by adding a <ResourceLink> element in your
>> conf/context.xml, as this setting will apply to all your apps deployed.
>>
>> Filip
>>
>>
>>
>>> Em 03/09/2014 13:48, "Daniel Mikusa" <dmikusa@pivotal.io> escreveu:
>>>
>>>> On Wed, Sep 3, 2014 at 11:51 AM, Robert Anderson <ranomail@gmail.com>
>>>> wrote:
>>>>
>>>>> Ok! :)
>>>>>
>>>>> Steps to reproduce:
>>>>>
>>>>> 1)Download and unpack 6.0.39
>>>>>
>>>>>
>>>>>
>> http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.39/bin/apache-tomcat-6.0.39.tar.gz
>>>>> 2) Create a global jndi resouce in server.xml
>>>>>
>>>>> ....
>>>>> <GlobalNamingResources>
>>>>>          <Resource name="jdbc/cacheapp" auth="Container"
>>>>> type="javax.sql.DataSource" removeAbandoned="true"
>>>>> removeAbandonedTimeout="300"
>>>>>                                     maxActive="10" maxIdle="2"
>>> minIdle="1"
>>>>> maxWait="10000"
>>>>>                     validationQuery="select 1 from dual"
>>>>>                     testOnBorrow="true"
>>>>>                                     validationInterval="0"
>>>>>                                     username="_system" password="SYS"
>>>>> driverClassName="com.intersys.jdbc.CacheDriver"
>>>>>
>>>> url="jdbc:Cache://localhost:1972/USER"/>
>>>>>    </GlobalNamingResources>
>>>>> ...
>>>>>
>>>>> 3) Install psi-probe:
>>>>>
>> https://code.google.com/p/psi-probe/downloads/detail?name=probe-2.3.3.zip,
>>>>> unpack and copy probe.war to webapps dir;
>>>>>
>>>>> 4)  Edit tomcat-users.xml
>>>>>
>>>>> <role rolename="probeuser" />
>>>>>    <role rolename="poweruser" />
>>>>>    <role rolename="poweruserplus" />
>>>>>    <role rolename="manager" />
>>>>>
>>>>>    <user username="admin" password="t0psecret" roles="manager" />
>>>>>
>>>>> 5) Start tomcat and go to
>> http://localhost:8080/probe/datasources.htm
>>>>> It will list global jndi resources.
>>>>>
>>>> I think the question is how does it list these?  You haven't added any
>>>> resource links, so technically there are no resources available to your
>>>> application through JNDI.  See the Introduction section here, which
>>> states
>>>> why resource links are necessary.
>>>>
>>>>
>>>>
>>>>
>> http://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html#Introduction
>>>> Have you tried looking at your running 6.0.41 server, connecting with
>> JMX
>>>> and looking at the MBeans?  Is your database connection pool resources
>>>> actually available?
>>>>
>>>> Dan
>>>>
>>>>
>>>>> Instead of Tomcat 6.0.39, use 6.0.41 and probe will not list global
>>> jndi
>>>>> resources anymore.
>>>>>
>>>>>
>>>>> Thanks.
>>>>>
>>>>>
>>>>>
>>>>> 2014-09-03 12:39 GMT-03:00 Filip Hanik <filip@hanik.com>:
>>>>>
>>>>>> can you post your configuration file. that will be the only way we
>>> can
>>>>> help
>>>>>> you fix it, as I doubt tomcat will go back to pre 6.0.41 days :)
>>>>>>
>>>>>> Filip
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Wed, Sep 3, 2014 at 9:36 AM, Robert Anderson <
>> ranomail@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>>
>>>>>>> In a privileged context, a have the following jsp to test a
>> global
>>>> jndi
>>>>>>> resource:
>>>>>>>
>>>>>>> <%@ page session="false"
>>>> import="java.util.*,java.sql.*,javax.naming.*,
>>>>>>> javax.sql.*,org.apache.commons.dbcp.*" contentType="text/html"
%>
>>>>>>> <%!
>>>>>>>
>>>>>>> protected void doLookup(JspWriter out) throws ServletException,
>>>>>> IOException
>>>>>>> {
>>>>>>>   Context ctx;
>>>>>>>   try {
>>>>>>>    ctx = new InitialContext();
>>>>>>>    Object o = ctx.lookup("java:jdbc/cacheapp");
>>>>>>>    out.println(o);
>>>>>>>
>>>>>>>
>>>>>>>   } catch (NamingException e) {
>>>>>>>    out.println(e.getMessage());
>>>>>>>   } catch (Exception e) {
>>>>>>>   }
>>>>>>>   }
>>>>>>>
>>>>>>> %>
>>>>>>>
>>>>>>> <html>
>>>>>>> <head>
>>>>>>>    <title>Test JNDI</title>
>>>>>>> </head>
>>>>>>> <body>
>>>>>>>
>>>>>>> <h1>Teste JNDI</h1>
>>>>>>> <hr/>
>>>>>>> <%
>>>>>>> doLookup(out);
>>>>>>> %>
>>>>>>> <hr/>
>>>>>>>
>>>>>>> </body>
>>>>>>> </html>
>>>>>>>
>>>>>>>
>>>>>>> Versions earlier than 6.0.41:
>>>>>>>
>>>>>>> org.apache.tomcat.jdbc.pool.DataSource@29050dfd
>>>>>>> {ConnectionPool[defaultAutoCommit=null;
>>>>>>> defaultReadOnly=null; defaultTransactionIsolation=-1;
>>>>>> defaultCatalog=null;
>>>>>>> driverClassName=com.intersys.jdbc.CacheDriver; maxActive=10;
>>>> maxIdle=2;
>>>>>>> minIdle=1; initialSize=10; maxWait=10000; testOnBorrow=true;
>>>>>>> testOnReturn=false; timeBetweenEvictionRunsMillis=5000;
>>>>>>> numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=60000;
>>>>>>> testWhileIdle=false; testOnConnect=false; password=********;
>>>>>>> url=jdbc:Cache://localhost:1972/USER; username=tomcat;
>>>>>>> validationQuery=select 1 from dual; validationQueryTimeout=-1;
>>>>>>> validatorClassName=null; validationInterval=0;
>>>>>>> accessToUnderlyingConnectionAllowed=true; removeAbandoned=true;
>>>>>>> removeAbandonedTimeout=300; logAbandoned=false;
>>>>>> connectionProperties=null;
>>>>>>> initSQL=null; jdbcInterceptors=null; jmxEnabled=true;
>>> fairQueue=true;
>>>>>>> useEquals=true; abandonWhenPercentageFull=0; maxAge=0;
>>> useLock=false;
>>>>>>> dataSource=null; dataSourceJNDI=null; suspectTimeout=0;
>>>>>>> alternateUsernameAllowed=true; commitOnReturn=false;
>>>>>>> rollbackOnReturn=false; useDisposableConnectionFacade=true;
>>>>>>> logValidationErrors=false; propagateInterruptState=false;
>>>>>>> ignoreExceptionOnPreLoad=false; }
>>>>>>>
>>>>>>>
>>>>>>> 6.0.41 and 7.0.55:
>>>>>>>
>>>>>>> Name jdbc is not bound in this Context
>>>>>>>
>>>>>>> That is a bug?
>>>>>>>
>>>>>>>
>>>>>>> We are having a issue in psi-probe because this behavior change
(
>>>>>>> https://code.google.com/p/psi-probe/issues/detail?id=411).
>>>>>>>
>>>>>>>
>>>>>>> Thanks in advance.
>>>>>>>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message