JABRemoteService.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:5k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. package org.jboss.blacktie.jatmibroker.jab;
  19. import org.apache.log4j.LogManager;
  20. import org.apache.log4j.Logger;
  21. import org.jboss.blacktie.jatmibroker.xatmi.Buffer;
  22. import org.jboss.blacktie.jatmibroker.xatmi.Connection;
  23. import org.jboss.blacktie.jatmibroker.xatmi.Response;
  24. /**
  25.  * Create an invoker for a remote service. It must be constructed using a
  26.  * JABSession and the name of the service to invoke.
  27.  * 
  28.  * @see JABSession
  29.  */
  30. public class JABRemoteService {
  31. /**
  32.  * The logger to debug using
  33.  */
  34. private static final Logger log = LogManager
  35. .getLogger(JABRemoteService.class);
  36. /**
  37.  * The real connection to the service
  38.  */
  39. private Connection connection;
  40. /**
  41.  * The name of the service to invoke
  42.  */
  43. private String serviceName;
  44. /**
  45.  * The buffer to send.
  46.  */
  47. private JABMessage requestMessage;
  48. /**
  49.  * The buffer to send.
  50.  */
  51. private JABMessage responseMessage;
  52. /**
  53.  * Should the service wait forever.
  54.  */
  55. boolean noTimeout;
  56. /**
  57.  * The remote service constructor allows the programmer to access a remote
  58.  * XATMI service.
  59.  * 
  60.  * @param aServiceName
  61.  *            The name of the service to invoke
  62.  * @param aJABSession
  63.  *            The session to use
  64.  * @throws JABException
  65.  *             In case the remote service cannot be accessed.
  66.  */
  67. public JABRemoteService(String aServiceName, JABSession aJABSession,
  68. String bufferType, String bufferSubType) throws JABException {
  69. log.debug("JABService constructor");
  70. connection = aJABSession.getConnection();
  71. serviceName = aServiceName;
  72. requestMessage = new JABMessage(connection, bufferType, bufferSubType);
  73. }
  74. /**
  75.  * Call the remote service within the scope of the transaction specified in
  76.  * the signature of the invocation.
  77.  * 
  78.  * @param tx
  79.  *            The transactional scoping. The current transaction is
  80.  *            suspended if tx is null or not equal to the current
  81.  *            transaction. If tx is not null and not equal to the current
  82.  *            transaction then it is resumed. The transaction to thread
  83.  *            association is restored after the method returns.
  84.  * 
  85.  * @throws TransactionException
  86.  *             If the transaction cannot be handled
  87.  * @throws JABException
  88.  *             If the call cannot be issued.
  89.  */
  90. public void call(JABTransaction tx) throws TransactionException,
  91. JABException {
  92. log.debug("JABService call");
  93. JABTransaction prev = null;
  94. try {
  95. if (tx == null) {
  96. log.debug("service_request tx is null");
  97. prev = JABTransaction.suspend();
  98. } else if (!tx.equals(JABTransaction.current())) {
  99. log.debug("service_request suspend " + prev + " resume " + tx);
  100. prev = JABTransaction.suspend();
  101. JABTransaction.resume(tx);
  102. } else {
  103. log.debug("service_request tx same as current");
  104. }
  105. Buffer request = requestMessage.getBuffer();
  106. log.debug("service_request tpcall");
  107. Response response = connection.tpcall(serviceName, request,
  108. requestMessage.getLength(), noTimeout ? Connection.TPNOTIME
  109. : 0);
  110. responseMessage = new JABMessage(response);
  111. log.debug("service_request responsed");
  112. } catch (Exception e) {
  113. log.warn("service_request exception: " + e.getMessage());
  114. throw new JABException("Could not send tpcall", e);
  115. } finally {
  116. if (prev != null) {
  117. if (tx != null) {
  118. log.debug("service_request resp: suspending current: "
  119. + JABTransaction.current());
  120. JABTransaction.suspend();
  121. }
  122. log.debug("service_request resuming prev: " + prev);
  123. JABTransaction.resume(prev);
  124. }
  125. }
  126. }
  127. /**
  128.  * Clear the request and response buffers prior to a re-invocation.
  129.  */
  130. public void clear() {
  131. log.debug("JABService clear");
  132. requestMessage.clear();
  133. responseMessage = null;
  134. }
  135. /**
  136.  * Do not timeout the request.
  137.  * 
  138.  * @param noTimeout
  139.  *            Do not stop waiting for responses.
  140.  */
  141. public void setNoTimeout(boolean noTimeout) {
  142. this.noTimeout = noTimeout;
  143. }
  144. /**
  145.  * Get the content of the outbound buffer.
  146.  * 
  147.  * @return The requests input
  148.  */
  149. public JABMessage getRequest() {
  150. return requestMessage;
  151. }
  152. /**
  153.  * Get the content of the response message
  154.  * 
  155.  * @return The requests output
  156.  */
  157. public JABMessage getResponse() {
  158. return responseMessage;
  159. }
  160. /**
  161.  * Get the rcode that tpreturn returned with.
  162.  * 
  163.  * @return The application return code.
  164.  */
  165. public int getRCode() {
  166. if (responseMessage != null) {
  167. return responseMessage.getRCode();
  168. } else {
  169. return -1;
  170. }
  171. }
  172. }