为了简化MQ调用,写了个StompClient的包装类,可以供需要的参考:

unit FStompClient;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
StompClient,StompTypes; type
TMQLogEvent = procedure (log: String) of object;
TMQMessageEvent = procedure (msgTime: TDateTime; msgBody: String) of object;
type
TMQStompClient = class(TInterfacedObject, IStompClientListener)
private
FOnMQLogEvent: TMQLogEvent;
FOnMQMsgEvent: TMQMessageEvent;
FTR: string;
stomp: IStompClient;
th: TStompClientListener;
public
constructor Create;
destructor Destroy; override;
procedure AbortTransaction(tr: String);
procedure BeginTransaction(tr: String);
procedure CommitTransaction(tr: String);
function ConnectToMQ(Host: String; Port: Integer = ; ClientID: String
= 'Garfield'; User: String = ''; Password: String = ''): Boolean;
procedure DisconnectMQ;
procedure DurableSubscribe(subName, clientID: String); overload;
procedure OnMessage(StompClient: IStompClient; StompFrame: IStompFrame; var
StompListening: Boolean);
procedure OnStopListen(StompClient: IStompClient);
procedure SendPub(subName, body: String; Persistent: Boolean = True);
procedure Subscribe(subName: String); overload;
procedure Unsubscribe(subName: String);
published
property OnMQLogEvent: TMQLogEvent read FOnMQLogEvent write FOnMQLogEvent;
property OnMQMsgEvent: TMQMessageEvent read FOnMQMsgEvent write
FOnMQMsgEvent;
end; implementation { TMQStompClient } {
******************************** TMQStompClient ********************************
}
constructor TMQStompClient.Create;
begin
stomp := TStompClient.Create;
end; destructor TMQStompClient.Destroy;
begin
if assigned(th) then
begin
th.StopListening;
//By garfield
//FreeAndNil(th);
end;
stomp := nil;
end; procedure TMQStompClient.AbortTransaction(tr: String);
begin
stomp.AbortTransaction(tr);
FTR:='';
end; procedure TMQStompClient.BeginTransaction(tr: String);
begin
FTR:=tr;
stomp.BeginTransaction(tr);
end; procedure TMQStompClient.CommitTransaction(tr: String);
begin
stomp.CommitTransaction(tr);
FTR:='';
end; function TMQStompClient.ConnectToMQ(Host: String; Port: Integer = ;
ClientID: String = 'Garfield'; User: String = ''; Password: String = ''):
Boolean;
begin
stomp.SetUserName(User);
stomp.SetPassword(Password);
try
stomp.Connect(Host, Port, ClientID, TStompAcceptProtocol.STOMP_Version__);
th := TStompClientListener.Create(stomp, Self); if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('连接消息服务器成功!');
Result:=True;
except
on E: Exception do
begin
Result:=False;
if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('连接消息服务器失败!错误信息:'+E.ClassName + sLineBreak + E.Message);
end;
end;
end; procedure TMQStompClient.DisconnectMQ;
begin
th.StopListening;
//By garfield
//FreeAndNil(th);
stomp.Disconnect; if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('与消息服务器成功断开!');
end; procedure TMQStompClient.DurableSubscribe(subName, clientID: String);
begin
stomp.Subscribe(subName, amAuto,
StompUtils.NewHeaders.Add(TStompHeaders.NewDurableSubscriptionHeader(clientID))); if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('订阅持久化主题成功:'+subName+' clientID:'+clientID);
end; procedure TMQStompClient.OnMessage(StompClient: IStompClient; StompFrame:
IStompFrame; var StompListening: Boolean);
begin
TThread.Synchronize(nil,
procedure
begin
if StompFrame.GetBody.Length<> then
begin
if Assigned(FOnMQMsgEvent) then
FOnMQMsgEvent(Now,StompFrame.GetBody);
end;
end);
end; procedure TMQStompClient.OnStopListen(StompClient: IStompClient);
begin
if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('监听停止');
end; procedure TMQStompClient.SendPub(subName, body: String; Persistent: Boolean =
True);
var
h: IStompHeaders;
begin
h := StompUtils.NewHeaders;
if Persistent then
h.Add(TStompHeaders.NewPersistentHeader(true));
if FTR <> '' then
stomp.Send(subName, body, FTR, h)
else
stomp.Send(subName, body, h);
end; procedure TMQStompClient.Subscribe(subName: String);
begin
stomp.Subscribe(subName);
if Assigned(FOnMQLogEvent) then
FOnMQLogEvent('订阅主题成功:'+subName);
end; procedure TMQStompClient.Unsubscribe(subName: String);
begin
stomp.Unsubscribe(subName);
end; end.

