jmsServer

​ JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

​ JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

服务配置

  • 需要先在serivces.xml中进行服务端配置。
  • 属性id,state为必配项,其他为可选项;
  • 当services与service的state其中有一个为off时,服务接口就关闭;

属性说明

属性 描述 值类型 示例
id 标识 string 能表达通道含义的名字如jmsService
state 服务状态开关 string on:启动 off:关闭 启动服务端时是否启动该接口
type 服务类型 String jms
description 描述 string 步骤描述信息:jmsmq监听模式

property属性

属性 描述 值类型 示例
Name 标识 string 启动jms监听所需参数
value string 当前字段的值;

jms链接工厂引用配置

属性 描述 值类型 示例
hostName 主机名 string ubuntu2004.wsl:1414
port 端口号 Int 8888
channel 服务连接通道 string
queueManager 队列管理器 string
username 用户名 string
CCSID CCSID int 819
password 密码 string

jms服务配置property

属性 描述 值类型 示例
connectionFactory 链接工厂引用 string com.ibm.mq.jms.MQQueueConnectionFactory
destinationType 设置订阅类型 string queue
concurrency 初始消费者-最大消费者线程数 string 5-10
prefetch 每个消费者处理的消息数 int 5
receiveTimeout 接受mq消息超时时间(毫秒) int 1000
destination 设置监听的队列/主题名称 string MSGTOESFE_1
interfaceName 接口名 string 必配;jmslistener
transactionName 交易名 string elcsIn

具体配置配置代码

        <service id="jmsService" state="on" type="jms">
            <property name="connectionFactory" value="com.ibm.mq.jms.MQQueueConnectionFactory">
                <argument tag="hostName" value="#{MQ_SERVER}"/>
                <argument tag="port" value="#{MQ_SERVER}"/>
                <argument tag="CCSID" value="#{MQ_CCSID}"/>
                <argument tag="queueManager" value="#{MQ_MGR}"/>
                <argument tag="channel" value="#{MQ_CHN}"/>
                <argument tag="transportType" value="1"/>
            </property>
            <property name="destinationType" value="queue"/>
            <property name="concurrency" value="5-10"/>
            <property name="prefetch" value="5"/>
            <property name="receiveTimeout" value="1000"/>
            <property name="destination" value="#{MQ_RECV_QUEUE}"/>
            <property name="interfaceName" value="jmslistener"/>
            <property name="transactionName" value="elcsIn"/>
        </service>

接口主配置

