Maneira correta de tornar as fontes de dados/recursos uma configuração de tempo de implantação

StackOverflow https://stackoverflow.com/questions/2343976

Pergunta

Eu tenho um aplicativo da web que requer duas configurações:

  • Um conjunto de dados JDBC
  • Um token de string

Desejo desesperadamente poder implantar um .war em vários contêineres diferentes (Jetty, Tomcat, GF3 Minimum) e definir essas configurações no nível do aplicativo dentro do contêiner.

Meu código faz isso:

InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")

Vamos supor que eu usei a interface de gerenciamento de vidro para criar dois recursos JDBC: JDBC/teste-Datasource e JDBC/Live-Datasource, que se conectam a diferentes cópias do mesmo esquema, em diferentes servidores, diferentes credenciais etc. Diga que eu quero implantar Isso para Glassfish com e aponte para o teste DataSource, eu posso ter isso no meu Sun-web.xml:

...
<resource-ref>
  <res-ref-name>jdbc/datasource</res-ref-name>
  <jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...

mas

  • Sun-web.xml vai lado de dentro Minha guerra, certo?
  • Certamente deve haver uma maneira de fazer isso através da interface de gerenciamento

Estou tentando fazer a coisa certa? Outros contêineres facilitam isso? Eu estaria particularmente interessado em como o Jetty 7 lida com isso, pois eu o uso para desenvolvimento.

EDITAR Tomcat tem uma maneira razoável de fazer isso:

Crio $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml com:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
  <!-- String resource -->
  <Environment name="token" value="value of token" type="java.lang.String" override="false" />

  <!-- Linking to a global resource -->
  <ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />

  <!-- Derby -->
  <Resource name="jdbc/datasource2"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
    url="jdbc:derby:test;create=true"
    />

  <!-- H2 -->
  <Resource name="jdbc/datasource3"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.h2.jdbcx.JdbcDataSource"
    url="jdbc:h2:~/test"
    username="sa"
    password=""
    />
</Context>

Observe que override="false" significa o oposto. Isso significa que esta configuração não pode ser superestimado por web.xml.

Eu gosto dessa abordagem porque o arquivo faz parte do recipiente Configuração não a guerra, mas não faz parte da configuração global; É específico do WebApp.

Acho que espero um pouco mais do Glassfish, pois ele deve ter uma interface de administrador da Web completa, mas ficaria feliz o suficiente com algo equivalente ao acima.

Nenhuma solução correta

Outras dicas

Para GF V3, você pode tentar aproveitar a opção - -DEGEMmentPlan do subcomando de implantação do Asadmin. É discutido no página de homem para o subcomando de implantação.

Não tenho certeza de realmente entender a pergunta/problema.

Como um Provedor de componentes do aplicativo, você declara os recursos exigidos pelo seu aplicativo em uma maneira padrão (agnóstico de contêiner) no web.xml.

No momento da implantação, o Implementador de aplicativos e administrador deve seguir as instruções fornecidas pelo Provedor de componentes do aplicativo Para resolver dependências externas (entre outras coisas), por exemplo, criando uma fonte de dados no nível do servidor de aplicativos e mapeando seu nome JNDI real para o nome do recurso usado pelo aplicativo através do uso de um servidor de aplicativo descritor de implantação específico (por exemplo, o sun-web.xml para peixe glass). Obviamente, isso é um contêiner específico Etapa e, portanto, não coberto pela especificação Java EE.

Agora, se você deseja alterar o banco de dados que um aplicativo está usando, você precisará:

  • Altere o mapeamento no descritor de implantação do servidor de aplicativos - ou -
  • Modifique a configuração do DataSource existente para fazer pontos em outro banco de dados.

Ter uma interface de administrador realmente não muda nada. Se eu perdi alguma coisa, não hesite em me avisar. E apenas por precaução, talvez dê uma olhada esta resposta anterior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top