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">
<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" />
</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="docontinue" value="true" scope="transaction"
type="boolean" />
<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>
<if
condition="${!res.success && 'elcs.902.001.01'.equals(bwType)}">
</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}">
<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>
<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>
<field tag="f0" value="#{DZ_RECE_ERROR_PATH}/${filename}.xml"
scope="step" />
<field value="${HuFileUtil:writeUtf8String(msg,f0)}" />
</filter>
</step>
</transaction>
</interface>