System and method of providing an asynchronous interface between a client system and an enterprise javabeans-enabled server
Claim Score by NHIP
Abstract
A method of implementing an interface to achieve asynchronous method invocations between a client system, a messaging server, and an enterprise JavaBeans-enabled server is provided which includes performing a lookup operation for an asynchronous home interface on JNDI directory service, returning a reference to the asynchronous home interface of an enterprise bean, to the client system, and making a call on the reference. The method also includes providing a listener for the asynchronous home interface to monitor a plurality of events, generating an event, receiving a result after generating the event; and executing a method of the listener.

Term
Term ended
Projected expiry passed 23 March 2021, 5.5 years ago.
- Priority
- Filed
- Published
- Projected expiry
- Today
18 claims: 3 independent, 15 dependent
- 1A method of implementing an interface to achieve asynchronous method invocations between a client system, a messaging server, and an enterprise JavaBeans-enabled server, comprising:performing a lookup operation for an asynchronous home interface on Java naming and directory interface service;returning a reference to the asynchronous home interface of an enterprise bean, to the client system;making a call on the reference;providing a listener for the asynchronous home interface to monitor a plurality of events;generating an event;receiving a result after generating the event;and executing a method of the listener.
- 12A method of providing an interface for achieving asynchronous method invocations between a client system and an enterprise JavaBeans-enabled server, comprising:performing a lookup operation for a home interface on an enterprise JavaBean that enables the client system to obtain a reference to the home interface;providing a listener for the home interface to monitor events;invoking a call to the home interface;receiving a result when an event has occurred;receiving a call identifier from the home interface;and using the call identifier to identify the result of an asynchronous call.
- 14Broadest claimClaim Score 74, broad(NHIP)An enterprise JavaBeans architecture configured to provide asynchronous method invocations, comprising:a client system having a listener configured to generate a notification when an incoming message is detected and to generate an event when the incoming message has arrived;a messaging server configured to communicate with the client system;and an enterprise JavaBeans-enabled server having an interface configured to enable the listener to detect the incoming message being transmitted from the enterprise JavaBeans-enabled server, wherein the enterprise JavaBeans-enabled server is configured to communicate with the messaging server.
Independent claims3
115 paragraphs in 6 sections, as filed
CROSS-REFERENCE TO RELATED APPLICATIONS
[0001] This application claims priority from U.S. provisional patent applications Ser. Nos. 60/193,003 and 60/193,007, both filed on Mar. 29, 2000, which are herein incorporated by reference for all purposes.
FIELD OF THE INVENTION
[0002] The present invention relates generally to systems and methods for providing asynchronous and synchronous interfaces between a client system and an Enterprise JavaBeans (“EJB”)-enabled server. More particularly, the present invention relates to systems and methods for providing asynchronous method invocations between the client system and the EJB-enabled server without implementing any explicit messaging calls.
BACKGROUND OF THE INVENTION
[0003] The EJB architecture, developed by Sun Microsystems, Inc., is a standard component architecture for building distributed object-oriented applications in the Java programming language. A distributed object-oriented application is an application program in which parts of the application program are located in different physical locations. The EJB architecture allows application developers to build these distributed applications by combining components that are developed by using tools from multiple vendors. This architecture defines the contracts that enable these tools to develop and deploy components that can inter-operate at runtime.
[0004] The EJB architecture utilizes an EJB specification that defines the functions and operations of the components of the EJB architecture. Components are pre-developed modules of application code that run in an application server and that can be assembled into working application systems. The EJB specification provides a framework for the development and deployment of components. These components may be plugged into the EJB-enabled server to enhance the EJB-enabled server's functionality. For example, the components provided by one vendor can be easily integrated with the components provided by other vendors using the EJB specification.
[0005]FIG. 1 is a simplified block diagram of an EJB architecture <b>10</b> having a client system <b>12</b> and an EJB-enabled server <b>14</b> and configured to perform synchronous method invocations. The server has a number of components including a number of containers <b>16</b> and a number of enterprise beans <b>18</b>. The server provides the system level services such as load balancing, scalability, and interaction with an application server (not shown). The server is an EJB-enabled server that is configured to host the containers.
[0006] Enterprise beans <b>18</b> are components of the EJB architecture that are developed once and then deployed on multiple EJB-enabled servers without recompilation or source code modification. Enterprise beans reside in the container <b>16</b>, encapsulate application logic, and contain logic functions that operate on data stored in the EJB-enabled server <b>14</b> and a database <b>20</b>.
[0007] The EJB architecture defines two types of enterprise beans <b>18</b>, session beans and entity beans. A key difference between session and entity beans is the fact that an entity bean has a persistent state while a session bean models interactions but does not have a persistent state. Entity beans are associated with objects and persistent records in some sort of database (Resource Manager). In contrast, session beans do not represent database records but rather, represent extensions of the client application and are responsible for managing processes or tasks. The client system <b>12</b> accesses the session bean through the session bean's remote interface. Each session bean is an EJB instance associated with a single client system and is typically non-persistent. An entity bean represents information persistently stored in the database <b>20</b> and is associated with database transactions. The persistence of entity beans is handled by the entity beans themselves or by the container <b>16</b>. The entity beans that represent a business object can be shared among multiple client systems <b>12</b>.
[0008] To implement a bean, two interfaces need to be defined: a home interface and a remote interface. The home interface defines the bean's life cycle methods including methods for creating new beans, removing beans and finding beans. The enterprise bean's home interface defines the methods for the client system <b>12</b> to create, remove, and locate EJB objects of the same type (i.e., they are implemented by the same enterprise bean). The client system can locate the enterprise bean's home interface through the Java Naming and Directory Interface (JNDI) API. The remote interface defines the bean's business methods callable by the client system, i.e., the methods a bean presents to the outside world to do its work. Each EJB object is accessible via the enterprise bean's remote interface.
[0009] Containers <b>16</b> reside in the server <b>14</b> and are responsible for managing the interactions between a bean and its server. Each container is responsible for presenting a uniform interface between the bean and the server, creating new instances of the bean, and providing services such as concurrency, locking, persistence management, remote access, and security, to the enterprise beans <b>18</b>. Multiple enterprise beans can be installed in and deployed from the same container. The container also creates a class that implements the home interface of an enterprise bean. The container is responsible for making the home interfaces of its deployed enterprise beans available to the client system <b>12</b> through JNDI.
[0010] In the EJB-enabled server <b>14</b>, the enterprise beans <b>18</b> are deployed into the containers <b>16</b>. The deployment process, illustrated in FIG. 2, begins when the container generates implementations of the home interface and the remote interface of the enterprise beans for use at runtime (step S-1). These implementations are then compiled to use remote method invocation (RMI) or any other such synchronous protocols as the protocol of communication with the EJB-enabled server (step S-2). . The RMI protocol uses stubs and skeletons for communication between the client side and server side components. The skeletons <b>15</b> are generated classes that are located on the server side and stubs <b>13</b> are generated classes that are located on the client side (step S-3) (see also FIG. 3). Referring to FIG. 3, stubs <b>13</b> and skeletons <b>15</b> are responsible for making the method calls on the server <b>14</b> appear as if they were running locally on the client system <b>12</b>. The stub <b>13</b> resides on the client system and is connected to the skeleton <b>15</b> via a network. The skeleton <b>15</b> is set up on a port at the EJB-enabled server side and listens for requests from the stub <b>13</b>. When an object makes a method call on any home or remote interface of a bean, the control transfers from the calling object to the called object's stub. When the client system <b>12</b> invokes the method on the stub <b>13</b>, the name of the method invoked and the values passed in as parameters are communicated to the skeleton <b>15</b>. For example, in FIG. 3, the method invokes a create routine. The skeleton parses the incoming stream to properly invoke the method and the result is streamed back to the stub.
[0011] The EJB specification also defines the client-view contract (or client contract) and component contract. The client-view contract is the contract between the client and a container and provides a uniform development model for applications using enterprise beans as components. The client view contract of the enterprise bean includes home interface, remote interface, object identity, metadata interface, and handle. The component contract defines the contract between the enterprise bean and its container.
[0012] The EJB specification also defines various other aspects of the EJB architecture, e.g., the roles played by the various users and the runtime attributes of an enterprise bean called the Deployment Descriptor. In addition, the EJB specification supports various protocols including RMI and Internet Inter-Orb Protocol (IIOP). RMI is typically the default protocol that is supported by the EJB specification. RMI is the basis of distributed object systems and is responsible for making the distributed objects' location transparent, i.e., the object's location is unknown and unimportant to the client system <b>12</b>.
[0013] Using the RMI protocol, the EJB specification defines a synchronous mode of communication between the client system <b>12</b> and the server <b>14</b>. Synchronous communication means that when a request is made from one object to another, the calling object will be blocked until it obtains a response from the called object. For example, when the client system makes a request, e.g., a method call, to the server, the client system making the call is blocked for the duration of the call and until a response is received (see FIG. 1). That is, the client system will be blocked until the request is communicated to the server, the request is processed by the server, and a result is returned to the client system or an exception occurs. One drawback of synchronous communication is that the client system is unable to process further requests from the user application until and unless the server has completed the previous request. This strictly sequential processing may not be necessary or appropriate for a number of applications. For instance if a client system is sending updates to a remote server and does not care about a reply from the server, and only expects the updates to reach the server reliably, a strictly synchronous behavior is not required and such applications are better served by an asynchronous model. In this case, the client system simply queues up updates and as long as is guaranteed reliable delivery to the server, is free to process other requests before even hearing back from the server.
[0014] As a result of the problems associated with synchronous communication and the need for asynchronous communication in a distributed environment, EJB-enabled servers <b>14</b> have been developed which provide asynchronous capabilities. Current EJB-enabled servers achieve asynchronous capability at the application level by implementing an EJB-Java Messaging Service (JMS) bridge <b>19</b> on the EJB-enabled server (see FIG. 4). One drawback of the EJB-JMS implementation is that the client system has to make JMS messaging calls that the EJB-enabled server understands and executes.
[0015] It should therefore be appreciated that there is a need for asynchronous communication protocols at the container level to create a reliable, scalable, and configurable messaging engine infrastructure where there is no loss of time or data due to non-availability of resources. Also, it should be appreciated that there is a need to extend the messaging capabilities to support asynchronous communications in a multi-tier distributed EJB environment where the programmer does not have to write any explicit messaging calls. The present invention fulfills these needs as well as others.
SUMMARY OF THE INVENTION
[0016] The present invention modifies the client contract to allow existing EJB technology to accommodate asynchronous method invocations. The client contract specifies the way a client system communicates with an EJB-enabled server. The client system can use any protocol to communicate with the EJB-enabled server. The component contract specifies the way server-side components communicate with each other where RMI is the default protocol for these communications. The present invention is directed to an efficient and safe way of implementing an interface for asynchronous communication into the EJB specification by modifying the client contract.
[0017] A method of implementing an interface to achieve asynchronous method invocations between a client system, a messaging server, and an enterprise JavaBeans-enabled server is provided which includes performing a lookup operation for an asynchronous home interface on JNDI directory service, returning a reference to the asynchronous home interface of an enterprise bean, to the client system, and making a call on the reference. The method also includes providing a listener for the asynchronous home interface to monitor a plurality of events, generating an event, receiving a result after generating the event; and executing a method of the listener.
[0018] One objective of the present invention is to provide an asynchronous interface between the client system and the EJB-enabled server, where asynchronous capability exists at the container level (as opposed to the application level), thereby protecting transactional integrity. In addition, the present invention provides for an asynchronous interface in which explicit messaging calls are not necessary.
[0019] Another objective of the present invention is enhancement of the EJB standard to create a new paradigm for application development in a multi-tiered distributed computing environment. Furthermore, the present invention provides a user on the client system with the capability to continuously work and process requests without experiencing server delays.
[0020] It is a further objective of the present invention to provide an interface, which helps create a reliable, scalable and configurable messaging engine infrastructure. This allows for the seamless and transparent queuing and delivery of messages. In addition, transactional queues are supported should guaranteed delivery be required.
[0021] It is yet a further objective of the present invention that little to no changes to EJBs are required in order to implement the asynchronous interface of the present invention. At deployment time the decision is made as to which protocol is appropriate for the EJB and the protocol can be modified with no reprogramming.
[0022] In addition, implementing the interface of the present invention allows existing applications to continue working while method calls are processed. The asynchronous form of method invocations provides fail-safe communication. Further, combining EJB with asynchronous method invocations allows for more flexibility and reliability to design applications.
[0023] It is yet another objective of the present invention that the interface of the present invention can be used to facilitate synchronous method invocations, asynchronous method invocations or both simultaneously, on an EJB.
[0024] Other features and advantages of the present invention should become apparent from the following description of the preferred embodiment, taken in conjunction with the accompanying drawings, which illustrate, by way of example, the principles of the present invention.
BRIEF DESCRIPTION OF THE DRAWINGS
[0025]FIG. 1 is a simplified block diagram of a prior art EJB architecture having a client system and an EJB-enabled server, all configured to communicate synchronously;
[0026]FIG. 2 is a simplified flow chart illustrating the deployment process of enterprise beans into a container using the prior art EJB architecture of FIG. 1;
[0027]FIG. 3 is a simplified block diagram of a prior art EJB architecture, having a client system and an EJB-enabled server, that uses stubs and skeletons to communicate synchronously;
[0028]FIG. 4 is a simplified block diagram of a prior art EJB architecture having a client system and an EJB-enabled server and configured to communicate asynchronously at the application level;
[0029]FIG. 5 is a simplified block diagram of an EJB architecture having an EJB-enabled server, a client system and a messaging server, as used in an embodiment of the present invention;
[0030]FIG. 6 is a simplified block diagram of the client system and the EJB-enabled server of FIG. 5 where a container is illustrated as providing the interface that facilitates synchronous and asynchronous messaging; and
[0031]FIG. 7 is a simplified flow chart describing a method of developing a client side implementation of the interface of the present invention to achieve asynchronous method invocations in an EJB-enabled server.
DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENT
[0032] The present invention expands on the EJB synchronous method invocation paradigm defined in the EJB specification to create an interface for implementing asynchronous method invocations to provide a scalable, reliable and configurable infrastructure to integrate distributed and diverse applications, without generating dependencies on messaging services or platforms. This combination of standards compliance and customizability is one feature of the present invention. The present invention also allows the communication protocol's access to an enterprise bean to be completely transparent to the client system. In various embodiments, the present invention enables synchronous method invocations, asynchronous method invocations or both simultaneously on an enterprise java bean.
[0033] With reference to FIG. 5, there is shown an EJB architecture <b>22</b> having a client system <b>24</b>, a messaging server (interchangeably referred to herein as messaging service) <b>26</b>, and an EJB-enabled server <b>28</b> having a messaging engine and configured to provide asynchronous messaging at the container level using the messaging engine. The client system includes a client library <b>25</b> that is used to route messages from the client system to the messaging server and the EJB-enabled server. The client library may also be part of the messaging engine. The client system accesses the bean through the messaging server <b>26</b> using a method call provided by the client library. The messaging server <b>26</b> provides guaranteed message delivery. Examples of messaging servers <b>26</b> include IBM's MQ server and Oracle's AQ server. The EJB architecture may be implemented using one or more client systems, messaging servers, and EJB-enabled servers. This EJB architecture or any other architecture may be used to implement the asynchronous interface of the present invention. The interface can be implemented using hardware, software, or a combination of the two. For example, the interface can be the hardware that provides asynchronous communication between the client system and the messaging server and the messaging server and the EJB-enabled server. Also, the interface can be the software that is used to provide asynchronous communication between the client system and the messaging server and the messaging server and the EJB-enabled server.
[0034] The interface of the present invention enables the client system to listen to messaging events and be notified when they occur, and therefore, the client system is informed when the result arrives. The result that the client system receives is in the form of a VandaMessagingEvent object and the results can be obtained from this object. The interface can be used to plug into any commercially available messaging server <b>16</b> (e.g., Oracle AQ, IBM MQ Series, etc.), including any JMS implementation. One feature of the present invention is that the asynchronous client interface is generic in the sense that the client contract hides the messaging calls so that the application programmer does not have to explicitly code them. This allows a program to be written in a general manner while the specifics of any particular asynchronous communication protocol are handled by choosing an asynchronous data link layer at the time of deployment. The interface also modifies the client contract defined in the EJB specification in a way such that normal applications (which are written in a manner compliant with the EJB specification) are not affected by the interface.
[0035] The EJB specification provides for data link-specific containers that do not allow for a generic interface. As a consequence, asynchronous capability may only be provided at the application level (where transactional integrity is lost), not the container level (as in the present invention). The present invention ensures that the client system does not make any explicit messaging calls like the normal EJB-JMS implementation.
[0036] The interface of the present invention helps facilitate asynchronous method invocations so that by the pooling of requests or the transmission of the requests to a remote location, the client system is available to process additional requests from users without the current application incurring server delays. Asynchronous communication is achieved by modifying the client contract to accommodate asynchronous method invocation. The client contract is modified so that the messaging container does not become incompatible with conventional client systems using the default EJB method invocation mechanism.
[0037]FIG. 6 is a simplified block diagram of the interface between the client system and the EJB-enabled server of FIG. 5 wherewith a container is illustrated as providing the interface that facilitates synchronous and asynchronous method invocations simultaneously. A standard EJB application <b>40</b><i>a </i>can obtain a normal home interface reference through JNDI <b>42</b><i>a</i>. Whereas an application that requires asynchronous behavior <b>40</b><i>b </i>can request an asynchronous home interface via JNDI <b>42</b><i>b</i>. The two applications can respectively, simultaneously invoke methods synchronously and asynchronously on the same enterprise java bean deployed in the container enabled to handle asynchronous method invocations 44.
[0038] Interface Specification
[0039] The following sections describe a method of developing an interface to achieve asynchronous method invocations between the client system and any EJB-enabled server without explicitly making any messaging-specific calls. The following sections are divided up as follows:
[0040] 1. Client-side implementation;
[0041] 2. Bean-side implementation;
[0042] 3. API Reference; and
[0043] 4. Example.
[0044] 1. Client-side implementation
[0045] The following description refers to FIG. 7, which is a simplified flow chart describing a method of developing a client side implementation of the interface of the present invention to achieve asynchronous method invocations in an EJB-enabled server. Since the present invention deals with asynchronous method calls, the result is not returned immediately, and therefore, the EJB architecture uses a mechanism, e.g., a listener, by which a notification is generated and acknowledged when a result arrives. Events from asynchronous remote method invocations are triggered, i.e., fire, when the result arrives. That is, when the result arrives, an event is generated. One or more listeners (mechanisms for receiving an event or result from a previous remote method call) can register to be notified about the events. Event handlers can be instances of any class. As long as the class implements a VandaMessagingEventListener interface, its instances can handle events.
[0046] To invoke a remote bean's method asynchronously 1. Call Lookup Asynchronous Home Interface Reference on JNDI (Java Naming and Directory Interface) initial context with VMS as the protocol name (step A-2). 2. Add a listener to the Asynchronous Home Interface Reference returned by the Lookup (step A-4). 3. Call a method on the Asynchronous Home Interface Reference, which returns a CallID (step A-6). 4. Store the CallID returned by the method.
[0047] To receive and process the response 1. After the above method is executed, the methodCompleted( ) method is executed and if an exception is returned then the exception( )Occurred( ) method is executed. 2. These methods use a CallID (available from event.getCallID()) to identify the call which was completed. 3. These methods use a getResult( ) method to get the result for the call (e.g., if it is a create( ) method of Home), getResult( ) will return Messaging<<Bean>>Remotelnterface. This result is used by the client system for subsequent operations (step A-8).
[0048] As the present invention deals with asynchronous calls, the result is not returned immediately and therefore it is important to monitor when the result of a call is returned. One way to do this is to monitor for events. When the result arrives, an event is generated. One or more listeners can register to be notified about events. This also allows the programmer to delegate authority for event handling to the client library, which may be part of the client system <b>24</b>, as opposed to having the programmer query for the results.
[0049] The business method used to implement the call lookup on the JNDI is described below.
[0050] A. Call Lookup on JNDI
[0051] To implement the call lookup, the client system calls lookup on the JNDI InitialContext with “VMS”<b>0</b> (used in this example to signify asynchronous) as the protocol name. For example, if the client system is looking for the Home Interface of an Account Bean, the client code might be as follows (see also FIG. 6): <tables id="TABLE-US-00001" num="1"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>Context ctx = new InitialContext ( );</entry></row><row><entry /><entry>AsyncMessagingAccountHomeInterface ref =</entry></row><row><entry /><entry>ctx.lookup(“vms://AccountHomeInterface”);</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0052] In this example, the lookup returns an AsyncMessagingAccountHomelnterface to enable the client system to obtain a reference to the asynchronous home interface of the respective bean. This reference enables the client system to make asynchronous calls on the bean without having a user write any messaging calls. The asynchronous home interface is automatically generated during deployment and configuration of the enterprise bean. An example of the actual bean interface and the generated asynchronous home interface is shown below:
[0053] Actual Remote Interface of a StudentBean <tables id="TABLE-US-00002" num="2"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>import javax.ejb.*;</entry></row><row><entry>import java.rmi.*;</entry></row><row><entry>import java.util.*;</entry></row><row><entry>public interface StudentEntityCMPRemoteInterface extends</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>javax.ejb.EJBObject {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>// All business methods of Remote Interface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public String computeGrade( ) throws RemoteException;</entry></row><row><entry /><entry>public int getId( ) throws RemoteException;</entry></row><row><entry /><entry>public void setId(int id) throws RemoteException;</entry></row><row><entry /><entry>public String getName( ) throws RemoteException;</entry></row><row><entry /><entry>public int getMarks( ) throws RemoteException,</entry></row><row><entry /><entry>public void setName(String name) throws RemoteException;</entry></row><row><entry /><entry>public void setMarks(int marks) throws RemoteException;</entry></row><row><entry /><entry>public void swapRecords(int recordId) throws RemoteException;</entry></row><row><entry /><entry>public void removeAndUpdateRecord(int recordId) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void removeRecord(int recordId) throws RemoteException,</entry></row><row><entry /><entry>public void updateRecord(int recordId) throws RemoteException;</entry></row><row><entry /><entry>public String getCallerName( ) throws RemoteException;</entry></row><row><entry /><entry>public boolean getRollback( ) throws RemoteException;</entry></row><row><entry /><entry>public void setRollback( ) throws RemoteException;</entry></row><row><entry /><entry>public void createRecs( ) throws RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0054] The following code represents the corresponding generated asynchronous home interface: <tables id="TABLE-US-00003" num="3"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>import java.util.*;</entry></row><row><entry>import java.rmi.*;</entry></row><row><entry>import java.security.*;</entry></row><row><entry>import vanda.generic.client.*;</entry></row><row><entry>import vanda.client.messaging.*;</entry></row><row><entry>import javax.ejb.*;</entry></row><row><entry>public interface AsyncStudentEntityCMPRemoteInterface</entry></row><row><entry>{</entry></row><row><entry>// All business methods ...</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long getName( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long setName(java.lang.String param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long removeRecord(int param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long computeGrade( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long createRecs( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long getCallerName( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long getId( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long getMarks( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long getRollback( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long isCallerInRole(java.lang.String param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long removeAndUpdateRecord(int param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long setId(int param0) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long setMarks(int param0) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long setRollback( ) throws java.rmi.RemoteException;</entry></row><row><entry /><entry>public long swapRecords(int param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long updateRecord(int param0) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>java.rmi.RemoteException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>// Other Utility business methods given as a part of the client interface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public Object getResult(long callId) throws Exception;</entry></row><row><entry /><entry>public boolean getStatus(long callId) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaResultAlreadyReceivedException</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void releaseMessagingService( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>// all Other EJB business methods - Given an Async Look</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public long getHandle( ) throws RemoteException;</entry></row><row><entry /><entry>public long remove( ) throws RemoteException;</entry></row><row><entry /><entry>public void addListener(VandaMessagingEventListener e);</entry></row><row><entry /><entry>public VandaMessagingStub getEJBHome( );</entry></row><row><entry /><entry>public Object getPrimaryKey( );</entry></row><row><entry /><entry>public boolean isIdentical(Object obj);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0055] For the above generated asynchronous remote interface, all the business methods are configured to return a long value to differentiate the asynchronous interface for each client system. When the client system invokes the methods, the methods return a long value called a CallID. The CallID is used by the client system when results arrive, to identify the appropriate method called. When implementing a synchronous call, the result returned is the actual value (or error exception); however, when implementing an asynchronous call, the result returned is not the actual value but rather an identifier (such as a CallID or other unique identifier), which can be used to retrieve the actual value returned from the asynchronous call.
[0056] Implementations of the present invention to achieve asynchronous method invocations, cause the calls made on the reference to be converted to messaging calls by the client library thereby hiding the messaging calls that would normally have to be made by the programmer. The reference given to the client systems are used to instantiate and generate asynchronous stubs. An example of the code used to instantiate and generate the asynchronous stubs is shown below. <tables id="TABLE-US-00004" num="4"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>import java.lang.*;</entry></row><row><entry /><entry>import java.util.*;</entry></row><row><entry /><entry>import java.sql.*;</entry></row><row><entry /><entry>import java.rmi.*;</entry></row><row><entry /><entry>import java.security.*;</entry></row><row><entry /><entry>import java.io.*;</entry></row><row><entry /><entry>import javax.ejb.*;</entry></row><row><entry /><entry>import vanda.generic.client.*;</entry></row><row><entry /><entry>import vanda.client.messaging.*;</entry></row><row><entry /><entry>import vanda.generic.messaging.*;</entry></row><row><entry /><entry>import vanda.generic.container.core.*;</entry></row><row><entry /><entry>import vanda.generic.server.core.*;</entry></row><row><entry /><entry>public class AsyncVandaStudentEntityCMPRemoteInterface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Impl_Stub</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>extends VandaMessagingStub</entry></row><row><entry /><entry>implements AsyncStudentEntityCMPRemoteInterface ,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="49PT" align="left" /><colspec colname="1" colwidth="168PT" align="left" /><tbody valign="top"><row><entry /><entry>Serializable</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>public AsyncVandaStudentEntityCMPRemoteInterface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>Impl_Stub( )</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>{</entry></row><row><entry /><entry>setClassName(“StudentEntityCMPRemoteInterface”);</entry></row><row><entry /><entry>setIsSession(false);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public long getName( ) throws java.rmi.RemoteException</entry></row><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingAPIInterface vandaAPI = getVandaMessaging</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>API( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingArgument vandaMesgArgs;</entry></row><row><entry /><entry>long methodCallId;</entry></row><row><entry /><entry>vandaMesgArgs = new VandaMessagingArgument( );</entry></row><row><entry /><entry>vandaMesgArgs.setClassName(“StudentEntityCMPRemote</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>Interface”);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>vandaMesgArgs.setMethodName(“getName”);</entry></row><row><entry /><entry>if (VandaMessagingClient.isJavaClient( ) = = false)</entry></row><row><entry /><entry>{</entry></row><row><entry /><entry>vandaMesgArgs.setSessionId(VandaMessagingClient.getSession</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>Id( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>vandaMesgArgs.setCallId(methodCallId =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingClient.getCallId( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>vandaMesgArgs.setSecurityId(getSecurityId( ));</entry></row><row><entry /><entry>vandaMesgArgs.setTransactionContext(getTransaction</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>Context( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>vandaMesgArgs.setRemoteObjectId(getObjectId( ));</entry></row><row><entry /><entry>vandaMesgArgs.setClientId(getClientId( ));</entry></row><row><entry /><entry>vandaMesgArgs.setConsumerName(getConsumerName( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>vandaMesgArgs.setObjectType(</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingObjectType.EJB_OBJECT);</entry></row><row><entry /><entry>vandaMesgArgs.setTargetMessagingDescriptor(</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="84PT" align="left" /><colspec colname="1" colwidth="133PT" align="left" /><tbody valign="top"><row><entry /><entry>getTargetMessagingDescriptor( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>registerMethodCall(vandaMesgArgs);</entry></row><row><entry /><entry>invokeMethod(vandaMesgArgs, “StudentEntityCMP”);</entry></row><row><entry /><entry>return( methodCallId);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>.........</entry></row><row><entry>// Similarly as the above business method, all other business methods are</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>also implemented</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0057] As shown in the above code, the stub layer does not contain any direct messaging calls, rather, messaging objects are used for inserting messages into and retrieving messages from the messaging service <b>26</b> (see also FIG. 5). This plug-in implementation (or plug-in module) is a component of the EJB-enabled server and is dependent on the underlying messaging server <b>26</b>. Each method described above builds a Messaging Argument object that contains details about the bean, the method to be called on that bean, parameters, their types, etc. The Messaging Argument object is used at the server side to call the correct method. After building this object, the request object is registered with the client library for event notification.
[0058] After the object is built, the stub calls invokeMethod which performs one or more of the following:
[0059] 1. Enqueue the message into the messaging server <b>26</b> using the plug in module; or
[0060] 2. Call the method directly if the client system is another bean and the target bean is also available at the same server.
[0061] The following is a generic interface that may be implemented to develop plug-in modules, which are messaging server dependent. The generic asynchronous stubs can use an implementation of the interface (described below) for inserting messages into and retrieving messages from the messaging server <b>26</b>. <tables id="TABLE-US-00005" num="5"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>package vanda.generic.messaging;</entry></row><row><entry>import vanda.server.core.*;</entry></row><row><entry>public interface VandaMessagingAPIInterface</entry></row><row><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void setMessagingDescriptor(VandaMessagingDescriptor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Interface mesgDesc);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public VandaMessagingDescriptorInterface getMessaging</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Descriptor( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void setproxyMessagingDescriptor(</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaProxyMessagingDescriptorInterface mesgDesc);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public VandaProxyMessagingDescriptorInterface</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>getProxyMessagingDescriptor( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public boolean isClientProxy( );</entry></row><row><entry /><entry>public void enqueue (Object data) throws VandaMessagingEnqueue</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Exception;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void enqueue (Object data, String consumerName)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>throws VandaMessagingEnqueueException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public Object dequeue( ) throws VandaMessagingDequeueException;</entry></row><row><entry /><entry>public Object dequeue(String consumerName)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>throws VandaMessagingDequeueException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public Object dequeueNoWait( ) throws VandaMessagingDequeue</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Exception;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public Object dequeueNoWait(String consumerName)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>throws VandaMessagingDequeueException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void enqueue (Object data, String consumerName,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingDescriptorInterface mesgDesc)</entry></row><row><entry /><entry>throws VandaMessagingEnqueueException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public Object browse( ) throws VandaMessagingOperationNot</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>AllowedException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void setSendTimeout(int timeout) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingOperationNotAllowedException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void setReceiveTimeout(int timeout) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingOperationNotAllowedException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public boolean isMessageTimeoutSupported ( );</entry></row><row><entry /><entry>public boolean isReceiveTimeoutSupported ( );</entry></row><row><entry /><entry>public boolean isBrowseSupported ( );</entry></row><row><entry /><entry>public int getSendTimeout( ) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingOperationNotAllowedException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public int getReceiveTimeout( ) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingOperationNotAllowedException;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>public void releaseMessagingService( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0062] The above code refers to an object called Messaging Descriptor, which is a generic object that contains details about the messaging server <b>26</b>. Details like topic name, queue name, etc. can be stored into this object. This object is kept opaque at the listener level for purposes of generality, but are interpreted at the messaging service <b>26</b> plug-in.
[0063] The following code is a sample implementation of the plug in module using JMS messaging calls and a publish subscribe method for communication:
[0064] public class VandaMessagingJMSImplementation <tables id="TABLE-US-00006" num="6"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>implements VandaMessagingAPIInterface {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>.............</entry></row><row><entry /><entry>public void setMessagingDescriptor (VandaMessagingDescriptor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Interface mesgDesc)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>mesgDescriptor = mesgDesc;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>topicConnectionFactory =</entry></row><row><entry /><entry>new com.sun.messaging.TopicConnectionFactory</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="63PT" align="left" /><colspec colname="1" colwidth="154PT" align="left" /><tbody valign="top"><row><entry /><entry>(jmsAddress,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>mesgDescriptor.getPortNumber( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicConnection=</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>topicConnectionFactory.createTopicConnection(mesgDescriptor.</entry></row><row><entry>getUserID( ),mesgDescriptor.getPassword( ));</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicConnection.start( );</entry></row><row><entry /><entry>topicSessionEnqueue = topicConnection.createTopicSession</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>(false,1);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicSessionDequeue = topicConnection.createTopicSession</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>(false,1);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public VandaMessagingDescriptorInterface getMessagingDescriptor</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>( ){</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>return mesgDescriptor;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public void enqueue (Object data) throws VandaMessagingEnqueue</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>Exception{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>String topicName;</entry></row><row><entry /><entry>String consumerName;</entry></row><row><entry /><entry>consumerName = mesgDescriptor.getConsumerName( );</entry></row><row><entry /><entry>topicName = mesgDescriptor.getTopicName( );</entry></row><row><entry /><entry>topic = topicSessionEnqueue.createTopic(topicName);</entry></row><row><entry /><entry>topicPublisher = topicSessionEnqueue.createPublisher(topic);</entry></row><row><entry /><entry>objMessage = topicSessionEnqueue.createObjectMessage( );</entry></row><row><entry /><entry>enqueueflag=true;</entry></row><row><entry /><entry>objMessage.setObject((Serializable)data);</entry></row><row><entry /><entry>objMessage.setStringProperty(“ConsumerName”,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>consumerName);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicPublisher.publish(objMessage);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>/**</entry></row><row><entry /><entry> * enqueue(Object data ,String consumerName) puts the Message</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>Object into the messaging service with the</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry> * details got from the messaging descriptor and the consumerName.</entry></row><row><entry /><entry> */</entry></row><row><entry /><entry>public void enqueue (Object data, String consumerName) throws</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>VandaMessagingEnqueueException{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>String topicName;</entry></row><row><entry /><entry>topicName = mesgDescriptor.getTopicName( );</entry></row><row><entry /><entry>topic = topicSessionEnqueue.createTopic(topicName);</entry></row><row><entry /><entry>topicPublisher = topicSessionEnqueue.createPublisher(topic);</entry></row><row><entry /><entry>objMessage = topicSessionEnqueue.createObjectMessage( );</entry></row><row><entry /><entry>enqueueflag=true;</entry></row><row><entry /><entry>objMessage.setObject((Serializable)data);</entry></row><row><entry /><entry>objMessage.setStringProperty(“ConsumerName”,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>consumerName);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicPublisher.publish(objMessage);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public Object dequeue( ) throws VandaMessagingDequeueException{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>String topicName;</entry></row><row><entry /><entry>String consumerName;</entry></row><row><entry /><entry>topicName = mesgDescriptor.getTopicName( );</entry></row><row><entry /><entry>consumerName = mesgDescriptor.getConsumerName( );</entry></row><row><entry /><entry>topic = topicSessionDequeue.createTopic(topicName);</entry></row><row><entry /><entry>topicSubscriber = topicSessionDequeue.createSubscriber(topic,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>“ConsumerName = “+ consumerName +”” false);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>ObjectMessage objMessage = (ObjectMessage)topicSubscriber.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>receive( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>return objMessage.getObject( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public Object browse( ) throws VandaMessagingOperationNot</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>AllowedException {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>throw new VandaMessagingOperationNotAllowedException</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>(“G003”);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public boolean isMessageTimeoutSupported ( ){</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>return false;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public boolean isReceiveTimeoutSupported ( ){</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>return false;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public boolean isBrowseSupported ( ){</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>return false;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public void releaseMessagingService( ){</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>topicPublisher.close( );</entry></row><row><entry /><entry>topicSubscriber.close( );</entry></row><row><entry /><entry>topicSessionEnqueue.close( );</entry></row><row><entry /><entry>topicSessionDequeue.close( );</entry></row><row><entry /><entry>topicConnection.close( );</entry></row><row><entry /><entry>topicConnectionFactory = null;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>......................</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>TopicConnectionFactory</entry><entry>topicConnectionFactory;</entry></row><row><entry /><entry>TopicConnection</entry><entry>topicConnection;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="126PT" align="left" /><tbody valign="top"><row><entry /><entry>TopicSession</entry><entry>topicSession;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="84PT" align="left" /><colspec colname="2" colwidth="119PT" align="left" /><tbody valign="top"><row><entry /><entry>TopicPublisher</entry><entry>topicPublisher;</entry></row><row><entry /><entry>TopicSubscriber</entry><entry>topicSubscriber;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="3"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="77PT" align="left" /><colspec colname="2" colwidth="126PT" align="left" /><tbody valign="top"><row><entry /><entry>Topic</entry><entry>topic;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>VandaMessagingDescriptorInterface mesgDescriptor;</entry></row><row><entry /><entry>................</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0065] The business method used to add a listener is described below.
[0066] B. Adding a Messaging Event Listener
[0067] Event handlers can be instances of any class. To be an event handler, a class has to implement the VandaMessagingEventListener interface. By doing so, the instances of the class can handle events. The user needs to add a listener to the home interface reference retrieved as a result of the lookup operation or on a remote interface retrieved as a result of any operation performed on the home interface (step A-10). An example of the code for adding a listener is as follows:
[0068] ref.addListener (listener);
[0069] where ref is the home interface or remote interface reference and listener is the instance of any class which implements VandaMessagingEventListener. For example, it may be an instance of Listenerlmpl. <tables id="TABLE-US-00007" num="7"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>public class ListenerImpl implements VandaMessagingEventListener</entry></row><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>public void methodCompleted(VandaMessagingEvent resEvent)</entry></row><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>resEvent.getResult( ); //will return the result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public void exceptionOccurred(VandaMessagingEvent resEvent)</entry></row><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>// handle the exceptions</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0070] Listeners enable the client system to receive the results of any call without having to query for them. In a normal asynchronous scenario, the client system would have to query for the result of an asynchronous call during the time when the result is unknown. In the case of listeners, the user is able to obtain the result and process it without having to write code to query for the result.
[0071] The business method used to call a method on the bean is described below.
[0072] C. Calling a Method on the Bean
[0073] In the case of an asynchronous call to the enterprise bean, the call to any method on the reference might not be different from a normal invocation except that the return value for the asynchronous call might be different. For example, when the create() method is called on an enterprise bean's MessagingHomeInterface, a unique CallID is returned as opposed to the normal return value of a RemoteInterface (step A- 12). The code for the call is as follows:
[0074] long createCallId=ref.create(....);
[0075] where createCallld is the variable in which the CallID is stored and ref represents the home interface reference. This is done since asynchronous methods do not return a value immediately. In order to be able to identify the call at a later time, the call returns a unique ID. The client program can then use this ID to identify the result when it arrives.
[0076] D. Receiving and Processing the Result
[0077] Once an event has been generated (step A-14), the result in the case of an asynchronous invocation of a bean can return either the intended return value or an exception (step A-16). If the method invocation is successful, the methodCompleted( ) method of the listener is executed (A- 18) and if an exception occurred (step A- 17), the exceptionOccurred( ) method of the listener is executed. In the methodCompleted( ) method and the exceptionOccurred( ) method, the VandaMessagingEvent is passed as a parameter.
[0078] The VandaMessagingEvent class has the following three methods:
[0079] [a] getCallID() (step A-20)
[0080] This method returns the CallID that was generated when the client application called a particular method on the MessagingHomeInterface of the bean. This can be compared with the ID stored at the time of the bean method invocation to identify the call that generated this result.
[0081] [b] getsource( ) (step A-21)
[0082] This method returns the source of the event. For example, if the user had called the create( ) method on the MessagingAccountHomelnterface, this may return a string containing MessagingAccountHomelnterface:create. This string contains the name of the interface that contained the bean method called and the method name itself
[0083] [c] getResult( ) (step A-22)
[0084] The getResult( ) method returns the result of the method called on MessagingHomeInterface or MessagingRemoteInterface. In the case of a call on a MessagingHomelnterface, the MessagingRemoteInterface is returned as a result and in the case of a call on a MessagingRemoteInterface, the intended result is returned. In the case of an exception occurring, the exception is returned as the result value. For example, if the user had called a create( ) method on the MessagingAccountHomelnterface, the getResult( ) will return an instance of the MessagingAccountRemoteInterface object. The user can then add an event listener using the method addlistener() to this MessagingAccountRemotelnterface again and call any business method asynchronously.
[0085] 2. Bean side implementation
[0086] To deploy any bean in any implementation of the interface of the present invention, there are no restrictions on the bean developer. Any EJB compliant bean can be deployed when implementing the interface of the present invention.
[0087] 3. API Reference—Asynchronous Interface and Class
[0088] The following interfaces and class are used by the client applications:
[0089] package client.messaging
[0090] Interfaces
[0091] public interface VandaMessagingEventListener
[0092] The above interface may be implemented by the client system, i.e., the client program. There may be occasions when a bean may call another bean asynchronously. In such cases the following interface is implemented by the calling bean. This interface defines the methods that allow the client to receive and process the result. The method is:
[0093] public void methodCompleted (VandaMessagingEvent resEvent)
[0094] The above method is called by the client side library to inform the client program that the result of a particular call has arrived.
[0095] public void exceptionOccurred(VandaMessagingEvent resEvent)
[0096] The above method is called by the client side library to inform the client program that the particular call has caused an exception.
[0097] Classes
[0098] public class VandaMessagingEvent
[0099] The above class is passed as an argument to the methodCompleted and exceptionOccurred methods of the VandaMessagingEventListener object. This class provides the calls to receive and process the result. The public method in this class is:
[0100] public Object getsource( )
[0101] The above method returns the source of the event in the string from classname:methodname.
[0102] public long getCallID( )
[0103] The above method returns the CallID associated with the call for which the result has arrived, i.e., the call that has caused this event.
[0104] public Object getResult( ) throws Exception
[0105] The above method returns the result of the method called previously (identified by CallID) or it triggers an exception in the event an exception occurred while executing the method. In the case of an exceptionOccurred in the VandaMessagingListener class, an exception may be triggered; however, an exception is generally not triggered by the methodCompletedo method.
[0106] 4. Example
[0107] The following code defines an Account Bean: <tables id="TABLE-US-00008" num="8"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><thead><row><entry /><entry /></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>public class AccountBean implements EntityBean {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>public void ejbCreate(String accountId, double</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>initialBalance, String type)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>{</entry></row><row><entry /><entry>}</entry></row><row><entry /><entry>public double getBalance ( )</entry></row><row><entry /><entry>{</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="70PT" align="left" /><colspec colname="1" colwidth="147PT" align="left" /><tbody valign="top"><row><entry /><entry>return balance;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="56PT" align="left" /><colspec colname="1" colwidth="161PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="42PT" align="left" /><colspec colname="1" colwidth="175PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry namest="OFFSET" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0108] To create an account asynchronously using Account Bean, the create( ) method on Account Bean accepts three parameters—Name, Type of Account and Amount. The method is executed and depending on the outcome either the exceptionOccurred or the methodCompleted method is called. The following client-side code results in an asynchronous invocation on the Account Bean.
[0109] public class MyClient implements <tables id="TABLE-US-00009" num="9"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><thead><row><entry /></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>VandaMessagingEventListener {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>public myClass ( ) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>InitialContext ctx = new InitialContext ( );</entry></row><row><entry /><entry>AsyncMessagingAccountHomeInterface ref =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>(AsyncMessagingAccountHomeInterface) ctx.lookup</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>(“vms://AccountHomeInterface”);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>//Add listener to this reference</entry></row><row><entry /><entry>ref.addListener (this);</entry></row><row><entry /><entry>//create( ) method of Account Bean accepts three parameters Name,</entry></row><row><entry /><entry>Type of account and Amount</entry></row><row><entry /><entry>createID = ref.create (“Michael”, “C/A”, 1000);</entry></row><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>public void methodCompleted (VandaMessagingEvent event) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>if (event.getCallID == createID) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>System.out.println (“record created”); // method was successful</entry></row><row><entry /><entry>try {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>remoteObject = (AsyncMessagingAccountRemoteInterface)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="35PT" align="left" /><colspec colname="1" colwidth="182PT" align="left" /><tbody valign="top"><row><entry /><entry>event.getResult( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>catch (Exception e) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>e.printStackTrace ( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>public void exceptionOccurred (VandaMessagingEvent event) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>if(event.getCallID ( ) == createID) {// Exception occurred?</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>System.out.println (“exception creating account”);</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>try {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>remote = (AsyncMessagingAccountRemoteInterface)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="28PT" align="left" /><colspec colname="1" colwidth="189PT" align="left" /><tbody valign="top"><row><entry /><entry>event.getResult ( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row><row><entry /><entry>catch (Exception e) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="21PT" align="left" /><colspec colname="1" colwidth="196PT" align="left" /><tbody valign="top"><row><entry /><entry>// getResult throws an error that can be handled accordingly</entry></row><row><entry /><entry>system.out.println (“Exception Occurred;” - e.getMessage ( ))</entry></row><row><entry /><entry>e.printStackTrace ( );</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="14PT" align="left" /><colspec colname="1" colwidth="203PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>}</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry>public static void main (String [ ] args) {</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="OFFSET" colwidth="7PT" align="left" /><colspec colname="1" colwidth="210PT" align="left" /><tbody valign="top"><row><entry /><entry>MyClass my = new MyClass ( );</entry></row><row><entry /><entry>/* do something else */</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217PT" align="left" /><tbody valign="top"><row><entry>}</entry></row><row><entry>//private variables</entry></row><row><entry>private long createID;</entry></row><row><entry>private AsyncMessagingAccountRemoteInterface remoteObject;</entry></row><row><entry>}</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
[0110] Implementing the Interface To Achieve Asynchronous Method Invocations
[0111] The present invention provides an interface that can be used with commercially available servers to achieve asynchronous method invocations at the container level. One method of implementing the interface of the present invention to achieve asynchronous method invocations entails the following steps:
[0112] 1. Implement the server side communication protocol using an underlying messaging service like Oracle AQ, IBM MQ Series, JMS Implementations, etc.
[0113] 2. Implement communication between client system and server using a client side library and the services of a messaging service like Oracle AQ, IBM MQ Series, JMS Implementations, etc.
[0114] 3. Transparently generate asynchronous and synchronous implementations at the time of deployment of the bean in the implementation.
[0115] The foregoing detailed description of the present invention is provided for the purposes of illustration and is not intended to be exhaustive or to limit the invention to the precise embodiment disclosed. Accordingly, the scope of the present invention is defined by the following claims.
Contents6
10 sheets
Sheet 1 Sheet 2 Sheet 3 Sheet 4 Sheet 5 Sheet 6 Sheet 7 Sheet 8 Sheet 9 Sheet 10
Every citation, both ways
| Document | Relation | Office | Cited during |
|---|---|---|---|
| US7299454B2 | Cited by | United States of America | Applicant |
| US2007100957A1 | Cited by | United States of America | Pre-grant |
| US2003093402A1 | Cited by | United States of America | Pre-grant |
| US7797669B1 | Cited by | United States of America | Applicant |
| US7249157B2 | Cited by | United States of America | Applicant |
| US2005114771A1 | Cited by | United States of America | Pre-grant |
| US7584474B2 | Cited by | United States of America | Applicant |
| US2005034104A1 | Cited by | United States of America | Pre-grant |
| US2004010611A1 | Cited by | United States of America | Pre-grant |
| US7350184B2 | Cited by | United States of America | Applicant |
| US2003105884A1 | Cited by | United States of America | Pre-grant |
| US7519976B2 | Cited by | United States of America | Search report |
| US2004221261A1 | Cited by | United States of America | Pre-grant |
| US7293038B2 | Cited by | United States of America | Applicant |
| US2003182452A1 | Cited by | United States of America | Pre-grant |
| US2008222164A1 | Cited by | United States of America | Pre-grant |
| US2004187127A1 | Cited by | United States of America | Pre-grant |
| US7257645B2 | Cited by | United States of America | Applicant |
| US2007074066A1 | Cited by | United States of America | Pre-grant |
| US7260819B2 | Cited by | United States of America | Search report |
| US2005240902A1 | Cited by | United States of America | Pre-grant |
| US2007199002A1 | Cited by | United States of America | Pre-grant |
| US2004006663A1 | Cited by | United States of America | Pre-grant |
| US2004236780A1 | Cited by | United States of America | Pre-grant |
| US7984437B2 | Cited by | United States of America | Applicant |
| US2002188764A1 | Cited by | United States of America | Pre-grant |
| US2005108682A1 | Cited by | United States of America | Pre-grant |
| US2004049481A1 | Cited by | United States of America | Pre-grant |
| US8161168B2 | Cited by | United States of America | Search report |
| US6915519B2 | Cited by | United States of America | Search report |
| US7703077B2 | Cited by | United States of America | Search report |
| US7752599B2 | Cited by | United States of America | Applicant |
| US2004168153A1 | Cited by | United States of America | Pre-grant |
| US2004230955A1 | Cited by | United States of America | Pre-grant |
| US8478898B2 | Cited by | United States of America | Applicant |
| US2003014554A1 | Cited by | United States of America | Pre-grant |
| US2003041050A1 | Cited by | United States of America | Pre-grant |
| US7418475B2 | Cited by | United States of America | Applicant |
| US2003204641A1 | Cited by | United States of America | Pre-grant |
| US2004015859A1 | Cited by | United States of America | Pre-grant |
| US2002161688A1 | Cited by | United States of America | Pre-grant |
| US8572201B2 | Cited by | United States of America | Applicant |
| US2007150598A1 | Cited by | United States of America | Pre-grant |
| US2003093470A1 | Cited by | United States of America | Pre-grant |
| US2007288920A1 | Cited by | United States of America | Pre-grant |
| US2007106691A1 | Cited by | United States of America | Pre-grant |
| US2004250241A1 | Cited by | United States of America | Pre-grant |
| US6542845B1 | Cited by | United States of America | Search report |
| US2003079029A1 | Cited by | United States of America | Pre-grant |
| US2007106815A1 | Cited by | United States of America | Pre-grant |
| US2003217332A1 | Cited by | United States of America | Pre-grant |
| US7793113B2 | Cited by | United States of America | Applicant |
| US2009313338A1 | Cited by | United States of America | Pre-grant |
| US2004225995A1 | Cited by | United States of America | Pre-grant |
| US2005102978A1 | Cited by | United States of America | Pre-grant |
| CN100405300C | Cited by | China | Search report |
| US2004006550A1 | Cited by | United States of America | Pre-grant |
| US2011016203A1 | Cited by | United States of America | Pre-grant |
| US2005240863A1 | Cited by | United States of America | Pre-grant |
| US8166095B2 | Cited by | United States of America | Search report |
| US2005044173A1 | Cited by | United States of America | Pre-grant |
| US2005044537A1 | Cited by | United States of America | Pre-grant |
| US2002013759A1 | Cited by | United States of America | Pre-grant |
| US2004034859A1 | Cited by | United States of America | Pre-grant |
| US2006080676A1 | Cited by | United States of America | Pre-grant |
| US9922031B2 | Cited by | United States of America | Search report |
| US2005022164A1 | Cited by | United States of America | Pre-grant |
| US2002144014A1 | Cited by | United States of America | Pre-grant |
| US2004068728A1 | Cited by | United States of America | Pre-grant |
| US2003229888A1 | Cited by | United States of America | Pre-grant |
| US2003093403A1 | Cited by | United States of America | Pre-grant |
| US8046772B2 | Cited by | United States of America | Applicant |
| US2005010902A1 | Cited by | United States of America | Pre-grant |
| US7954085B2 | Cited by | United States of America | Search report |
| US6292933B1 | Cites | United States of America | Pre-grant |
| US6425017B1 | Cites | United States of America | Pre-grant |
| US6611498B1 | Cites | United States of America | Pre-grant |
13 members in 3 offices
Priority claims10
| Document | Office | Kind | Date |
|---|---|---|---|
| 19300300 | United States of America | P | |
| 19300300 | United States of America | P | |
| 19300700 | United States of America | P | |
| 19300700 | United States of America | P | |
| 81548101 | United States of America | A | |
| 60193003 | – | – | – |
| 60193007 | – | – | – |
| US20000193003P | – | – | – |
| US20000193007P | – | – | – |
| US20010815481 | – | – | – |
Members13
| Document | Office | Kind | |
|---|---|---|---|
| WO0173547A2 | World Intellectual Property Organization (WIPO) | A2 | |
| WO0173550A2 | World Intellectual Property Organization (WIPO) | A2 | |
| WO0173551A2 | World Intellectual Property Organization (WIPO) | A2 | |
| AU4597601A | Australia | A | |
| AU4940201A | Australia | A | |
| AU4942401A | Australia | A | |
| US2002004848A1 | United States of America | A1 | |
| US2002004850A1 | United States of America | A1 | |
| US2002004856A1 | United States of America | A1 | |
| WO0173547A3 | World Intellectual Property Organization (WIPO) | A3 | |
| WO0173551A3 | World Intellectual Property Organization (WIPO) | A3 | |
| WO0173550A3 | World Intellectual Property Organization (WIPO) | A3 | |
| US2004205771A1 | United States of America | A1 |
17 transactions on the USPTO file
Abandoned after 1 non-final rejection.
- Non-final rejections
- 1
- Final rejections
- 0
- RCEs
- 0
- Appeals
- 0
Over time
Point at a mark for the transactionTransactions
| Event | |
|---|---|
| Mail Abandonment for Failure to Respond to Office ActionAbandoned | |
| Aband. for Failure to Respond to O. A. | |
| Case Docketed to Examiner in GAU | |
| Mail Non-Final RejectionNon-final rejection | |
| Non-Final RejectionNon-final rejection | |
| Case Docketed to Examiner in GAU | |
| Case Docketed to Examiner in GAU | |
| Case Docketed to Examiner in GAU | |
| Case Docketed to Examiner in GAU | |
| Information Disclosure Statement (IDS) Filed | |
| Information Disclosure Statement (IDS) Filed | |
| Information Disclosure Statement (IDS) Filed | |
| Information Disclosure Statement (IDS) Filed | |
| Application Dispatched from OIPE | |
| Correspondence Address Change | |
| IFW Scan & PACR Auto Security Review | |
| Initial Exam Team nn |
6 legal events, as the office reported them to INPADOC
Over the term
Point at a mark for the eventEvents
| Event | Code | |
|---|---|---|
| Information on status: application discontinuationABANDONED -- FAILURE TO RESPOND TO AN OFFICE ACTIONSTCB | STCB | |
| AssignmentAS | AS | |
| AssignmentAS | AS | |
| AssignmentAS | AS | |
| AssignmentAS | AS | |
| AssignmentAS | AS |
Numbers
- Publication, DOCDB
- 2002004848
- Publication, EPODOC
- US2002004848
- Application
- 9815481
- Application, DOCDB
- 81548101
- Application, EPODOC
- US20010815481
Titles
- English
- System and method of providing an asynchronous interface between a client system and an enterprise javabeans-enabled server
Classification
- CPC, 5
- G06F9/546
- G06F8/30
- G06F9/465
- G06F9/541
- G06F9/548
- IPC, 5
- G06F9 00
- G06F9 44
- G06F9 46
- G06F9 54
- G06F15 163
- USPC, 1
- 719310000