调用起来就比较简单了:

unit FfrmMain;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,FStompClient, Vcl.StdCtrls, Vcl.ExtCtrls,
RzPanel; type
TfrmMain = class(TForm)
memLog: TMemo;
RzPanel1: TRzPanel;
btnConnect: TButton;
btnDisconnect: TButton;
btnSub: TButton;
chkDurable: TCheckBox;
edtSub: TLabeledEdit;
edtHost: TLabeledEdit;
edtPort: TLabeledEdit;
edtClientID: TLabeledEdit;
btnSend: TButton;
edtContent: TLabeledEdit;
procedure FormCreate(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnSubClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
aClient:TMQStompClient;
public
{ Public declarations }
procedure OnLog(log: String);
procedure OnMsg(msgTime: TDateTime; msgBody: String);
end; var
frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.btnConnectClick(Sender: TObject);
begin
aClient.ConnectToMQ(edtHost.Text,StrToInt(edtPort.Text));
end; procedure TfrmMain.btnSendClick(Sender: TObject);
begin
aClient.SendPub(edtSub.Text,edtContent.Text,chkDurable.Checked);
end; procedure TfrmMain.btnSubClick(Sender: TObject);
begin
if chkDurable.Checked then
aClient.DurableSubscribe(edtSub.Text,edtClientID.Text)
else
aClient.Subscribe(edtSub.Text);
end; procedure TfrmMain.FormCreate(Sender: TObject);
begin
aClient:=TMQStompClient.Create;
aClient.OnMQLogEvent:=OnLog;
aClient.OnMQMsgEvent:=OnMsg;
end; procedure TfrmMain.OnLog(log: String);
begin
memLog.Lines.Add(log);
end; procedure TfrmMain.OnMsg(msgTime: TDateTime; msgBody: String);
begin
memLog.Lines.Add('收到消息:'+FormatDateTime('yyyy-mm-dd hh:mm:ss',msgTime)+' '+msgBody);
end; end.

窗口定义:

object frmMain: TfrmMain
Left =
Top =
Caption = 'StompClientTest'
ClientHeight =
ClientWidth =
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
PixelsPerInch =
TextHeight =
object memLog: TMemo
Left =
Top =
Width =
Height =
Align = alClient
ScrollBars = ssBoth
TabOrder =
end
object RzPanel1: TRzPanel
Left =
Top =
Width =
Height =
Align = alBottom
TabOrder =
object btnConnect: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = btnConnectClick
end
object btnDisconnect: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
end
object btnSub: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = btnSubClick
end
object chkDurable: TCheckBox
Left =
Top =
Width =
Height =
Caption = ###
TabOrder =
end
object edtSub: TLabeledEdit
Left =
Top =
Width =
Height =
EditLabel.Width =
EditLabel.Height =
EditLabel.Caption = ##
LabelPosition = lpLeft
TabOrder =
Text = '/topic/hello'
end
object edtHost: TLabeledEdit
Left =
Top =
Width =
Height =
EditLabel.Width =
EditLabel.Height =
EditLabel.Caption = 'Host'
LabelPosition = lpLeft
TabOrder =
Text = 'localhost'
end
object edtPort: TLabeledEdit
Left =
Top =
Width =
Height =
EditLabel.Width =
EditLabel.Height =
EditLabel.Caption = 'Port'
LabelPosition = lpLeft
TabOrder =
Text = ''
end
object edtClientID: TLabeledEdit
Left =
Top =
Width =
Height =
EditLabel.Width =
EditLabel.Height =
EditLabel.Caption = 'ClientID'
LabelPosition = lpLeft
TabOrder =
Text = 'garfield'
end
object btnSend: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = btnSendClick
end
object edtContent: TLabeledEdit
Left =
Top =
Width =
Height =
EditLabel.Width =
EditLabel.Height =
EditLabel.Caption = ##
LabelPosition = lpLeft
TabOrder =
Text = #######
end
end
end

StompClient的包装类的更多相关文章

  1. Integer与int的区别(包装类和基本数据类型的区别)

    1. 默认值 int默认值为0,Integer的默认值为null.推论:Integer既可以表示null又可以表示0 2. 包装类中提供了该类型相关的很多算法操作方法 如把十进制装换为2进制(toBi ...

  2. final和包装类

    ==================================================================================================== ...

  3. java之数据结构之链表及包装类、包

    链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...

  4. 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题

    包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...

  5. Java基础知识点1:基本类型包装类

    基本类型的包装类 简介 通常来说我们在程序中经常会使用元类型,比如 int data = 1; float data = 2.1F; 但是在有些场景中不能直接使用元类型,比如如果我们想要建立一个int ...

  6. Java学习_int和Integer的区别+包装类

    1.Java 中的数据类型分为基本数据类型和引用数据类型 int是基本数据类型,Integer是引用数据类型: Ingeter是int的包装类,int的初值为0,Ingeter的初值为null. 2. ...

  7. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

  8. java : 包装类 缓冲机制的使用(转载)

    摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...

  9. Java学习笔记 05 数据包装类

    一.包装类 综述 >>java.lang包中的Integer类.Long类和Short类,分别将基本数据类型int.long和short封装成一个类.这些类都是Number的子类. Int ...

随机推荐

  1. 领扣-120 三角形最小路径和 Triangle MD

    三角形最小路径和 Triangle 数组 动态规划 问题 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [2], [3,4], [6,5,7], ...

  2. Spring Boot集成持久化Quartz定时任务管理和界面展示

    本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...

  3. Java-JUC(三):原子性变量与CAS算法

    原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...

  4. 【mybatis】多次查询缓存的问题

    转自:http://cheng-xinwei.iteye.com/blog/2021700?utm_source=tuicool&utm_medium=referral 最近在使用mybati ...

  5. C# list与数组互相转换

    1,从System.String[]转到List<System.String>System.String[] str={"str","string" ...

  6. Direct hosting of SMB over TCP/IP

    http://support.microsoft.com/kb/204279 System TipThis article applies to a different version of Wind ...

  7. 阿里JAVA开发面试常问问题总结2

    线程与进程 进程是可并发运行的程序在某个数据集合上的一次计算活动.也是操作系统进行资源分配和调度的基本单位. 线程是操作系统进程中能够并发运行的实体,是处理器调度和分派的基本单位. 每一个进程内可包括 ...

  8. Java 基础【14】@注解

    1.注解简介 JDK 1.5 中引入的 java.lang.annotation 包提供注解编程支持,可以让类在编译.类加载.运行时被读取,并执行相应的处理. 在 Java EE应用的时候,总是免不了 ...

  9. Linux内存分配机制之伙伴系统和SLAB

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html  内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生.这就要求 ...

  10. E437: terminal capability "cm" required 错误出现的原因和解决方法

    E437: terminal capability "cm" required 错误: 出现这个问题原因是没有配置export TERM=xterm 执行:export TERM= ...