CICS
Since Camel 4.10
Only producer is supported
This component allows you to interact with CICS ® general-purpose transaction processing subsystem.
Maven users will need to add the following
dependency to their
pom.xml
for this component:
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>camel-cics</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
|
Only synchronous mode calls are supported. |
URI format
cics://[interfaceType]/[dataExchangeType][?options]
Where
interfaceType
is the CICS set
of the external API that this component will
invoke.
At the moment, only ECI (External Call
Interface) is supported.
This component can communicate with CICS server
using two kinds of
dataExchangeType
-
commareais a block of storage, limited to 32763 bytes, allocated by the program. -
channelis the new mechanism for exchanging data, analogous to a parameter list.
By default, if
dataExchangeType
is
not specified, this component use
commarea
:
cics://eci?host=xxx&port=xxx...
To use
channel
and container you
must specify it explicitly in the URI
cics://eci/channel?host=xxx&port=xxx...
Samples
Use COMMAREA
In the following sample we configure a route
that run a program on a CICS server
using COMMAREA. The COMMAREA size has to be
defined in
CICS_COMM_AREA_SIZE
header, while the COMMAREA input data is
defined in the Camel Exchange body.
|
You must create a COMMAREA that is large enough to contain all the information to be sent to the server and large enough to contain all the information that can be returned from the server. |
//.....
import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER;
import static com.redhat.camel.component.cics.CICSConstants.CICS_COMM_AREA_SIZE_HEADER;
//....
from("direct:run").
setHeader(CICS_PROGRAM_NAME_HEADER, "ECIREADY").
setHeader(CICS_COMM_AREA_SIZE_HEADER, 18).
setBody(constant("My input data")).
to("cics:eci/commarea?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");
The Outcome of the CICS program invocation is mapped to Camel Exchange in this way:
-
The numeric value of return code is stored in the
CICS_RETURN_CODEheader -
The COMMAREA output data is stored in the Caamel Exchange Body.
Use Channel with a single input container
In the sample below we use a channel with a single container to run a CICS program. The channel name and the container name are taken from headers, and the container value from the body:
//.....
import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER;
import static com.redhat.camel.component.cics.CICSConstants.CICS_CHANNEL_NAME_HEADER;
import static com.redhat.camel.component.cics.CICSConstants.CICS_CONTAINER_NAME_HEADER;
//...
from("direct:run").
setHeader(CICS_PROGRAM_NAME_HEADER, "EC03").
setHeader(CICS_CHANNEL_NAME_HEADER, "SAMPLECHANNEL").
setHeader(CICS_CONTAINER_NAME_HEADER, "INPUTDATA").
setBody(constant("My input data")).
to("cics:eci/channel?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");
The container(s) returned is stored in an
java.util.Map<String,Object>
,
the key is the container name and the
value is the output data of the container.
Use Channel with multiple input container
If you need to run a CICS program that takes
multiple container as input, you can create
a
java.util.Map<String,Object>
where the keys are the container names and
the values are the input data.
In this case the
CICS_CONTAINER_NAME
header is
ignored.
//.....
import static com.redhat.camel.component.cics.CICSConstants.CICS_PROGRAM_NAME_HEADER;
import static com.redhat.camel.component.cics.CICSConstants.CICS_CHANNEL_NAME_HEADER;
//...
from("direct:run").
setHeader(CICS_PROGRAM_NAME_HEADER, "EC03").
setHeader(CICS_CHANNEL_NAME_HEADER, "SAMPLECHANNEL").
process(exchange->{
byte[] thirdContainerData = HexFormat.of().parseHex("e04fd020ea3a6910a2d808002b30309d");
Map<String,Object> containers = Map.of(
"firstContainerName", "firstContainerData",
"secondContainerName", "secondContainerData",
"thirdContainerName", thirdContainerData
);
exchange.getMessage().setBody(containers);
}).
to("cics:eci/channel?host=192.168.0.23&port=2006&protocol=tcp&userId=foo&password=bar");