Как мне настроить пул соединений с GWT / Jetty в eclipse?

Извините, если этот вопрос кажется повторяющимся, но мне не удалось найти работоспособное решение из результатов поиска по существующим сообщениям.

У меня есть веб-приложение, использующее пул соединений JDBC. Ресурс пула соединений определяется в файле войны meta-inf / context.xml. Когда я развертываю файл войны в tomcat, этот файл копируется (и переименовывается в соответствии с именем моего файла войны) в папку conf / catalina / localhost в tomcat. Мой код получает объект источника данных соединения следующим образом:

Context envCtx = (Context) new InitialContext().lookup("java:comp/env");
datasource = (DataSource) envCtx.lookup("jdbc/MYDB");

и в моем context.xml определен следующий ресурс:

<Resource name="jdbc/MYDB" 
      auth="Container" 
      type="javax.sql.DataSource"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      username="username" 
      password="password" 
      url="jdbc:sqlserver://myremote.database.server:1433;databaseName=testdb"
      />

Все это хорошо работает, когда файл war развернут на tomcat.

Однако во время разработки в eclipse и из-за зависимостей GWT мне часто приходится отлаживать с помощью встроенного контейнера Jetty GWT.

Когда я это делаю, вызов InitialContext () завершается ошибкой со следующим сообщением:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

Я попытался использовать jetty-env.xml в веб-инфо войны, но это тоже не сработало (та же ошибка), возможно, синтаксическая ошибка в jetty-env.xml или что-то еще.

Вот мой причал-env:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<New id="OTMFTDB" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/MYDB</Arg>
    <Arg>
        <New class="net.sourceforge.jtds.jdbcx.JtdsDataSource">
            <Set name="User">username</Set>
            <Set name="Password">password</Set>
            <Set name="DatabaseName">testdb</Set>
            <Set name="ServerName">myremote.database.server</Set>
            <Set name="PortNumber">1433</Set>
        </New>
    </Arg>
</New>
</Configure>

И последнее. Если я изменил имя jetty-env.xml на jetty-web.xml, то при попытке подключения браузера я получу ошибку 503 HTML. (eclipse показывает следующую ошибку: [WARN] Неудачный запуск контекста com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload@111a20c {/, E: \ dev \ src \ servers \ webservice \ war} java.lang .ClassNotFoundException: org.eclipse.jetty.server.Server)

Итак, я считаю, что jetty-env не был загружен, а jetty-web загружен, но мой jetty-web явно мешает настройкам GWT для причала.


person adaj21    schedule 14.03.2012    source источник


Ответы (2)


Вам не хватает org.eclipse.jetty.server.Server, но я думаю, что это неправильный класс. GWT 2.5.1 использует причал 6.1.11 и, согласно , является org. Пакет eclipse.jetty от Jetty 7, а не 6!

У меня была аналогичная проблема, и я решил ее, добавив в свой проект библиотеки jetty-naming и jetty-plus. Это проект maven, поэтому я добавил его в pom.xml:

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-naming</artifactId>
    <version>6.1.11</version>
</dependency>
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-plus</artifactId>
    <version>6.1.11</version>
</dependency>

Без maven вы можете загрузить наименование причалов и jar-файлы jetty-plus из Интернета.

Мой ресурс - драйвер PostgreSQL JDBC. Теперь все работает - в режиме хостинга конфигурация ресурсов загружается из файла jetty-web.xml. И когда я создаю войну и развертываю ее в Tomcat, ресурс получается из context.xml.

context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/web">
    <Resource auth="Container" driverClassName="org.postgresql.Driver"
        maxActive="100" maxIdle="30" maxWait="200" name="jdbc/postgres"
        username="testuser" password="testpass" type="javax.sql.DataSource"
        url="jdbc:postgresql://localhost:5433/resolver" />
</Context>

jetty-web.xml:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <New id="GWT_HOSTED_MODE_DB" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>java:/comp/env/jdbc/postgres</Arg>
        <Arg>
            <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.postgresql.Driver</Set>
                <Set name="url">jdbc:postgresql://localhost:5433/resolver</Set>
                <Set name="username">testuser</Set>
                <Set name="password">testpass</Set>
            </New>
        </Arg>
    </New>
</Configure>

Также мой web.xml содержит эту ссылку:

<resource-ref>
    <description>Postgres Connection pool datasource</description>
    <res-ref-name>jdbc/postgres</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Источник данных загружается следующим образом (упрощенно):

DataSource dataSource = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/postgres");
person rzehan    schedule 29.10.2013
comment
Спасибо за развернутый ответ! Я попробовал, и у меня ничего не вышло. Я считаю, что это потому, что я использую более новый GWT (2.6.0), который, как мне кажется, использует Jetty 8.1.12, на основе этого ответа SO (stackoverflow.com/a/17592318). Я считаю, что файл конфигурации и имя класса будут другими, но я не смог найти документацию по Jetty 8 в Интернете (доступна только Jetty 9.3.x). В любом случае я попытаюсь следовать инструкциям для Jetty 9 (здесь: eclipse.org/jetty/documentation/9.3.x/using-jetty-jndi.html). Если у вас есть какие-либо идеи, пожалуйста, поделитесь со мной. - person leeyuiwah; 13.11.2017

Хотя я не знаком с вашей проблемой причала, я знаю, что вы можете использовать свой собственный контейнер сервлетов вместо контейнера сервлетов GWT, используя флаг -noserver. Он отлично работает и позволяет мне использовать любой другой сервер в режиме хостинга.

/DevGuideCompilingAndDebugging.html#How_do_I_use_my_own_server_in_development_mode_instead_of_GWT's

person Stevko    schedule 14.03.2012