CN100450105C - 一种基于java消息服务的同步消息接口实现方法 - Google Patents

一种基于java消息服务的同步消息接口实现方法 Download PDF

Info

Publication number
CN100450105C
CN100450105C CNB2005100864141A CN200510086414A CN100450105C CN 100450105 C CN100450105 C CN 100450105C CN B2005100864141 A CNB2005100864141 A CN B2005100864141A CN 200510086414 A CN200510086414 A CN 200510086414A CN 100450105 C CN100450105 C CN 100450105C
Authority
CN
China
Prior art keywords
transmit leg
message
thread
subscript
data field
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CNB2005100864141A
Other languages
English (en)
Other versions
CN1933454A (zh
Inventor
张长丰
金海�
王丽蓉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ZTE Corp
Original Assignee
ZTE Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ZTE Corp filed Critical ZTE Corp
Priority to CNB2005100864141A priority Critical patent/CN100450105C/zh
Publication of CN1933454A publication Critical patent/CN1933454A/zh
Application granted granted Critical
Publication of CN100450105C publication Critical patent/CN100450105C/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Multi Processors (AREA)

Abstract

本发明公开了一种基于JAVA消息服务的同步消息接口实现方法,包括:同步请求消息进入发送方的消息接口,并经发送方空闲队列进入发送方数据区,然后在发送方发送线程作用下经发送方发送队列发送到所述应用服务器;在消费方接收线程作用下应用程序处理所述请求消息产生一处理结果,所述处理结果经消费方空闲队列进入消费方数据区,在消费方发送线程作用下一同步响应消息由所述消费方数据区经消费方发送队列发送到所述应用服务器;在发送方接收线程作用下,所述响应消息由所述应用服务器经所述发送方数据区发送到所述消息接口。本发明可让应用程序简洁、可靠地实现同步通信。

Description

一种基于JAVA消息服务的同步消息接口实现方法
技术领域
本发明涉及一种实现JAVA应用同步通讯机制的方法,特别是涉及分布式JAVA应用***内部、或***间进行同步通讯的方法。
背景技术
Java消息服务(JMS)可以帮助我们减少应用程序间的耦合,而同时又允许应用程序间的通信以及使用对方的资源。
JMS一般都包含至少三个组成部分:两个JMS客户和一个JMS服务器。两个客户通过JMS服务器相互通信。JMS客户是使用JMS API(ApplicationProgramming Interface,API,应用编程接口)发送和接收消息的常规应用程序。
JMS服务器可以是任何实现JMS规范的应用程序。一些JMS服务器是更大的应用程序的一部分;还有一些是专门负责JMS任务的应用程序。有很多第三方商业资源和一些开放源代码资源的JMS服务器可供选择使用。
应用程序使用JMS相互通信有两个方法可以选用:JMS主题和JMS队列。主题和队列只在很少一些地方有区别,其中最明显的区别是它们发送消息的方式不同。
JMS主题从一个JMS客户接收消息然后将这些消息分发给所有注册为主题监听者的JMS客户。相反,JMS队列只将消息分发给一个客户,不管有多少客户注册为队列监听者。如果两个或者多个客户注册到一个队列,同时一个消息存储在队列中,那么只有一个客户能接收到这个消息。JMS规范没有规定哪个客户将接收这个消息。
不管是使用JMS主题还是JMS队列,消息中所要传递的数据的类型都在于你自己。可以是对象、或字符串等格式。
目前很多应用***的开发过程中都面临着应用程序间同步通讯的需求,一般都是通过socket(接口)通信来实现,这样不仅编码、调试的复杂度、以及应用程序间的耦合度仍然比较高,而且在保证消息发送的可靠性方面实现代价比较高。
发明内容
本发明所要解决的技术问题是提供一种基于JAVA消息服务的同步消息接口实现方法,解决现有技术不能让应用程序简洁、可靠地实现同步通信的技术问题。
为达到上述目的,本发明提供了一种基于JAVA消息服务的同步消息接口实现方法,用于将同步请求消息由发送方经应用服务器发送给消费方,并返回同步响应消息,其特点在于,包括如下步骤:步骤一,同步请求消息进入发送方的消息接口,并经发送方空闲队列进入发送方数据区,然后在发送方发送线程作用下经发送方发送队列发送到所述应用服务器;步骤二,在消费方接收线程作用下应用程序处理所述请求消息产生一处理结果,所述处理结果经消费方空闲队列进入消费方数据区,在消费方发送线程作用下一同步响应消息由所述消费方数据区经消费方发送队列发送到所述应用服务器;步骤三,在发送方接收线程作用下,所述响应消息由所述应用服务器经所述发送方数据区发送到所述消息接口。
上述的方法,其特点在于,所述消息接口连接一个或多个应用线程,所述应用线程发送所述请求消息并接收所述响应消息。
上述的方法,其特点在于,所述应用服务器包括用于中转所述请求消息的请求中转队列,以及用于中转所述响应消息的响应中转队列。
上述的方法,其特点在于,所述步骤一具体包括:
步骤a,由应用线程发送同步请求消息进入所述消息接口;
步骤b,所述消息接口从所述发送方空闲队列取掉一个空闲数据区的发送方下标,将所述请求消息放到所述发送方下标对应的数据区中,再将所述发送方下标放入所述发送方发送队列中;
步骤c,对所述下标对应的数据区的信号量进行P原子操作,因为所述信号量初始状态为失效,同步线程将被挂起,进行线程等待,设置等待所述信号量使能的时间,以便进行超时处理;
步骤d,所述发送方发送线程从所述发送方发送队列中摘掉所述发送方下标,将所述发送方下标对应的数据区中的所述请求消息发送到所述应用服务器,同时被发送的还有所述发送方下标以及一个随机数。
上述的方法,其特点在于,所述步骤二具体包括:
步骤e,消费方接收线程通知应用程序处理所述请求消息,所述应用程序进行处理产生一处理结果;
步骤f,消费方接收线程在所述消费方空闲队列中取掉一个消费方空闲数据区的消费方下标,标记所述消费方下标对应的数据区为“已用”;
步骤g,将所述处理结果以及接收到的所述消费方下标和所述随机数保存到所述消费方下标对应的数据区中,并将所述消费方下标放到所述消费方发送队列;
步骤h,所述消费方发送线程将所述响应消息发送到所述应用服务器。
上述的方法,其特点在于,所述步骤三具体包括:
步骤i,所述发送方接收线程从所述应用服务器取得所述响应消息,以及所述发送方下标和所述随机数;
步骤j,找到所述发送方下标对应的数据区,通过所述随机数检验数据的一致性,如果一致,则将所述响应消息保存到所述发送方下标对应的数据区中,并对所述发送方下标对应的数据区中的信号量做V操作,从而唤醒进行线程等待的所述同步线程;
步骤k,所述同步线程被唤醒后,从所述发送方下标对应的数据区中取得所述响应消息,并返回给发送所述请求消息的所述应用线程。
上述的方法,其特点在于,所述应用服务器具有用于保存所述请求消息和所述响应消息的磁盘,以避免因为服务器意外重启造成数据丢失。
上述的方法,其特点在于,所述应用服务器能组成一个处理集群,处理分布在多台机器上的多个发送线程和多个接收线程。
本发明的技术效果在于:
通过本发明的JMS同步接口封装方法,可以对外暴露出一个简单、可靠、高性能、线程无关的同步调用接口,可让应用程序简洁、可靠地实现同步通信。
下面结合附图进一步详细说明本发明的具体实施例。
附图说明
图1是本发明的应用架构示意图;
图2是本发明的内部逻辑实现和消息流程图:
图3是本发明侧重于发送方接口的时序流程图。
具体实施方式
本发明所提供一种基于JMS的同步消息接口实现方法,通过将JMS提供的异步消息进行同步封装转换,提供出一系列同步消息调用接口,以满足应用程序简洁、可靠地实现同步通信的要求。
本发明提供的基于JMS的同步消息接口的实现方法,包括如下步骤:
步骤1,构建一JMS应用服务器,并在其上配置两个消息队列,其中请求队列用于中转同步请求消息、响应队列用于中转响应消息。
步骤2,在同步消息的发送方,构建一个消息数据区(采用一个定长数组结构),建立一个线程安全的空闲对列和一个发送队列。初始时空闲队列长度就是数组长度,初始时发送队列长度为0。同时对每一个数据区单元中建立一个信号量,信号量初始状态为失效。
步骤3,在消息发送方,构建一个请求消息发送线程,该线程专门从发送队列中获取消息,并将其发送到JMS服务器的发送队列中。
步骤4,在同步消息的消费方,同样构建一个消息数据区(采用一个定长数组结构),建立一个线程安全的空闲对列、一个响应消息发送队列。初始时空闲队列长度就是数组长度,初始时发送队列长度为0。
步骤5,在消息消费方,构建一或多个请求消息接收线程,和一个响应消息发送线程,该线程专门从响应消息发送队列中获取消息,并将其发送到JMS服务器的响应队列中。
步骤6,当发送方应用程序发送一条同步请求消息时,同步发送接口首先从空闲队列头中取掉一个空闲数据区的下标,将需要发送的消息放到该数据区中,再将下标放到发送队列中,最后对该下标的数据区的信号量进行P原子操作,因为数据区信号量初始状态为失效,同步接口线程将被挂起,必须设置等待信号量使能的时间,以便进行超时处理。
步骤7,请求消息发送线程从发送队列中摘掉该数据区下标,将该数据区中的消息发送到JMS服务器的请求队列中、同时被发送的还有该下标以及一个随机数;进而,同步消息消费方的接收线程从JMS服务器的请求队列中获得了这个请求消息、以及下标和随机数。
步骤8,消费方的接收线程通知应用程序处理该请求消息,处理完成后,从空闲队列头中取掉一个空闲数据区的下标,然后标记该下标对应的数据区为Used,并将处理结果,加上接收到的数组下标和随机数,一起保存到消费方的数据区中,再将下标放到发送队列中。并由响应消息发送线程发送到JMS服务器中的响应队列中。
步骤9,请求方的响应消息接收线程从JMS服务器的响应队列中取得响应消息,以及数组下标和随机数;进而,找到下标对应的数据区,通过随机数检验数据的一致性,如果一致,则将响应消息保存到数据区中,并对该数据区中的信号量做V操作,从而唤醒等待的线程。
步骤10,同步发送接口线程被唤醒后,从数据区中取得响应消息,并返回给发起同步调用的应用程序。整个同步流程结束。
上述的基于JMS的同步消息接口实现方法,因为JMS服务器提供了将消息保存在本地磁盘文件的功能,可以有效的避免JAVA应用服务器意外重启后数据丢失的问题。
上述的基于JMS的同步消息接口实现方法,能够实现分布式处理,和高性能的消息路由;如果有多个发送线程、和多个接收线程分别分布在多台机器上,可以通过JMS服务器组成一个处理集群。
本发明附图是基于JMS的同步消息接口的***:图1是JMS的应用架构示意图,如图中所示,图中的消息中间件在这里就是其中JMS服务器(也可以采用其它的中间件),同步消息发送接口允许多个客户端线程进行并发操作,在提供同步接口的同时,也提供了异步发送的接口,异步发送只需要配置一个JMS消息队列,而且不需要在JMS消息中携带数组下标和随机数等字段。封装异步消息的好处是,可以屏蔽掉不同的JMS服务器带来的发送性能的差异,应用程序在将异步消息放到数据区后立即返回。
图2是JMS同步封装接口内部逻辑实现和消息流程图。在图中可以看到,在发送方和接收方,都是由空闲队列、发送队列、数据区、发送线程、以及接收线程组成。
空闲队列记录着哪些数据区单元尚未被使用,空闲队列的实现上需要重点考虑线程无关性、高性能、最少的内存分配等的最佳结合点。
发送队列记录着哪些数据区单元有待发送的数据,发送队列由同步接口线程写入数据区的下标信息,由发送线程从中读取。
发送线程所做的唯一的工作就是周而复始地从发送队列中读取数据,并将其发送到JMS的请求队列中。读到的队列单元中存放的是一个数据区的下标,发送队列将该下标中的待发送数据、加上数组下标、随机数等信息通过具体的JMS消息发送接口发送完成后,立即开始处理队列中的下一个数据单元;如果队列中没有数据,发送线程则处于等待状态。大量的性能测试结果表明,一个发送线程的性能已经能够满足要求。
接收线程主要负责从JMS相关队列接收JMS消息,在同步请求发送侧,接收线程通过使能信号量的方法,激活等待中的发送接口线程。在同步请求接收侧,接收线程负责通知上层应用程序处理相关消息,并将返回结果、以及数组下标、随机数等信息保存到数据区中。一般使用1或2个接收线程即可满足使用要求。
消息流程由图中的箭头所指示,其中虚线部分表示封装接口中的内部实现,实线部分表示需要调用具体JMS服务器提供的方法来加以实现。
图3是侧重于发送方接口的时序流程图,接收方接口时序基本相同。对其中的流程说明如下:
1、应用程序调用同步发送接口,发送内容;
2、同步发送接口将数据保存到数据区中,将数组下标放进发送队列中,并开始等待响应;
3、后台发送线程发送JMS消息到JMS服务器中的请求Queue中;
4、响应方从JMS服务器中的请求Queue中接收到请求消息。
5、响应方处理请求消息
6、响应方将处理结果发送到JMS服务器的响应Queue中。
7、接收线程从JMS响应Queue中接收响应消息
8、接收线程按照响应消息中的数组下标将响应消息保存到对应的数据区中,并通知等待线程
9、等待的同步接口被激活后,将结果返回给应用层。
从上面的实施例中可以看出,通过本发明的JMS同步接口封装方法,可以对外暴露出一个简单、可靠、高性能、线程无关的同步调用接口。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,比如不采用JMS服务器,而直接通过本地队列,socket等都可以采用本发明来实现同步通信。但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。所以,以上所述仅为本发明的较佳实施例,并非用来限定本发明的实施范围;凡是依本发明所作的等效变化与修改,都被本发明的专利范围所涵盖。

Claims (8)

1、一种基于JAVA消息服务的同步消息接口实现方法,用于将同步请求消息由发送方经应用服务器发送给消费方,并返回同步响应消息,其特征在于,包括如下步骤:
步骤一,同步请求消息进入发送方的消息接口,并经发送方空闲队列进入发送方数据区,然后在发送方发送线程作用下经发送方发送队列发送到所述应用服务器;
步骤二,在消费方接收线程作用下应用程序处理所述请求消息产生一处理结果,所述处理结果经消费方空闲队列进入消费方数据区,在消费方发送线程作用下一同步响应消息由所述消费方数据区经消费方发送队列发送到所述应用服务器;
步骤三,在发送方接收线程作用下,所述响应消息由所述应用服务器经所述发送方数据区发送到所述消息接口。
2、根据权利要求1所述的方法,其特征在于,所述消息接口连接一个或多个应用线程,所述应用线程发送所述请求消息并接收所述响应消息。
3、根据权利要求1所述的方法,其特征在于,所述应用服务器包括用于中转所述请求消息的请求中转队列,以及用于中转所述响应消息的响应中转队列。
4、根据权利要求1、2或3所述的方法,其特征在于,所述步骤一具体包括:
步骤a,由应用线程发送同步请求消息进入所述消息接口;
步骤b,所述消息接口从所述发送方空闲队列取掉一个空闲数据区的发送方下标,将所述请求消息放到所述发送方下标对应的数据区中,再将所述发送方下标放入所述发送方发送队列中;
步骤c,对所述下标对应的数据区的信号量进行P原子操作,因为所述信号量初始状态为失效,同步线程将被挂起,进行线程等待,设置等待所述信号量使能的时间,以便进行超时处理;
步骤d,所述发送方发送线程从所述发送方发送队列中摘掉所述发送方下标,将所述发送方下标对应的数据区中的所述请求消息发送到所述应用服务器,同时被发送的还有所述发送方下标以及一个随机数。
5、根据权利要求4所述的方法,其特征在于,所述步骤二具体包括:
步骤e,消费方接收线程通知应用程序处理所述请求消息,所述应用程序进行处理产生一处理结果;
步骤f,消费方接收线程在所述消费方空闲队列中取掉一个消费方空闲数据区的消费方下标,标记所述消费方下标对应的数据区为“已用”;
步骤g,将所述处理结果以及接收到的所述消费方下标和所述随机数保存到所述消费方下标对应的数据区中,并将所述消费方下标放到所述消费方发送队列;
步骤h,所述消费方发送线程将所述响应消息发送到所述应用服务器。
6、根据权利要求5所述的方法,其特征在于,所述步骤三具体包括:
步骤i,所述发送方接收线程从所述应用服务器取得所述响应消息,以及所述发送方下标和所述随机数;
步骤j,找到所述发送方下标对应的数据区,通过所述随机数检验数据的一致性,如果一致,则将所述响应消息保存到所述发送方下标对应的数据区中,并对所述发送方下标对应的数据区中的信号量做V操作,从而唤醒进行线程等待的所述同步线程;
步骤k,所述同步线程被唤醒后,从所述发送方下标对应的数据区中取得所述响应消息,并返回给发送所述请求消息的所述应用线程。
7、根据权利要求4所述的方法,其特征在于,所述应用服务器具有用于保存所述请求消息和所述响应消息的磁盘,以避免因为服务器意外重启造成数据丢失。
8、根据权利要求4所述的方法,其特征在于,所述应用服务器能组成一个处理集群,处理分布在多台机器上的多个发送线程和多个接收线程。
CNB2005100864141A 2005-09-13 2005-09-13 一种基于java消息服务的同步消息接口实现方法 Expired - Fee Related CN100450105C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2005100864141A CN100450105C (zh) 2005-09-13 2005-09-13 一种基于java消息服务的同步消息接口实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2005100864141A CN100450105C (zh) 2005-09-13 2005-09-13 一种基于java消息服务的同步消息接口实现方法

Publications (2)

Publication Number Publication Date
CN1933454A CN1933454A (zh) 2007-03-21
CN100450105C true CN100450105C (zh) 2009-01-07

Family

ID=37879078

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2005100864141A Expired - Fee Related CN100450105C (zh) 2005-09-13 2005-09-13 一种基于java消息服务的同步消息接口实现方法

Country Status (1)

Country Link
CN (1) CN100450105C (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231755A (zh) * 2011-06-20 2011-11-02 中兴通讯股份有限公司 一种对移动sns应用进行统一处理的方法及装置
CN102404404B (zh) * 2011-09-07 2017-07-28 航天科工仿真技术有限责任公司 一种分布式web应用与远程设备消息通信方法
CN103064778B (zh) * 2011-10-20 2015-09-09 阿里巴巴集团控股有限公司 一种服务器性能测试方法、装置及***
CN102629221B (zh) 2012-02-28 2014-11-19 华为技术有限公司 用于分布式共享存储的任务同步方法、装置及***
CN104333515B (zh) * 2014-11-14 2018-07-06 中国建设银行股份有限公司 一种swift报文处理方法及装置
CN106789245A (zh) * 2016-12-22 2017-05-31 浪潮通信信息***有限公司 一种基于jms的指令执行服务工具及方法
CN111158923B (zh) * 2019-12-30 2023-05-12 深圳云天励飞技术有限公司 接口调用方法、装置、电子设备及存储介质
CN111447263A (zh) * 2020-03-24 2020-07-24 中国建设银行股份有限公司 一种消息通信***
CN112685190A (zh) * 2020-12-30 2021-04-20 平安普惠企业管理有限公司 基于消息队列的同步调用方法、***及计算机设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0565849A2 (en) * 1992-04-14 1993-10-20 International Business Machines Corporation A method and system for synchronizing threads within a process
JP2004030312A (ja) * 2002-06-26 2004-01-29 Mitsubishi Electric Corp マルチスレッド同期制御方式
CN1584842A (zh) * 2004-06-09 2005-02-23 中兴通讯股份有限公司 一种实现计算机***应用服务器的方法
CN1589442A (zh) * 2001-10-05 2005-03-02 Bea***公司 用于与多重调度池进行消息接发的应用服务器的***
CN1630852A (zh) * 2001-09-28 2005-06-22 英特尔公司 多处理器计算机上的java线程同步的灵活加速

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0565849A2 (en) * 1992-04-14 1993-10-20 International Business Machines Corporation A method and system for synchronizing threads within a process
CN1630852A (zh) * 2001-09-28 2005-06-22 英特尔公司 多处理器计算机上的java线程同步的灵活加速
CN1589442A (zh) * 2001-10-05 2005-03-02 Bea***公司 用于与多重调度池进行消息接发的应用服务器的***
JP2004030312A (ja) * 2002-06-26 2004-01-29 Mitsubishi Electric Corp マルチスレッド同期制御方式
CN1584842A (zh) * 2004-06-09 2005-02-23 中兴通讯股份有限公司 一种实现计算机***应用服务器的方法

Also Published As

Publication number Publication date
CN1933454A (zh) 2007-03-21

Similar Documents

Publication Publication Date Title
CN100450105C (zh) 一种基于java消息服务的同步消息接口实现方法
CN106713226B (zh) 一种用于分布式***的远程过程调用处理方法和***
CN110134534B (zh) 基于nio针对大数据分布式***进行消息处理优化的***及方法
CN105472042B (zh) Web端控制的消息中间件***及其数据传送方法
US20040068479A1 (en) Exploiting asynchronous access to database operations
CN110677277B (zh) 数据处理方法、装置、服务器和计算机可读存储介质
CN103927218A (zh) 事件分发方法及***
CN108769099A (zh) 一种消息中间件的消息去重的实现方法
CN101651698A (zh) 基于nio和io的面向发布订阅***的传输方法
CN111212085B (zh) 物联网平台同步调用的方法、物联网***和网络设备
CN109547162B (zh) 基于两套单向边界的数据通信方法
CN108494817A (zh) 数据传输方法、相关装置及***
CN103297395A (zh) 一种互联网业务的实现方法、***以及装置
CN110413822B (zh) 离线图像结构化分析方法、装置、***和存储介质
CN103888441A (zh) 一种应用程序与协议栈之间的信息传输方法及处理装置
CN103873523A (zh) 客户端集群访问方法及装置
CN102111419A (zh) 一种基于消息中间件的客户端自动重连方法
CN111641700A (zh) 基于Ceph对象存储元数据的管理及检索的实现方法
CN110083468A (zh) 一种数据传输方法、电子装置和存储介质
CN116382943A (zh) 顺序消息处理方法、总线***、计算机设备及存储介质
CN106803841B (zh) 消息队列数据的读取方法、装置及分布式数据存储***
CN105208004A (zh) 一种基于obd设备的数据入库方法
CN109388501B (zh) 基于人脸识别请求的通信匹配方法、装置、设备及介质
CN105005469A (zh) 一种基于Zookeeper和RabbitMQ的非阻塞调用方法
CN114371935A (zh) 网关处理方法、网关、设备及介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20090107

Termination date: 20150913

EXPY Termination of patent right or utility model