...
Bloc de code | ||
---|---|---|
| ||
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>apogee-wsdl-etudiant-metier</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>https://ws.univ-ville.fr/apo-ws/services/EtudiantMetier?wsdl</wsdlUrl>
</wsdlUrls>
<packageName>fr.univville.wsclient.apogee.etudiant</packageName>
</configuration>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
<sourceDestDir>${basedir}/src/main/java</sourceDestDir>
<args>
<arg>-B-XautoNameResolution</arg>
</args>
</configuration>
</plugin> |
...
On configure apache pour utiliser le module worker et n'avoir qu'un seul process (server) à la fois ce qui permettra d'utiliser la directive max dans le proxypass :
Bloc de code | ||
---|---|---|
| ||
LoadModule mpm_worker_module modules/mod_mpm_worker.so # ServerLimit à 1 pour pouvoir faire un max=1 dans le proxypass et faire ainsi goulot d'étranglement : # 1 seule requête à la fois que le WS de siham qui ne supporte pas les appels concurrents ServerLimit 1 StartServers 1 MaxRequestWorkers 512 ThreadsPerChild 512 MaxClients 512 ThreadLimit 512 # MaxConnectionsPerChild à 1 pour que si ça plante entre apache et tomcat, # le fait que le thread qui gère cette requête/connexion soit dans un état 'incohérent' ne pose pas de pb : # chaque thread n'étant utilisé qu'une fois pour 1 requête : MaxConnectionsPerChild 1 |
...
Code Java
Bloc de code | ||
---|---|---|
| ||
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartException;
import fr.univville.siham.dossieragent.DossierAgentDateWebService;
import fr.univville.siham.dossieragent.Individu;
import fr.univville.siham.dossieragent.Matricule;
import fr.univville.siham.dossieragent.ParamAgentDateWS;
import fr.univville.siham.dossieragent.ReferentielService;
import fr.univville.siham.dossieragent.WebserviceException_Exception;
import fr.univville.siham.listeagents.IListeAgentsWebService;
import fr.univville.siham.listeagents.ListeAgentsWS;
import fr.univville.siham.listeagents.ParamListeAgents;
import fr.univville.siham.listeagents.ResultatsListeAgents;
import fr.univville.siham.listeagents.WebServiceException_Exception;
import fr.univville.siham.parametrage.DossierParametrageWebService;
import fr.univville.siham.parametrage.ListeNomenclatures;
import fr.univville.siham.parametrage.ListeUO;
import fr.univville.siham.parametrage.NomenclatureService;
import fr.univville.siham.parametrage.ParamNomenclature;
import fr.univville.siham.parametrage.ParamStructure;
import fr.univville.siham.parametrage.Repertoire;
import fr.univville.siham.parametrage.Structures;
public class SihamService {
private static final int NB_AGENTS_PER_REQUEST = 20;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
private IListeAgentsWebService listeAgentsWebService;
private DossierAgentDateWebService dossierAgentDateWebService;
private DossierParametrageWebService parametrageWebService;
private String url;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
private Map<String, List<String>> getWsHeaders() {
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList(username));
headers.put("Password", Collections.singletonList(password));
return headers;
}
private IListeAgentsWebService getIListeAgentsWebService() {
if(listeAgentsWebService==null) {
try {
initAuthenticator();
URL listeAgentsWsUrl = new URL(url + "/ListeAgentsWebService/ListeAgentsWebService?wsdl");
ListeAgentsWS listeAgentsWS = new ListeAgentsWS(listeAgentsWsUrl);
listeAgentsWebService = listeAgentsWS.getListeAgentsWebServiceImplPort();
Map<String, Object> req_ctx = ((BindingProvider)listeAgentsWebService).getRequestContext();
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, getWsHeaders());
log.info("Siham listeAgentsWebService OK");
} catch(Exception ex) {
throw new RuntimeException("Exception during initialization of siham ws ListeAgentsWebService", ex);
} finally {
resetAuthenticator();
}
}
return listeAgentsWebService;
}
private DossierAgentDateWebService getDossierAgentDateWebService() {
if(dossierAgentDateWebService==null) {
try {
initAuthenticator();
URL dossierAgentWsUrl = new URL(url + "/DossierAgentDateWebService/DossierAgentDateWebService?wsdl");
ReferentielService referentielService = new ReferentielService(dossierAgentWsUrl);
dossierAgentDateWebService = referentielService.getDossierAgentDateWebServiceImpPort();
Map<String, Object> req_ctx_ref = ((BindingProvider)dossierAgentDateWebService).getRequestContext();
req_ctx_ref.put(MessageContext.HTTP_REQUEST_HEADERS, getWsHeaders());
log.info("Siham dossierAgentDateWebService OK");
} catch(Exception ex) {
throw new RuntimeException("Exception during initialization of siham ws DossierAgentDateWebService", ex);
} finally {
resetAuthenticator();
}
}
return dossierAgentDateWebService;
}
private DossierParametrageWebService getDossierParametrageWebService() {
if(parametrageWebService==null) {
try {
initAuthenticator();
URL parametrageWsUrl = new URL(url + "/DossierParametrageWebService/DossierParametrageWebService?wsdl");
NomenclatureService nomenclatureService = new NomenclatureService(parametrageWsUrl);
parametrageWebService = nomenclatureService.getDossierParametrageWebServiceImpPort();
Map<String, Object> req_ctx_par = ((BindingProvider)parametrageWebService).getRequestContext();
req_ctx_par.put(MessageContext.HTTP_REQUEST_HEADERS, getWsHeaders());
log.info("Siham parametrageWebService OK");
} catch(Exception ex) {
throw new RuntimeException("Exception during initialization of siham ws DossierAgentDateWebService", ex);
} finally {
resetAuthenticator();
}
}
return parametrageWebService;
}
private void initAuthenticator() {
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
username,
password.toCharArray());
}
});
}
private void resetAuthenticator() {
Authenticator.setDefault(null);
}
protected List<String> getAgentsMatricules(String nomUsuel) {
List<String> matricules = new ArrayList<String>();
ParamListeAgents paramRecupListeAgents = new ParamListeAgents();
paramRecupListeAgents.setNomUsuel(nomUsuel);
try {
List<ResultatsListeAgents> agents= getIListeAgentsWebService().recupListeAgents(paramRecupListeAgents);
for(ResultatsListeAgents agent : agents) {
matricules.add(agent.getMatricule());
}
log.debug(agents.size() + " matricules d'agents récupérés depuis Siham");
} catch (WebServiceException_Exception e) {
throw new MultipartException("Erreur lors de la récupération agents depuis web-service siham", e);
}
return matricules;
}
public Individu getSihamIndividu(String matricule) {
Map<String, Individu> sihamIndividus = getSihamIndividus(Arrays.asList(new String[] {matricule}));
return sihamIndividus.get(matricule);
}
public synchronized Map<String, Individu> getSihamIndividus(List<String> matricules) {
Map<String, Individu> sihamIndividus = new HashMap<String, Individu>();
ParamAgentDateWS paramAgentDateWS = new ParamAgentDateWS();
int i = 0;
int n = 0;
List<String> matriculesErreurs = new ArrayList<String>();
for(String matricule: matricules) {
i++;
n++;
Matricule matriculeObj = new Matricule();
matriculeObj.setMatricule(matricule);
paramAgentDateWS.getListeMatricules().add(matriculeObj);
if(i==NB_AGENTS_PER_REQUEST || n==matricules.size()) {
try {
List<Individu> agents = getDossierAgentDateWebService().recupDonneesAgents(paramAgentDateWS);
for(Individu agent: agents) {
sihamIndividus.put(agent.getDonneesPersonnelles().getMatricule(), agent);
}
} catch (WebserviceException_Exception e) {
log.info("Erreur lors de la récupération agents depuis web-service siham", e);
for(Matricule agentMatricule : paramAgentDateWS.getListeMatricules()) {
ParamAgentDateWS agentParamAgentDateWS = new ParamAgentDateWS();
agentParamAgentDateWS.getListeMatricules().add(agentMatricule);
try {
List<Individu> agents = getDossierAgentDateWebService().recupDonneesAgents(agentParamAgentDateWS);
for(Individu agent: agents) {
sihamIndividus.put(agent.getDonneesPersonnelles().getMatricule(), agent);
}
} catch (WebserviceException_Exception ee) {
log.warn("Erreur lors de la récupération de cet agent depuis web-service siham : " + agentMatricule.getMatricule(), ee);
sihamIndividus.put(agentMatricule.getMatricule(), new SihamIndividuAgentInError());
matriculesErreurs.add(agentMatricule.getMatricule());
}
}
}
paramAgentDateWS = new ParamAgentDateWS();
i = 0;
}
}
if(matriculesErreurs.size() > 0) {
log.error("Matricules en erreur lors de la récupération de ces agents depuis web-service siham : " + matriculesErreurs);
}
log.info(sihamIndividus.size() + " agents récupérés depuis Siham dont " + matriculesErreurs.size() + " en erreur.");
return sihamIndividus;
}
public Map<String, Individu> getSihamIndividuFromNomUsuel(String nomUsuel) {
List<String> matricules = getAgentsMatricules(nomUsuel);
Map<String, Individu> sihamIndividus = getSihamIndividus(matricules);
return sihamIndividus;
}
public List<Structures> getSihamStructures() {
List<Structures> structures;
try {
ParamStructure paramStructure = new ParamStructure();
paramStructure.setCodeAdministration("");
paramStructure.setDateObservation("");
paramStructure.getListeUO().add(new ListeUO());
structures = getDossierParametrageWebService().recupStructures(paramStructure);
} catch (fr.univville.siham.parametrage.WebserviceException_Exception e) {
throw new RuntimeException("Erreur lors de la récupération des structures depuis web-service siham", e);
}
log.info(structures.size() + " structures récupérées depuis Siham");
return structures;
}
public List<Repertoire> getSihamNomenclaturesRepertoires() {
List<Repertoire> repertoires;
try {
ParamNomenclature paramNomenclature = new ParamNomenclature();
paramNomenclature.setCodeAdministration("");
paramNomenclature.setDateObservation("");
paramNomenclature.getListeNomenclatures().add(new ListeNomenclatures());
repertoires = getDossierParametrageWebService().recupNomenclaturesRH(paramNomenclature);
} catch (fr.univville.siham.parametrage.WebserviceException_Exception e) {
throw new RuntimeException("Erreur lors de la récupération des répertoires de nomenclatures depuis web-service siham", e);
}
log.info(repertoires.size() + " répertoires de nomenclatures récupérées depuis Siham");
return repertoires;
}
}
|
...