Interroger Oracle E-Business Suite à l’aide de l’instruction SELECT 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 d’une instruction SELECT pour interroger en continu les tables d’interface, les vues d’interface, les tables et les vues dans Oracle E-Business Suite. Vous pouvez spécifier une instruction SELECT en tant qu’instruction d’interrogation que l’adaptateur exécute régulièrement pour interroger Oracle E-Business Suite. Vous pouvez également spécifier un bloc de code PL/SQL post-interrogation que l’adaptateur exécute après l’exécution de l’instruction d’interrogation.
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 Suite
Le tableau suivant récapitule les propriétés de liaison de l’adaptateur Oracle E-Business que vous utilisez pour configurer l’adaptateur afin de 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. Uniquement si un enregistrement est disponible, l’instruction SELECT que vous spécifiez 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 instruction SELECT, vous devez spécifier une instruction SELECT pour cette propriété de liaison. 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 pour interroger la base de données Oracle, lisez plus loin.
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 d’instructions SELECT, vous interrogez la table d’interface MS_SAMPLE_EMPLOYEE dans l’application Bibliothèque d’objets d’application . Cette table est créée lorsque vous exécutez le script create_apps_artifacts.sql fourni avec les exemples pour créer ces objets dans Oracle E-Business Suite.
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 d’interface interrogée (MS_SAMPLE_EMPLOYEE) contient des données. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :
SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE
Cela garantit que l’adaptateur exécute l’instruction d’interrogation uniquement lorsque la table d’interface MS_SAMPLE_EMPLOYEE contient des enregistrements.
Spécifiez une instruction SELECT pour la propriété de liaison PollingInput . Cette instruction récupère toutes les lignes de la table d’interface MS_SAMPLE_EMPLOYEE. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :
SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE
Notes
Pour plus d’informations sur la clause FOR UPDATE utilisée dans l’instruction SELECT, consultez Recevoir des messages d’interrogation modifiés de données à partir d’Oracle E-Business Suite.
Spécifiez une instruction DELETE dans le cadre de la propriété de liaison PostPollStatement . Cette instruction supprime toutes les données de MS_SAMPLE_EMPLOYEE table d’interface. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :
DELETE FROM MS_SAMPLE_EMPLOYEE
Après cela, la prochaine fois que l’instruction spécifiée pour PollingInput sera exécutée, elle n’extrairea aucune donnée.
Tant que des données supplémentaires ne seront pas ajoutées à la table d’interface MS_SAMPLE_EMPLOYEE, vous ne recevrez aucun message d’interrogation. Vous devez donc remplir à nouveau la table d’interface MS_SAMPLE_EMPLOYEE avec de nouveaux enregistrements. Pour ce faire, exécutez le script insert_apps_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 une table d’interface à l’aide de l’adaptateur Oracle E-Business avec le modèle de service WCF, vous devez :
Générez un contrat de service WCF (interface) pour l’opération Poll sur la table d’interface MS_SAMPLE_EMPLOYEE. 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 d’interface MS_SAMPLE_EMPLOYEE. Un script pour générer la table est fourni avec les exemples. Pour plus d’informations sur les exemples, consultez Exemples pour l’adaptateur Oracle EBS. Un exemple , SelectPolling_ServiceModel, basé sur cette rubrique, est également fourni avec les exemples d’adaptateur 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 d’interrogation . 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 Poll sur MS_SAMPLE_EMPLOYEE table d’interface.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/", ConfigurationName="InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE")]
public interface InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE_EMPLOYEE) of message Poll
// does not match the default value (https://schemas.microsoft.com/OracleEBS/)
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE")]
void Poll(Poll request);
}
Contrats de message
Voici le contrat de message pour l’opération d’interrogation sur MS_SAMPLE_EMPLOYEE table d’interface.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="Poll", WrapperNamespace="http://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE" +
"_EMPLOYEE", IsWrapped=true)]
public partial class Poll {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE" +
"_EMPLOYEE", Order=0)]
public schemas.microsoft.com.OracleEBS._2008._05.TableViewRecord.APPS.MS_SAMPLE_EMPLOYEE.SelectRecord[] DATA;
public Poll() {
}
public Poll(schemas.microsoft.com.OracleEBS._2008._05.TableViewRecord.APPS.MS_SAMPLE_EMPLOYEE.SelectRecord[] DATA) {
this.DATA = DATA;
}
}
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 d’interrogation 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 : InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE_EMPLOYEE) of message Poll
// does not match the default value (https://schemas.microsoft.com/OracleEBS/)
public virtual void Poll(Poll request) {
throw new System.NotImplementedException("The method or operation is not implemented.");
}
}
}
Réception de messages entrants pour l’opération d’interrogation à l’aide d’une instruction SELECT
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 instruction SELECT
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 Poll sur la table d’interface MS_SAMPLE_EMPLOYEE. 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 Poll 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 Poll ; 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 Poll , vous pouvez implémenter votre logique d’application directement. 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 Poll(Poll request) { Console.WriteLine("\nNew Polling Records Received"); Console.WriteLine("*************************************************"); Console.WriteLine("Emp No\tName\tDesignation\tSalary"); for (int i = 0; i < request.DATA.Length; i++) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", request.DATA[i].EMP_NO, request.DATA[i].NAME, request.DATA[i].DESIGNATION, request.DATA[i].SALARY); } 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 le faire 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 MS_SAMPLE_EMPLOYEE"; binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE"; binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE"; binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";
Étant donné que vous interrogez une table d’interface, vous devez également définir le contexte des applications. Pour plus d’informations sur le contexte de l’application et les propriétés de liaison requises pour définir le contexte de l’application, consultez Définir le contexte de l’application.
binding.OracleUserName = "myOracleEBSUserName"; binding.OraclePassword = "myOracleEBSPassword"; binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";
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 transmettre 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 de trafic entrant.
Spécifiez le contrat en tant que « InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE » pour interroger la table d’interface MS_SAMPLE_EMPLOYEE.
// Add service endpoint: be sure to specify InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE as the contract Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name"); serviceHost.AddServiceEndpoint("InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE", 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 à 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 d’interface MS_SAMPLE_EMPLOYEE. La propriété PollingInput contient l’instruction select qui lit toutes les données de la table MS_SAMPLE_EMPLOYEE et l’instruction post-interrogation supprime toutes les données de la même table. Le premier message d’interrogation donne tous les enregistrements de la table d’interface MS_SAMPLE_EMPLOYEE. Les messages d’interrogation suivants ne contiennent pas d’enregistrements, car l’instruction post-interrogation supprime les enregistrements. Tant que des données supplémentaires ne seront pas ajoutées à la table d’interface MS_SAMPLE_EMPLOYEE, vous n’obtiendrez aucun message d’interrogation. Vous devez donc remplir à nouveau la table d’interface MS_SAMPLE_EMPLOYEE avec de nouveaux enregistrements. Pour ce faire, exécutez le script insert_apps_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 continuera à interroger jusqu’à ce que vous fermiez 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 SelectPolling_ServiceModel
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PollingService : OracleEBSBindingNamespace.OracleEBSBindingService
{
public override void Poll(Poll request)
{
Console.WriteLine("\nNew Polling Records Received");
Console.WriteLine("*************************************************");
Console.WriteLine("Emp No\tName\tDesignation\tSalary");
for (int i = 0; i < request.DATA.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}",
request.DATA[i].EMP_NO,
request.DATA[i].NAME,
request.DATA[i].DESIGNATION,
request.DATA[i].SALARY);
}
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 MS_SAMPLE_EMPLOYEE";
binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE";
binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE";
binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";
binding.OracleUserName = "myOracleEBSUserName";
binding.OraclePassword = "myOracleEBSPassword";
binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";
// 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("InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE", 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