对应service配置文件中的交易和和接口,用来接收报文,并对报文进行解析。

    <interface id="jmslistener" type="server" version="1"
        defaultScope="transaction">
        <!--来报 -->
        <transaction id="elcsIn" version="2.0">
            <step id="test">
                <filter type="in" ref="publicFilter">
                    <!--调用链 AbstractMessageListenerContainer#doInvokeListener MessageListenerAdapter#onMessage 
                        SimpleMessageConverter#fromMessage MessageHandler#handle(Object message) 
                        这里就message参数即为this[0] -->
                    <log value="elcsIn" level="info" />
                    <field tag="msg" value="${this[0]}" scope="transaction" />
                    <field tag="msg" type="${new String(msg,'#{KCMS_ENCODING}')}"
                        scope="transaction" />
                    <log value="从mq接收到的报文内容是:${msg}" />
                    <field tag="msgid" value="" />
                    <field tag="msgtyp" value="" />
                    <field tag="dzbw" value="${MsgUtil:unPackMessage(msg)}"
                        scope="transaction" />
                    <if condition="${!dzbw.isSuccess()}">
                        <field tag="msgid" value="${msg.substring(78,98).trim()}" />
                        <field tag="msgtyp" value="${msg.substring(58,78).trim()}" />
                    </if>
                    <validator condition="${dzbw.isSuccess()}"
                        errorcode="UNPACKEXCEPTION"
                        description="报文${filename}.xml解析异常:${dzbw.getErrMsg()}" />
                    <field tag="bwType" value="${dzbw.getMessageType()}"
                        description="报文类型" scope="transaction" />
                    <log value="bwType --> ${bwType}" />
                    <field tag="msgid" value="${dzbw.getMsgId()}" />
                    <field tag="msgtyp" value="${dzbw.getMessageType()}" />
                    <field tag="filename"
                        value="${bwType.toLowerCase()}_${SawIdUtil:nextDateTimeIdInr()}"
                        scope="transaction" />
                    <log value="${filename}===>elcs rcv ${bwType} xml" />

                    <field tag="f1" value="" />
                    <if condition="${'ccms.900.001.02'.equals(bwType)}">
                        <field tag="f1" value="#{DZ_RECE_900_PATH}/${filename}.txt"
                            scope="transaction" /><!--900落地文件 -->
                    </if>
                    <else>
                        <field tag="f1"
                            value="#{DZ_RECE_STORE_PATH}/${filename}.txt" scope="transaction" /><!--落地文件 -->
                    </else>
                    <log value="${filename}===>elcin xml f1 = ${f1}" />

                    <if condition="${'ccms_990_001_01'.equals(bwType)}">

                    </if>

                    <field value="${HuFileUtil:writeUtf8String(msg,f1)}" />
                    <field tag="docontinue" value="true" scope="transaction"
                        type="boolean" />
                </filter>
                <!-- 针对通知类报文多家行会收重复,进行去重 -->
                <if
                    condition="${bwType.matches('ccms.903.001.02|elcs.801.001.01|elcs.902.001.01|elcs.907.001.01|ccms.916.001.01|elcs.938.001.01')}">
                    <connection ref="jdbcConnection" />
                    <filter ref="sqlFilter" type="in">
                        <field tag="docontinue" value="false" scope="transaction"
                            type="boolean" />

                        <field tag="origsender"
                            value="${dzbw.getMsg().getHeader().getOrigSender()}" />
                        <field tag="origSenderSID"
                            value="${dzbw.getMsg().getHeader().getOrigSenderSID()}" />
                        <field tag="msgid" value="${dzbw.getMsgId()}" />
                        <field tag="dupinr"
                            value="${origsender}|${origSenderSID}|${msgid}" />
                        <field tag="duptyp" value="origsender|origSenderSID|msgid" />
                        <field tag="dupsql"
                            value="insert into dup(dupinr,duptyp) values(?,?)" />
                        <!-- <field tag="num" value="${__this.executeSqlQuietly(dupsql,dupinr,duptyp)}"/> -->
                        <!-- <if condition="${num != null}"> -->
                        <field tag="docontinue" value="true" scope="transaction"
                            type="boolean" />
                        <!-- </if> -->
                        <!-- <else> <log value="重复${bwType}报文${dupinr}被过滤"/> </else> -->
                        <field etag="close" />
                    </filter>
                </if>
                <if condition="${docontinue}">
                    <filter type="in" ref="publicFilter">
                        <!--验签 -->
                        <log value="${filename}===>准备对${bwType}报文进行验签" />
                        <call tag="res" interfaceName="check" transactionName="check"
                            type="chain">
                            <argument value="${dzbw}" />
                            <argument value="0" />
                        </call>
                        <!-- 对902报文做特殊处理,由于903报文处理时间过长导致902报文验签失败,采取的延迟补救措施 -->
                        <if
                            condition="${!res.success &amp;&amp; 'elcs.902.001.01'.equals(bwType)}">
                            <!-- <foreach tag="i" end="3"> <field value="${sleep(60000)}"/> <log 
                                value="${filename}===>第${i+1}次延迟验签重试"/> <call tag="res" interfaceName="check" 
                                transactionName="check" type="chain"> <argument value="${dzbw}"/> <argument 
                                value="0"/> </call> <if condition="${res.success}"> <log value="${filename}===>第${i+1}次延迟验签成功"/> 
                                <break/> </if> </foreach> -->
                        </if>
                        <log value="${filename}===>对${bwType}报文验签结果 = ${res.success}" />
                        <validator condition="${res.success}"
                            errorcode="${res.returnCode}" description="${res.description}" />
                        <!--交由特殊处理,获取其返回值 -->
                        <call tag="res" interfaceName="special"
                            transactionName="special" type="chain" scope="step">
                            <argument value="${dzbw}" />
                            <argument value="${f1}" />
                            <argument value="${filename}" />
                        </call>
                        <validator condition="${res.success}"
                            errorcode="#{ERROR_SPECIAL_BW_CODE}"
                            description="#{ERROR_SPECIAL_BW_DESC}" />

                        <if condition="${0==res.content}"><!--正常处理 -->
                            <log value="${filename}===>正常处理" />
                            <!--存入文件 -->
                            <if
                                condition="${'ccms.990.001.02'.equals(bwType)||'ccms.921.001.01'.equals(bwType) || 'ccms.921.001.01'.equals(bwType)}">
                            </if>
                            <else>
                                <field tag="f2"
                                    value="#{DZ_RECE_PARSE_PATH}/${filename}.txt" /><!--非嵌套文件 -->
                                <log value="${filename}===>xx elcin json f2 = ${f2}" />
                                <field
                                    value="${dzbw.saveElcsFlatHierarchyForTd(f2,'GBK')}" />
                            </else>
                        </if>
                    </filter>
                    <if condition="${1==res.content}"><!-- 特殊处理后 放置special目录 -->
                        <filter ref="sqlFilter" type="in">
                            <field tag="elcs" value="${dzbw.getElcsModel()}" />
                            <field tag="MsgId" value="${elcs.GrpHdr.MsgId}" />
                            <if
                                condition="${'ccms.999.001.01'.equals(bwType) || 'ccms.921.001.01'.equals(bwType)}">
                                <field tag="header" value="${dzbw.getMsg().getHeader()}" />
                                <field tag="fir" value="${header.getOrigReceiver()}" />
                                <field tag="sec" value="${fir.substring(3,11)}" />
                            </if>
                            <else>
                                <field tag="fir" value="ELCS" />
                                <field tag="sec" value="6666" />
                            </else>

                            <!-- <field tag="f2" value="#{DZ_RECE_PARSE_PATH}/${filename}.txt"/>非嵌套文件 
                                <log value="${filename}===>xx elcin json f2 = ${f2}"/> <field value="${dzbw.saveElcsFlatHierarchyForTd(f2,'GBK')}"/> -->

                            <if
                                condition="${bwType.matches('elcs.801.001.01|elcs.902.001.01|ccms.903.001.02')}">
                                <if condition="${'ccms.903.001.02'.equals(bwType)}">
                                    <field tag="sndcor"
                                        value="${elcs.GrpHdr.InstgPty.InstgDrctPty}" />
                                    <field tag="sndsubbch"
                                        value="${elcs.GrpHdr.InstgPty.InstgPty}" />
                                    <field tag="rcvcor"
                                        value="${elcs.GrpHdr.InstdPty.InstdDrctPty}" />
                                    <field tag="rcvdirbch"
                                        value="${elcs.GrpHdr.InstdPty.InstdPty}" />
                                </if>
                                <else>
                                    <field tag="sndcor" value="${elcs.GrpHdr.InstgAgt.MmbId}" />
                                    <field tag="sndsubbch"
                                        value="${elcs.GrpHdr.InstgAgt.BrnchId.Id}" />
                                    <field tag="rcvcor" value="${elcs.GrpHdr.InstdAgt.MmbId}" />
                                    <field tag="rcvdirbch"
                                        value="${elcs.GrpHdr.InstdAgt.BrnchId.Id}" />
                                </else>
                            </if>
                        </filter>
                    </if>
                </if>
            </step>
            <step id="exception">
                <filter type="in" ref="publicFilter">
                    <log value="${filename}===>errorcode = ${super.errorcode}" />
                    <log
                        value="${filename}===>error description = ${super.description}" />
                    <field tag="lev" value="ERROR" scope="transaction" />
                    <if condition="${super.errorcode=='#{ERROR_CERT_CODE}'}">
                        <field tag="SvcScnCd" value="elcsIn2" />
                        <field tag="lev" value="FATAL" scope="transaction" />
                    </if>
                    <elseif condition="${super.errorcode=='UNPACKEXCEPTION'}">
                        <field tag="SvcScnCd" value="elcsIn1" />
                        <field tag="lev" value="FATAL" scope="transaction" />
                    </elseif>
                    <elseif condition="${super.errorcode=='#{ERROR_BD_CODE}'}">
                        <field tag="SvcScnCd" value="elcsIn4" />
                    </elseif>
                    <else>
                        <field tag="SvcScnCd" value="elcsIn3" />
                    </else>

                    <!--出现bug,统一只处理原报文并存储 -->
                    <field tag="f0" value="#{DZ_RECE_ERROR_PATH}/${filename}.xml"
                        scope="step" /><!--错误文件 -->
                    <field value="${HuFileUtil:writeUtf8String(msg,f0)}" />
                </filter>
            </step>
        </transaction>
    </interface>

results matching ""

    No results matching ""