Interroger Oracle E-Business Suite à l’aide de procédures stockées avec le modèle de service WCF
Vous pouvez configurer l’adaptateur Oracle E-Business pour recevoir des messages de modification de données périodiques à l’aide de procédures stockées pour interroger régulièrement la base de données Oracle. Vous pouvez spécifier une procédure stockée en tant qu’instruction d’interrogation que l’adaptateur exécute régulièrement pour interroger la base de données Oracle.
Pour activer l’interrogation, vous devez spécifier certaines propriétés de liaison comme décrit dans cette rubrique. Pour plus d’informations sur la façon dont l’adaptateur prend en charge l’interrogation, consultez Prise en charge des appels entrants à l’aide de l’interrogation.
Configuration d’une opération d’interrogation avec les propriétés de liaison de l’adaptateur Oracle E-Business
Le tableau suivant récapitule les propriétés de liaison de l’adaptateur Oracle E-Business que vous utilisez pour configurer l’adaptateur pour recevoir des messages de modification de données. Vous devez spécifier ces propriétés de liaison lors de l’exécution de l’application d’interrogation.
Binding, propriété | Description |
---|---|
InboundOperationType | Spécifie si vous souhaitez effectuer une opération entrante d’interrogation ou de notification . La valeur par défaut est Interrogation. |
PolledDataAvailableStatement | Spécifie l’instruction SQL que l’adaptateur exécute pour déterminer si des données sont disponibles pour l’interrogation. Seulement si un enregistrement est disponible, la procédure stockée que vous avez spécifiée pour la propriété de liaison PollingInput est exécutée. |
PollingInterval | Spécifie l’intervalle, en secondes, auquel l’adaptateur Oracle E-Business exécute l’instruction spécifiée pour la propriété de liaison PolledDataAvailableStatement . La valeur par défaut est 30 secondes. L’intervalle d’interrogation détermine l’intervalle de temps entre les sondages successifs. Si l’instruction est exécutée dans l’intervalle spécifié, l’adaptateur est mis en veille pendant la durée restante de l’intervalle. |
PollingInput | Spécifie l’instruction d’interrogation. Pour interroger à l’aide d’une procédure stockée, vous devez spécifier l’intégralité du message de demande pour cette propriété de liaison. Le message de demande doit être le même que celui que vous envoyez à l’adaptateur pour appeler la procédure stockée en tant qu’opération sortante. La valeur par défaut est null. Vous devez spécifier une valeur pour la propriété de liaison PollingInput pour activer l’interrogation. L’instruction d’interrogation est exécutée uniquement si des données sont disponibles pour l’interrogation, ce qui est déterminé par la propriété de liaison PolledDataAvailableStatement . |
PollingAction | Spécifie l’action de l’opération d’interrogation. Vous pouvez déterminer l’action d’interrogation à partir de l’interface de service générée pour l’opération à l’aide du plug-in Visual Studio Add Adapter Service Reference. |
PostPollStatement | Spécifie un bloc d’instructions exécuté après l’exécution de l’instruction spécifiée par la propriété de liaison PollingInput . |
PollWhileDataFound | Spécifie si l’adaptateur Oracle E-Business ignore l’intervalle d’interrogation et exécute en continu l’instruction d’interrogation, si des données sont disponibles dans la table interrogée. Si aucune donnée n’est disponible dans la table, l’adaptateur rétablit pour exécuter l’instruction d’interrogation à l’intervalle d’interrogation spécifié. La valeur par défaut est false. |
Pour obtenir une description plus complète de ces propriétés, consultez En savoir plus sur les propriétés de liaison de l’adaptateur BizTalk pour Oracle E-Business Suite. Pour obtenir une description complète de l’utilisation de l’adaptateur Oracle E-Business à interroger, lisez les sections suivantes.
Comment cette rubrique illustre l’interrogation
Dans cette rubrique, pour montrer comment l’adaptateur Oracle E-Business prend en charge la réception de messages de modification de données à l’aide de procédures stockées, vous utilisez la procédure stockée GET_ACTIVITYS pour interroger la table ACCOUNTACTIVITY dans la base de données Oracle. Cette procédure stockée est disponible avec le package ACCOUNT_PKG. Vous pouvez exécuter les scripts SQL fournis avec les exemples pour créer ces objets dans la base de données.
Notes
L’exemple de cette rubrique interroge la table ACCOUNTACTIVITY, qui est une table de base de données de base créée en exécutant les scripts fournis avec les exemples. Vous devez effectuer des procédures similaires à celles décrites dans cette rubrique pour interroger toute autre table, y compris les tables d’interface.
Pour illustrer une opération d’interrogation, nous procédons comme suit :
Spécifiez une instruction SELECT pour la propriété de liaison PolledDataAvailableStatement afin de déterminer où la table interrogée (ACCOUNTACTIVITY) contient des données. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :
SELECT COUNT (*) FROM ACCOUNTACTIVITY
Cela garantit que l’adaptateur exécute l’instruction d’interrogation uniquement lorsque la table ACCOUNTACTIVITY contient des enregistrements.
Exécutez une procédure stockée, GET_ACTIVITYS, en fournissant le message de demande dans le cadre de la propriété de liaison PollingInput . Cette procédure stockée récupère toutes les lignes de la table ACCOUNTACTIVITY et vous obtenez un message de réponse de l’adaptateur.
Exécutez un bloc PL/SQL dans le cadre de la propriété de liaison PostPollStatement . Cette instruction déplace toutes les données de la table ACCOUNTACTIVITY vers une autre table de la base de données. Après cela, la prochaine fois que PollingInput est exécuté, il n’extrait aucune donnée et, par conséquent, la procédure stockée GET_ACTIVITYS retourne un message de réponse vide.
Jusqu’à ce que des données supplémentaires soient ajoutées à la table ACCOUNTACTIVITY, vous continuez à recevoir des messages de réponse vides. Vous devez donc remplir à nouveau la table ACCOUNTACTIVITY avec de nouveaux enregistrements. Pour ce faire, exécutez le script more_activity_data.sql fourni avec les exemples. Après avoir exécuté ce script, l’opération d’interrogation suivante extrait les nouveaux enregistrements insérés dans la table.
Configuration de l’interrogation dans le modèle de service WCF
Pour interroger à l’aide de procédures stockées avec l’adaptateur Oracle E-Business avec le modèle de service WCF, vous devez :
Générez un contrat de service WCF (interface) pour la procédure stockée à l’aide de laquelle vous allez interroger. Pour cet exemple, vous devez générer le contrat de service WCF pour la procédure stockée GET_ACTIVITYS en tant qu’opération entrante. Pour ce faire, vous pouvez utiliser le plug-in Add Adapter Service Reference.
Implémentez un service WCF à partir de cette interface.
Hébergez ce service WCF à l’aide d’un hôte de service (System.ServiceModel.ServiceHost).
À propos des exemples utilisés dans cette rubrique
Les exemples de cette rubrique interrogent la table de base de données ACCOUNTACTIVITY à l’aide de la procédure stockée GET_ACTIVITYS. Un script pour générer la table et la procédure stockée sont fournis avec les exemples. Pour plus d’informations sur les exemples, consultez Exemples pour l’adaptateur Oracle EBS. Un exemple , StoredProcPolling_ServiceModel, basé sur cette rubrique, est également fourni avec les exemples d’adaptateurs Oracle E-Business.
Contrat et classe de service WCF
Vous pouvez utiliser le plug-in Add Adapter Service Reference pour créer un contrat de service WCF (interface) et des classes de prise en charge pour l’opération entrante GET_ACTIVITYS . Pour plus d’informations sur la génération d’un contrat de service WCF, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution Oracle E-Business Suite.
Contrat de service WCF (interface)
Le code suivant montre le contrat de service WCF (interface) généré pour l’opération entrante GET_ACTIVITYS .
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/", ConfigurationName="PollingPackageApis_APPS_ACCOUNT_PKG")]
public interface PollingPackageApis_APPS_ACCOUNT_PKG {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/PollingPackageApis/APPS/ACCOUNT_PKG) of message GET_ACTIVITYS
// does not match the default value (https://schemas.microsoft.com/OracleEBS/)
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="PollingPackageApis/APPS/ACCOUNT_PKG/GET_ACTIVITYS")]
void GET_ACTIVITYS(GET_ACTIVITYS request);
}
Contrats de message
Voici le contrat de message pour l’opération entrante GET_ACTIVITYS .
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="GET_ACTIVITYS", WrapperNamespace="http://schemas.microsoft.com/OracleEBS/2008/05/PollingPackageApis/APPS/ACCOUNT_PK" +
"G", IsWrapped=true)]
public partial class GET_ACTIVITYS {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/PollingPackageApis/APPS/ACCOUNT_PK" +
"G", Order=0)]
public schemas.microsoft.com.OracleEBS._2008._05.RecordTypes.APPS.ACCOUNT_PKG.GET_ACTIVITYS.OUTRECSRecord[] OUTRECS;
public GET_ACTIVITYS() {
}
public GET_ACTIVITYS(schemas.microsoft.com.OracleEBS._2008._05.RecordTypes.APPS.ACCOUNT_PKG.GET_ACTIVITYS.OUTRECSRecord[] OUTRECS) {
this.OUTRECS = OUTRECS;
}
}
Classe de service WCF
Le plug-in Add Adapter Service Reference génère également un fichier qui a un stub pour la classe de service WCF implémentée à partir du contrat de service (interface). Le nom du fichier est OracleEBSBindingService.cs. Vous pouvez insérer la logique pour traiter l’opération GET_ACTIVITYS directement dans cette classe. Le code suivant montre la classe de service WCF générée par le plug-in Add Adapter Service Reference.
namespace OracleEBSBindingNamespace {
public class OracleEBSBindingService : PollingPackageApis_APPS_ACCOUNT_PKG {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/PollingPackageApis/APPS/ACCOUNT_PKG) of message GET_ACTIVITYS
// does not match the default value (https://schemas.microsoft.com/OracleEBS/)
public virtual void GET_ACTIVITYS(GET_ACTIVITYS request) {
throw new System.NotImplementedException("The method or operation is not implemented.");
}
}
}
Réception de messages entrants à des fins d’interrogation à l’aide d’une procédure stockée
Cette section fournit des instructions sur la façon d’écrire une application .NET pour recevoir des messages d’interrogation entrant à l’aide de l’adaptateur Oracle E-Business.
Pour recevoir des messages d’interrogation à l’aide d’une procédure stockée
Utilisez le plug-in Add Adapter Service Reference pour générer un contrat de service WCF (interface) et des classes d’assistance pour l’opération entrante GET_ACTIVITYS . Pour plus d’informations, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution Oracle E-Business Suite. Vous pouvez éventuellement spécifier les propriétés de liaison lors de la génération du contrat de service et des classes d’assistance. Cela garantit qu’ils sont correctement définis dans le fichier de configuration généré.
Implémentez un service WCF à partir des classes d’interface et d’assistance générées à l’étape 1. La méthode GET_ACTIVITYS de cette classe peut lever une exception pour abandonner la transaction d’interrogation si une erreur se produit lors du traitement des données reçues de l’opération de GET_ACTIVITYS ; sinon, la méthode ne retourne rien. Vous devez attribuer la classe de service WCF comme suit :
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Dans la méthode GET_ACTIVITYS , vous pouvez implémenter directement votre logique d’application. Cette classe se trouve dans OracleEBSBindingService.cs. Ce code dans cet exemple sous-classe la classe OracleEBSBindingService . Dans ce code, le message d’interrogation a reçu et est écrit dans la console.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class PollingService : OracleEBSBindingNamespace.OracleEBSBindingService { public override void GET_ACTIVITYS(GET_ACTIVITYS request) { Console.WriteLine("\nNew Polling Records Received"); Console.WriteLine("*************************************************"); Console.WriteLine("Tx Id\tAccount\tAmount\tProcessed"); for (int i = 0; i < request.OUTRECS.Length; i++) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", request.OUTRECS[i].TID, request.OUTRECS[i].ACCOUNT, request.OUTRECS[i].AMOUNT, request.OUTRECS[i].PROCESSED); } Console.WriteLine("*************************************************"); Console.WriteLine("\nHit <RETURN> to stop polling"); } }
Vous devez implémenter la classe suivante pour éviter de transmettre des informations d’identification dans le cadre de l’URI. Dans la dernière partie de l’application, vous allez instancier cette classe pour transmettre les informations d’identification.
class PollingCredentials : ClientCredentials, IServiceBehavior { public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { bindingParameters.Add(this); } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } protected override ClientCredentials CloneCore() { ClientCredentials clone = new PollingCredentials(); clone.UserName.UserName = this.UserName.UserName; clone.UserName.Password = this.UserName.Password; return clone; } }
Créez un OracleEBSBinding et configurez l’opération d’interrogation en spécifiant les propriétés de liaison. Vous pouvez effectuer cette opération de manière explicite dans le code ou de manière déclarative dans la configuration. Au minimum, vous devez spécifier les propriétés de liaison InboundOperationType, PolledDataAvailableStatement, PollingInput et PollingAction .
OracleEBSBinding binding = new OracleEBSBinding(); binding.InboundOperationType = InboundOperation.Polling; binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM ACCOUNTACTIVITY"; binding.PollingInput = "<GET_ACTIVITYS xmlns='http://schemas.microsoft.com/OracleEBS/2008/05/PackageApis/APPS/ACCOUNT_PKG'><INRECS>OPEN ? FOR SELECT * FROM ACCOUNTACTIVITY</INRECS></GET_ACTIVITYS>"; binding.PollingAction = "PollingPackageApis/APPS/ACCOUNT_PKG/GET_ACTIVITYS"; binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;";
Notes
Notez que la valeur de la propriété de liaison PollingInput contient le message de demande d’appel de la procédure stockée GET_ACTIVITYS en tant qu’opération sortante.
Important
Dans cet exemple, étant donné que vous interrogez une table de base de données, vous n’avez pas besoin de définir le contexte des applications. Toutefois, si vous interrogez une table d’interface, vous devez définir le contexte des applications en spécifiant les propriétés de liaison OracleUserName, OraclePassword et OracleEBSResponsibilityName . Pour plus d’informations sur le contexte d’application, consultez Définir le contexte d’application.
Spécifiez les informations d’identification Oracle E-Business Suite en instanciant la classe PollingCredentials que vous avez créée à l’étape 3.
PollingCredentials credentials = new PollingCredentials(); credentials.UserName.UserName = "<Enter user name here>"; credentials.UserName.Password = "<Enter password here>";
Créez une instance du service WCF créé à l’étape 2.
// create service instance PollingService service = new PollingService();
Créez un instance de System.ServiceModel.ServiceHost à l’aide du service WCF et d’un URI de connexion de base. L’URI de connexion de base ne peut pas contenir l’ID entrant, s’il est spécifié. Vous devez également passer les informations d’identification ici.
// Enable service host Uri[] baseUri = new Uri[] { new Uri("oracleebs://ebs_instance_name") }; ServiceHost serviceHost = new ServiceHost(service, baseUri); serviceHost.Description.Behaviors.Add(credentials);
Ajoutez un point de terminaison de service à l’hôte de service. Pour ce faire :
Utilisez la liaison créée à l’étape 4.
Spécifiez un URI de connexion qui contient des informations d’identification et, si nécessaire, un ID entrant.
Spécifiez le contrat comme « PollingPackageApis_APPS_ACCOUNT_PKG » pour interroger la table d’interface MS_SAMPLE_EMPLOYEE.
// Add service endpoint: be sure to specify PollingPackageApis_APPS_ACCOUNT_PKG as the contract Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name"); serviceHost.AddServiceEndpoint("PollingPackageApis_APPS_ACCOUNT_PKG", binding, ConnectionUri);
Pour recevoir des données d’interrogation, ouvrez l’hôte de service. L’adaptateur retourne des données chaque fois que la requête retourne un jeu de résultats.
// Open the service host to begin polling serviceHost.Open();
Pour mettre fin à l’interrogation, fermez l’hôte de service.
Important
L’adaptateur continue d’interroger jusqu’à ce que l’hôte de service soit fermé.
serviceHost.Close();
Exemple
L’exemple suivant montre une application d’interrogation qui interroge la table de base de données ACCOUNTACTIVITY à l’aide de la procédure stockée GET_ACTIVITYS. La propriété de liaison PollingInput contient le message de demande d’appel de la procédure stockée GET_ACTIVITYS qui lit toutes les données de la table ACCOUNTACTIVITY et l’instruction post-interrogation déplace toutes les données de ACCOUNTACTIVITY vers la table ACTIVITYHISTORY.
Le premier message d’interrogation donne tous les enregistrements de la table ACCOUNTACTIVITY. Les messages d’interrogation suivants ne contiennent pas d’enregistrements, car l’instruction post-sondage supprime les enregistrements. Tant que d’autres données ne seront pas ajoutées à la table ACCOUNTACTIVITY, vous n’obtiendrez aucun message d’interrogation. Vous devez donc remplir à nouveau la table ACCOUNTACTIVITY avec de nouveaux enregistrements. Pour ce faire, exécutez le script more_activity_data.sql fourni avec les exemples.
Après avoir exécuté ce script, l’opération d’interrogation suivante extrait les nouveaux enregistrements insérés dans la table. L’adaptateur continue d’interroger jusqu’à ce que vous fermez l’hôte de service en appuyant sur <RETURN>
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Adapters.OracleEBS;
using Microsoft.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Collections.ObjectModel;
namespace StoredProcPolling_ServiceModel
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PollingService : OracleEBSBindingNamespace.OracleEBSBindingService
{
public override void GET_ACTIVITYS(GET_ACTIVITYS request)
{
Console.WriteLine("\nNew Polling Records Received");
Console.WriteLine("*************************************************");
Console.WriteLine("Tx Id\tAccount\tAmount\tProcessed");
for (int i = 0; i < request.OUTRECS.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}",
request.OUTRECS[i].TID,
request.OUTRECS[i].ACCOUNT,
request.OUTRECS[i].AMOUNT,
request.OUTRECS[i].PROCESSED);
}
Console.WriteLine("*************************************************");
Console.WriteLine("\nHit <RETURN> to stop polling");
}
}
class PollingCredentials : ClientCredentials, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
bindingParameters.Add(this);
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ }
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ }
protected override ClientCredentials CloneCore()
{
ClientCredentials clone = new PollingCredentials();
clone.UserName.UserName = this.UserName.UserName;
clone.UserName.Password = this.UserName.Password;
return clone;
}
}
class Program
{
static void Main(string[] args)
{
ServiceHost serviceHost = null;
try
{
Console.WriteLine("Sample started...");
Console.WriteLine("Press any key to start polling...");
Console.ReadLine();
OracleEBSBinding binding = new OracleEBSBinding();
binding.InboundOperationType = InboundOperation.Polling;
binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM ACCOUNTACTIVITY";
binding.PollingInput = "<GET_ACTIVITYS xmlns='http://schemas.microsoft.com/OracleEBS/2008/05/PackageApis/APPS/ACCOUNT_PKG'><INRECS>OPEN ? FOR SELECT * FROM ACCOUNTACTIVITY</INRECS></GET_ACTIVITYS>";
binding.PollingAction = "PollingPackageApis/APPS/ACCOUNT_PKG/GET_ACTIVITYS";
binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;";
// This URI is used to specify the address for the ServiceEndpoint
// It must contain the InboundId that was used to generate
// the WCF service callback interface
Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");
// This URI is used to initialize the ServiceHost. It cannot contain
// an InboundID; otherwise,an exception is thrown when
// the ServiceHost is initialized.
Uri[] baseUri = new Uri[] { new Uri("oracleebs://ebs_instance_name") };
PollingCredentials credentials = new PollingCredentials();
credentials.UserName.UserName = "<Enter user name here>";
credentials.UserName.Password = "<Enter password here>";
Console.WriteLine("Opening service host...");
PollingService service = new PollingService();
serviceHost = new ServiceHost(service, baseUri);
serviceHost.Description.Behaviors.Add(credentials);
serviceHost.AddServiceEndpoint("PollingPackageApis_APPS_ACCOUNT_PKG", binding, ConnectionUri);
serviceHost.Open();
Console.WriteLine("Service host opened...");
Console.WriteLine("Polling started...");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Exception :" + e.Message);
Console.ReadLine();
/* If there is an error it will be specified in the inner exception */
if (e.InnerException != null)
{
Console.WriteLine("InnerException: " + e.InnerException.Message);
Console.ReadLine();
}
}
finally
{
// IMPORTANT: you must close the ServiceHost to stop polling
if (serviceHost.State == CommunicationState.Opened)
serviceHost.Close();
else
serviceHost.Abort();
}
}
}
}
Voir aussi
Interroger Oracle E-Business Suite à l’aide du modèle de service WCF