C# RabbitMQClient: Productor de mensajes básico (con WSO2) usando .NET/C# en VS2012

RabbitMQ es un broker de mensajería (ver entrada RabbitMQ primeros pasos con colas de mensajería). Vamos a tratar de usar el cliente para .NET en  un proyecto con MS Visual Studio 2012 para conectar a un broker de mensajería WSO2 (ver WSO2: Broker de mensajería IoT (WSO2 IoTS))

Para instalar el paquete RabbitMQ.Client en VS2012  es recomendable usar el gestor de paquetes incorporado NuGet (RabbitMQ.Client 4.1.3) ejecutando el siguiente comando:

PM> Install-Package RabbitMQ.Client -Version 4.1.3

Para instalar el paquete previamente hemos creado un nuevo proyecto C# para consola.

Importamos la librería con la línea


using RabbitMQ.Client;

La clase ConnectionFactory construye instancias de IConnection y permite configurar el nombre el host, el virtual host y las credenciales de acceso. En vez usar las propiedades  factory.UserName, factory.Password… Compactamos la cadena de conexión en una sola línea usando la propiedad URI.


ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://admin:admin@localhost:5672/carbon";

WSO2 usa el puerto TCP 5672 como broker de mensajería con el protocolo AMQP, podemos cambiar en cualquier momento el puerto editando el fichero C:\wso2mb-3.1.0\repository\conf\broker.xml.


