一个com+消息队列的例子

  最近在研究com+和消息队列,于是就做了个例子。
  com+和消息队列结构是:
 首先服务器端安装com+和消息队列服务器,而客户端安装com+服务的代理和消息队列服务器。
  com+和消息队列的工作过程是:
 
客户端构造成个消息放到本机的发送消息队列中,客户端发送消息队列负责发该消息发送到com+服务器上,
 com+ 服务器消息队列接受客户端的消息。com+负责侦听消息,如用消息到达,就处理。 

代码如下:
 一.  
 1.服务器端.新建类库项目ServerLibrary2
 
using  System;
using  System.Runtime.InteropServices;
using  System.Messaging;
using  System.EnterpriseServices;
using  System.Windows.Forms;
using  System.IO;
using  System.Web;
using  System.Data.SqlClient;
namespace  ServerLibrary2
{    
    
    
    [GuidAttribute(
"99FCA8DD-3B97-35C3-819B-CECADBFB7DDE")]  //指定这个类的GUID,防止重复注册]
       [InterfaceQueuing]
        
// 使用这一属性使得客户端的函数调用可以被放置到队列中去。
        public interface IQComponent 
        
{
            
void   ComplicatedFunction(int num);
            
        }



    
/// <summary>
    
///  实现 com+ 的事件侦听
    
///  队列组件必须继承ServicedComponent类。同时它还要实现IQComponent接口
    
/// </summary>

   [Transaction(System.EnterpriseServices.TransactionOption.RequiresNew)]
    
public class QCSimpleDemo : ServicedComponent,IQComponent
    
{
        
public QCSimpleDemo()
        
{
       
        }


        
        
public  void    ComplicatedFunction(int num)
            
{
               
//程序处理放在这里            
           string spath;
           
string content;
            
try
            
{
                
               
                System.Data.SqlClient.SqlConnection Sqlcn
=new SqlConnection("server=10.10.10.150;database=test;uid=sa;pwd=sa");
                Sqlcn.Open();
                System.Data.SqlClient.SqlCommand  Sqlcomm
=Sqlcn.CreateCommand();
                Sqlcomm.CommandText
="update com_test set num=num+"+num ; 
                Sqlcomm.ExecuteNonQuery();
                
                Sqlcomm.CommandText
="update com_test1 set num=num-"+num;
                Sqlcomm.ExecuteNonQuery();

                ContextUtil.SetComplete();     
//提交 

                Sqlcn.Close();

                
//写日志文件                
            
                spath
=(@"D:/VsCode/Dservice2/Com_Test/LOG.txt");
                System.IO.StreamWriter sw;                    
                sw
=File.AppendText(spath);                  
                content
=System.DateTime.Now.ToString()+"表com_test中的num增加了"+num.ToString()+"  表com_test1中的num减少了"+num.ToString();
                sw.WriteLine(content);    
                sw.Close();
 
//               MessageBox.Show(num.ToString());

            }

          
            
catch (Exception ex)
            
{
                ContextUtil.SetAbort();         
//取消 
                spath=(@"D:/VsCode/Dservice2/Com_Test/LOG.txt");
                System.IO.StreamWriter sw;                    
                sw
=File.AppendText(spath);                  
                content
=System.DateTime.Now.ToString()+"操作错误;原因"+ex.Message;
                sw.WriteLine(content);    
                sw.Close();
            
            }

             
           
           }


            }

}


 2,  用 sn -k "路径+文件名"  生成强类型的程序集,在AssemblyInfo.cs 文件中加[assembly: AssemblyKeyFile(@"c:/key.snk")]

 2. 生成 Serverlibrary2.dll
 
 3. 注册 regsvcs serverlibrary2.dll.
 
  说明:机器上必须安装消息队列服务器。

二. 客户端 
 
   1.客户端代码
  try
   {
      //用接口调用
    ServerLibrary2.IQComponent IQC= (IQComponent)Marshal.BindToMoniker("queue:/new:ServerLibrary2.QCSimpleDemo");
                int num=0;

    num=int.Parse(this.textBox2.Text);
      
    IQC.ComplicatedFunction(num);

    Marshal.ReleaseComObject(IQC);

                MessageBox.Show("转帐成功!!");
   }

   catch (Exception ex)
   {
    MessageBox.Show(ex.Message);
   
   }
  
  说明:Marshal.BindToMoniker 是System.Runtime.InteropServices下的一个方法。它获取一个指针。
      Marshal.ReleaseComObject(IQC); 释放对象引用数  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然!以下是一个使用 Java 语言和 RabbitMQ 客户端库实现的例子: 首先,确保你已经安装了 RabbitMQ,并在 Maven 或 Gradle 中添加了合适的 RabbitMQ 客户端库依赖。 ```java import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class RabbitMQExample { private final static String QUEUE_NAME = "my_queue"; public static void main(String[] args) throws Exception { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); // 创建连接 Connection connection = factory.newConnection(); // 创建信道 Channel channel = connection.createChannel(); // 声明队列 boolean durable = true; // 设置队列为持久化 channel.queueDeclare(QUEUE_NAME, durable, false, false, null); // 发布消息 String message = "Hello, RabbitMQ!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); // 关闭信道和连接 channel.close(); connection.close(); } } ``` 这个例子演示了如何创建一个持久化队列,并发送一条消息到该队列中。在示例中,我们使用了 RabbitMQ 的 Java 客户端库来创建连接、创建信道、声明队列和发布消息。设置队列的 durable 属性为 true,确保队列是持久化的。 注意:在实际使用中,建议将连接和信道的创建放在 try-catch-finally 块中,以确保在使用完毕后正确关闭连接。 希望这个例子能帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值