Threads and tasks example
If your CICS®
Java™ application is running within an OSGi or Liberty
environment, you can run work under a separate thread on a separate CICS task/transaction by using the
CICSExecutorService
.
Submit a Java Runnable or Callable object to the Executor
service and the submitted application code will run on a separate thread under a new CICS task. Unlike normal threads created from Java, Executor controlled threads have access to the JCICS API and CICS
services. In a CICS OSGi or Liberty environment you can use
standard OSGi APIs to find the CICSExecutorService
, or you can use the JCICS API
convenience method CICSExecutorService.runAsCICS()
, which finds the service and
submits the Runnable or Callable object on your behalf.
Note: For non-HTTP requests in Liberty, a CICS task is
created only when the first JCICS or JDBC DataSource with type 2 connectivity call is made.
The following example shows an excerpt of a Java
class that submits a Runnable piece of application code to the
CICSExecutorService
.
The application code simply writes to a CICS
TSQ.public class ExecutorTest
{
public static void main(String[] args)
{
// Inline the new Runnable class
class CICSJob implements CICSTransactionRunnable
{
public void run()
{
// Create a temporary storage queue
TSQ test_tsq = new TSQ();
test_tsq.setType(TSQType.MAIN);
// Set the TSQ name
test_tsq.setName("TSQWRITE");
// Write to the temporary storage queue
// Use the CICS region local CCSID so it is readable
String test_string = "Hello from a non CICS Thread - "+ threadId;
try
{
test_tsq.writeItem(test_string.getBytes(System.getProperty("com.ibm.cics.jvmserver.local.ccsid")));
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public String getTranid()
{
// *** This transaction id should be installed and available ***
return "IJSA";
}
}
// Create and run the new CICSJob Runnable
Runnable task = new CICSJob();
CICSExecutorService.runAsCICS(task);
}
}