El último parámetro del URI es el VHost, en WSO2 podemos encontrar información del VHost en C:\wso2mb-3.1.0\repository\conf\advanced\qpid-virtualhosts.xml. El VHost por defecto se llama “carbon”. Dentro del fichero también encontramos información sobre el exchange y queue (“amq.direct" is the default exchange that should be used for queue creation.).


IConnection conn = factory.CreateConnection();

IModel channel = conn.CreateModel();
channel.ExchangeDeclare("amq.direct","direct",true);

Le pasamos la conexión a la instancia IConnection empleado para crear nuevos canales.  La llamada a CreateConnection produce una excepción si el servidor WSO2 está parado por ejemplo.

El interface IModel se usa para el modelo AMQP le pasamos tres parámetros al método ExchangeDeclare. 

  • exchangeName: Un productor nunca envía directamente los mensajes directamente a la cola, en su lugar los envía a un exchange.

 

  • type: Debe ser uno de los siguientes “direct” (los mensajes van sólo a la cola especificada en routingKey), “topic”, “headers” o “fanout” (broadcast a todas las colas).
  • El tercer parámetro “durable” a true mantiene la cola persistente en el servidor.

La última parte es publicar el mensaje usando el método BasicPublish.

 var message = GetMessage(args);
 var body = Encoding.UTF8.GetBytes(message);
 
 channel.BasicPublish(exchange: "amq.direct",
 routingKey: "test-queue",
 basicProperties: null,
 body: body);

 channel.Close();
 conn.Close();

Código completo

Crear la cola en “test-queue” en WSO2

En el servidor WSO2 creamos una cola llamada “test-queue” a media que ejecutemos nuestro cliente publicador irá aumentando el contador de mensajes.

 

Referencias

Anuncios

C# MultipleForms: Aplicación básica compuesta de varias ventanas

Es raro que una aplicación se base en una sola ventana, la mayoría cargan otros formularios, vistas, grids partiendo del form inicial.  Hasta ahora hemos visto como crear un form al vuelo en tiempo de ejecución colocando los controles de la ventana secundaria mediante programación (Ver C# Creación de Formularios y controles básicos). Esto es inviable en una aplicación medianamente compleja (posicionar los controles unos respecto a otros, el aspecto y un montón de atributos a tomar en cuenta de cada control). Lo mejor es añadir un item con la opción de menú Project > Add > New Item y añadir un nuevo form que cargaremos desde el principal con un botón.

csharp1

El IDE genera todos los archivos necesarios y se genera un Form1.cs donde podemos definir el aspecto de la nueva ventana en la pestaña Design.

Al evento de click del botón del forma principal añadimos el código para carga el form nuevo:


void Button1Click(object sender, EventArgs e)
{
Form1 secondForm;

secondForm=new Form1();

//se puede poner todo en una linea
//Form1 secondForm = new Form1();

secondForm.Show();

}

El momento de cargar Form1 vamos a aprovechar el constructor de la clase para alimentar un control DataGridView con el contenido de una tabla creada con SQLite (aprovechamos la BD creada C# SQLiteBook: Catalogo de libros con SQLite (I))

csharp2

 

 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 08/09/2016
  * Time: 19:02
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 using System.Drawing;
 using System.Windows.Forms;
 
 using System.Data.SQLite;
 using System.IO;
 
 
 
 namespace MultipleForms
 {
     /// <summary>
     /// Description of Form1.
     /// </summary>
     public partial class Form1 : Form
     {
         
         
         public Form1()
         {                        
             InitializeComponent();
             
             //dataGridView1.Rows.Add(new object[] { "Uno", "Dos" });                        
             SQLiteConnection conexion; //Clase para establecer conexión inicial
             SQLiteCommand cmd; //Clase para ejecutar sentencias
                         
             try
             {
             
                 conexion = new SQLiteConnection
                     ("Data Source=ejemplo01.sqlite;Version=3;New=True;Compress=True;");
                 
                 conexion.Open();
                 
                 string consulta = "select * from books";
                 
                 cmd = new SQLiteCommand(consulta, conexion);
                 SQLiteDataReader datos = cmd.ExecuteReader();
                 
                 //Console.WriteLine("Nº campos registros: "+datos.FieldCount);
                 
                 if (datos.HasRows) 
                 {                    
                     //MessageBox.Show("La consulta retorna registros","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
                 }
                 else
                 {
                     MessageBox.Show("La consulta no retorna registros","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);                    
                 }
                 
                 while (datos.Read())
                 {
                     DataGridViewRow row = new DataGridViewRow();            
                     
                     string name = Convert.ToString(datos[0]);
                     string autor = Convert.ToString(datos[1]);
                     string genre = Convert.ToString(datos[2]);
                     string summary = Convert.ToString(datos[3]);
                     
                     row.CreateCells(dataGridView1);            
                     row.Cells[0].Value=name;
                     row.Cells[1].Value=name;
                     row.Cells[2].Value=genre;
                     row.Cells[3].Value=summary;
                     this.dataGridView1.Rows.Add(row);
                 }
                 
                 conexion.Close();
             }
             catch (Exception e)
             {                
                 MessageBox.Show("Error" + e.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);                                    
             }
             
         }                
     }
 } 

 

C# SQLiteBook: Catalogo de libros con SQLite (II)

Partiendo del post C# SQLiteBook: Catalogo de libros con SQLite (I) donde se creo una BD con SQLiteConnection  para guardar en la tabla books registros de un catálogo de libros usando  SQLiteCommand y sentencias INSERT SQL.

Ahora vamos a ver como realizar consultas SELECT sobre la misma tabla para leer los registros.

La primera parte del programa es igual que el anterior, consiste en usar el objeto  SQLiteConnection (pasandole la cadena de conexión al constructor) para abrir la conexión con la BD usando el método Open().

Luego utiliza el objeto  SQLiteCommand como antes pero para lanzar una consulta SELECT que retorne todos los registros de la tabla books.

El resultado de la consulta se almacena en una variable que contiene una instancia de la clase  SQLiteDataReader (ojo que no llama a constructor sino que se crea la instancia directamente usando la llamada  ExecuteReader de SQLiteCommand). Podemos consultar la sintaxis en MSDN Clase SqlDataReader.

A continuación vamos llamando al método Read() para ir leyendo de forma secuencial registros de la consulta. El método Read avanza el lector al siguiente registro, retorna TRUE si existen más registros. Podemos obtener los valores del registro que están almacenados en un Array usando índices numéricos o el nombre de columna (más adecuado), en el ejemplo se usan índices numéricos y convierte los valores a cadena usando el objeto Convert.

Enlaces relacionados:


 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 29/08/2016
  * Time: 14:47
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 using System.Data.SQLite;
 
 namespace SQLiteBookReader
 {
     class Program
     {
         public static void Main(string[] args)
         {
             try {
                 SQLiteConnection conexion = new SQLiteConnection 
                     ("Data Source=ejemplo01.sqlite;Version=3;New=False;Compress=True;");            
             
                  conexion.Open();
                  
                  // Lanzamos la consulta y preparamos la estructura para leer datos             
                 string consulta = "select * from books";
                 SQLiteCommand cmd = new SQLiteCommand(consulta, conexion);
                 SQLiteDataReader datos = cmd.ExecuteReader();
                 // Leemos los datos de forma repetitiva 
 
                 Console.WriteLine("Nº campos registros: "+datos.FieldCount);
                 
                 if (datos.HasRows) 
                 {
                     Console.WriteLine("La consulta retorna registros");
                 }
                 
                 while (datos.Read())
                 {
                     // Usamos objeto Convert 
                     string name = Convert.ToString(datos[0]);
                     string autor = Convert.ToString(datos[1]);
                     string genre = Convert.ToString(datos[2]);
                     string summary = Convert.ToString(datos[3]);
 
                     // Y los mostramos 
                     System.Console.WriteLine("Name: {0}, Autor: {1}, Genre: {2}, Summary: {3}",
                         name, autor, genre, summary);
                 }
                 // Finalmente, cerramos la conexion 
                 conexion.Close();
             
             } catch (Exception e) {
                     Console.WriteLine("{0} Exception caught.", e);
                     Console.Write("Press any key to exit . . . ");
                     Console.ReadKey(true);
                     return;
             }            
             
             Console.Write("Press any key to continue . . . ");
             Console.ReadKey(true);
         }
     }
 }

 

 

 

C# SQLiteBook: Catalogo de libros con SQLite (I)

SQLite es un sistema de gestión de base de datos empotrada en la propia aplicación mediante librerías, esto lo convierte en altamente portable entre máquinas ya que no dependemos de servidores de bases de datos externos y las tablas se guardan en ficheros (ver más en SQLite Base de datos embebida para C).

En SharpDevelop para poder usar SQLite debemos añadir el paquete primero. En el menú seleccionamos Project > Manage Packages.

sharp11

Una vez instalado ya podemos incluirlo en nuestra aplicación:

using System;
using System.Data.SQLite;
using System.IO; 

Antes de poder empezar a trabajar con la BD (Base de Datos) debemos conectar con ella usando el objeto  SQLiteConnection  en una variable. Cuando llamamos al constructor debemos proporcionarle la cadena de conexión con el fichero que contiene la BD entre otros parámetros, después de instanciar el objeto en la variable que contiene la conexión llamamos al método Open() para comenzar a trabajar con la BD.


SQLiteConnection conexion; conexion = new SQLiteConnection

("Data Source=ejemplo01.sqlite;Version=3;New=True;Compress=True;");

conexion.Open();

En la mayoría de los casos trabajaremos sobre una BD ya creada pero si es la primera que vez que ejecutamos la aplicación normalmente el fichero con la BD no existirá y debemos ejecutar sentencias SQL adicionales para crear las tablas usando la clase SQLiteCommand.

 if (!File.Exists("ejemplo01.sqlite"))
             {
                 string creacion = "create table books ("
                 + " title varchar(50),autor varchar(50),genre varchar(50), summary varchar(50));";
                 cmd = new SQLiteCommand(creacion, conexion);
                 cmd.ExecuteNonQuery();
             }

A continuación dejamos el código completo con las sentencias insert en la BD con los datos introducidos por el usuario (usando la variable cmd de tipo SQLiteCommand con sentencias Insert SQL).

Cuando acabamos de trabajar con la BD debemos cerrar la conexión de forma explicita con el método Close() de  SQLiteCommand .

 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 28/08/2016
  * Time: 4:09
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 using System.Data.SQLite;
 using System.IO;
 
 namespace SQLiteBook
 {
     class Program
     {
         public static void Main(string[] args)
         {
             SQLiteConnection conexion; //Clase para establecer conexión inicial
             SQLiteCommand cmd; //Clase para ejecutar sentencias
             
             try
             {
             
                 conexion = new SQLiteConnection
                     ("Data Source=ejemplo01.sqlite;Version=3;New=True;Compress=True;");
                 conexion.Open();    
             
                 if (!File.Exists("ejemplo01.sqlite"))
                 {
                     string creacion = "create table books ("
                         + " title varchar(50),autor varchar(50),genre varchar(50), summary varchar(50));";
                     cmd = new SQLiteCommand(creacion, conexion);
                     cmd.ExecuteNonQuery();
                 }
             
                 string line;
                 string title = "",
                    autor = "",
                    genre = "",
                    summary = "";
                 do
                 {
                     Console.Write("Title: ");
                     line = Console.ReadLine();
                     if (line != null)
                         title = line;
 
                     Console.Write("Autor: ");
                     line = Console.ReadLine();
                     if (line != null)
                         autor = line;
 
                     Console.Write("Genre: ");
                     line = Console.ReadLine();
                     if (line != null)
                         genre = line;
 
                     Console.Write("Summary: ");
                     line = Console.ReadLine();
                     if (line != null)
                         summary = line;
 
                     string insercion = "insert into books values ('" + title +
                         "', '" + autor + "','" + genre + "', '" + summary + "')";
 
                     cmd = new SQLiteCommand(insercion, conexion);
                     cmd.ExecuteNonQuery();
 
                     Console.WriteLine("Insert OK!");
                 }
                 while (line != null);
             
                 conexion.Close();
              }
             catch (Exception e)
             {
                 Console.WriteLine("Error" + e.Message);
             }
             
             Console.Write("Press any key to continue . . . ");
             Console.ReadKey(true);
         }
     }
 } 

 

Artículos relacionados:

C# Creación de Formularios y controles básicos

Este ejercicio consiste en crear una ventana de registro de correo electrónico y clave por ejemplo, cuando pulsamos un botón se abrirá un nuevo formulario donde se mostraran los datos del formulario inicial con etiquetas de texto.

sharp9

 

sharp10

Si pulsamos el botón de cancelar se cerrara la aplicación.

Lo primero es definir la programación asociada a los eventos de cada botón:

  • ShowBtnClick(): Esta función captura el evento de pulsación del botón Show. Creamos una instancia de la clase Form2 que hemos definido más abajo (Form2 hereda de clase Form de System). Al constructor de la clase Form2 le debemos pasar el correo electrónico y la clave como parámetros. Después usamos el método Show para mostrar el nuevo formulario al usuario.
  • CancelBtnClick: Este evento cierra ventana de la aplicación usando Close().

Más abajo creamos la clase Form2 heredada de Form y definimos el método del constructor para crear dos etiquetas de texto para mostrar las cadena pasadas al constructor.

 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 27/08/2016
  * Time: 18:29
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Windows.Forms;
 
 namespace FormRegistroBasico
 {
     /// <summary>
     /// Description of MainForm.
     /// </summary>
     public partial class MainForm : Form
     {
         public MainForm()
         {
             //
             // The InitializeComponent() call is required for Windows Forms designer support.
             //
             InitializeComponent();
             
             //
             // TODO: Add constructor code after the InitializeComponent() call.
             //
         }
         
         //Evento pulsación boton para abrir otro form 
         void ShowBtnClick(object sender, EventArgs e)
         {
             //Creamos una instancia del la clase Form2
             Form2 frm = new Form2(emailtextbox.Text,clavetextbox.Text);
             frm.Show();//muestra el nuevo formulario al usuario
         }
         
         //Evento cancelar cierra ventana
         void CancelBtnClick(object sender, EventArgs e)
         {
             this.Close();
         }
         
             
     }
     
     //https://msdn.microsoft.com/en-us/library/system.windows.forms.form(v=vs.110).aspx
     // Creamos el formulario que se mostrará cuando pulsemos el botón Show.
     // Esta clase Form2 hereda de la estandar Form de System    
     public class Form2: Form    
     {
         //Constructor de clase
         public Form2(string email,string clave)
         {
             Text = "Datos registro"; //Titulo de la ventana
             //Creamos dos instalacias de clase tipo Label
             Label label1 = new Label();
             Label label2 = new Label();
             
             label1.Text=email;
             label1.Size = new Size (104, 16);
             label1.Location = new Point(48,48);
             
             label2.Text=clave;
             label2.Size = new Size (104, 16);
             label2.Location = new Point(48,128);
             
             Controls.Add(label1);
             Controls.Add(label2);            
         }                
     }
 } 

 

C# Tabla multiplicación por consola de un número seleccionado por el usuario (bucle for)

La construccion de un bucle for es igual que en lenguaje C, para ponerlo en practica mediante un sencillo ejercicio debemos hacer lo siguiente: Leer un número introducido por el usuario y convertirlo en entero, a continuación mostrar por pantalla la tabla de multiplicación.

Ejemplo:
Enter the number: 5
Expected Output:
5 * 0 = 0
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
….
5 * 10 = 50

MSDN for (Referencia de C#)

 /*
  * Created by SharpDevelop.
  * User: i.landajuela
  * Date: 27/08/2016
  * Time: 18:07
  * 
  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  */
 using System;
 
 namespace ConsoleMultiTable
 {
     class Program
     {
         public static void Main(string[] args)
         {
             int number=0;
             
             Console.WriteLine("Introduce un número:");
             number=int.Parse(Console.ReadLine());
             
             for(int i=0; i<=10;i++)
             {
                 Console.WriteLine(number+"x"+i+"="+(i*number));
             }
             
             
             Console.Write("Press any key to continue . . . ");
             Console.ReadKey(true);
         }
     }
 }