I have a customer asked me about how to debug EDN. This blog will show
you how to debug EDN and the tools that can be used to debug EDN.
1. Using EDN-DB-LOG
comes with a useful EDN DB logging servlet to view logging information
generated by the EDN component. It is only
available for END-DB which is based on AQ, it will not work for EDN with
JMS. The servlet uses a table called
“EDN_LOG_MESSAGES” in SOA_INFRA schema. It logs the operation on “main”
operation of event_queue and oaoo-queue with timestamp information.
default URL is http://<host_name>:<port_number>/soa-infra/events/edn-db-log. In this servlet, you can enable, disable and
clear logs but you need to have the administrative role in order to access the servlet. This is a good tool to use to display dynamic
counts of un-deq'ed events (potentially "stuck") in the
"main" and "OAOO" queues. The log
also provides information of EDN bus when it is being connected to
AQ-DB. In the screenshot below,
“EVENT_SEQ:202” shows that the EDN bus is being started.
When the logging is enabled, the EDN_LOG_MESSAGES table will be populated with messages until the logging is
disabled, so it is inadvisable to leave logging turned on for large amounts of
events. It is recommended to clear the log regularly.
in the log are grouped together. Usually the first line in the group will
indicate what operation is being performed, and the event sequence number is
used to group the messages together and each group will be highlighted using
the same color (e.g. enqueuing an event or handling an event that has been
dequeued). In the screenshots below, “EVENT_SEQ:204” is dequeuing an event
and “EVENT_SEQ:205” is enqueuing an event.
2. Database tables
second method is to examine the database table. You can check on count of potentially “stuck” events currently in the
following queue tables:
– This table is for “EDN_EVENT_QUEUE” AQ. Every event published is temporarily enqueued into this table.
– This table only stores the event with “OAOO” (one-and-only-one) delivery
target(s). The event is temporarily
enqueued into this table for END_OAOO_QUEUE AQ.
For event with OAOO delivery target, it travels through both tables,
first it is stored in EDN_EVENT_QUEUE_TABLE and then in
This example shows the event
enq'ed in "edn_event_queue".
Another alternative is to check the count from the following
There are two rows for every event enqueued into "edn_event_queue".
There is one row for every event enqueued into
This example shows
further details about that event which is deq'ed by the subscribers of
shows the state of the message. The
states are listed in the table below:
The message is ready
to be processed, i.e., either the delay
time of the message has passed or the message did not have a delay time
The delay specified by
message_properties_t.delay while executing dbms_aq.enqueue has not been
The message has been
successfully processed (dequeued) but will remain in the queue until the
retention_time specified for the queue while executing
dbms_aqadm.create_queue has been reached.
The message was not
successfully processed (dequeued) in either 1) the time specified by
message_properties_t.expiration while executing dbms_aq.enqueue or 2) the
maximum number of dequeue attempts (max_retries) specified for the queue
while executing dbms_aqadm.create_queue.
enqueued by a Streams Capture process
subscriber type is equal to 2 when there is no subscribers to the message, and
there is no transaction id due to invalid transaction, it will be marked as
state message is expired, the AQ$EDN_EVENT_QUEUE_TABLE.EXPIRATION_REASON will be populated with one of the
to be cleaned up later
3. Server Logs
third method is using EM log configuration and log viewer. There are few logger names related the EDN:
You can set log level
to one of the following to capture more details:
- TRACE:1 (FINE) - Logging the event content details, XPath filter results, event enqueue, dequeue, publish and send operations
- TRACE:16 (FINER) – Logging the begin, commit and rollback statements of XA transaction (for OAOO) and retry count.
- TRACE:32 (FINEST) - All above.
The log level changes take effect immediately without server
restart. However, if you want the changes
to persist after server restart, make sure to check on the “Persist Log Level
State Across Component Restarts” prior to server restart.
At FINER or FINEST level, you may see loggings like "Began XA
for OAOO." and "Rolled back XA for OAOO." These are normal
messages of OAOO event delivery when there are no events waiting to be
delivered. They are NOT errorred
conditions. You may turn off these messages by setting the Java logging level
to "TRACE:1 (FINE)" or a higher value. All detailed logging goes into
SOA server's diagnostic.log file configured in EM. Below is a snippet of
the diagnostic log showing the event delivery to an OAOO subscriber:
[SRC_METHOD: finerBeganXA] Began XA for OAOO.
fineEventPublished] Received event: Subject: ... Sender: .... Event: ...
fineFilterResults] Filter [XPath Filter: …] for
subscriber "..." returned true/false
fineDequeuedEvent] Dequeued event, Subject: ... [source type ..]:
fineOAOOEnqueuedEvent] Enqueued OAOO event, Subject: ... [source: ..., target:
... ]: business-event...
fineOAOODequeuedEvent] Dequeued OAOO event, Subject: ... [source: ..., target:
finerInsertedTryCount] Inserted try count for msgId: .... Status: ...
finerRemovedTryCount] Removed try count for msgId: ...
fineSentOAOOEvent] Sent OAOO event [QName: ... to target: ...]:
fineCommittedOAOODelivery] Committed OAOO Delivery, Subject: ... [source: ...,
target: ...]: business-event...
finerBeganXA] Began XA for OAOO.
finerRolledbackXA] Rolled back XA for OAOO.
In some cases, more
than one method may be necessary to assist in the debugging process. Below is a
comparison of server and DB logging that might help you in evaluating and
determining which method(s) is/are most suitable in your environment.
- EDN will generate standard Java logging messages when events are
published, when they are pulled from persistent storage and when they are
- The logger used by EDN depends on the implementation. For
instance, EDN-DB uses "oracle.integration.platform.blocks.event.saq"
and EDN-JMS uses "oracle.integration.platform.blocks.event.jms".
- As in all Java logging, messages are written at different log
levels from ERROR to FINEST. The most detailed messages (including the event
body) use FINEST.
- Loggers can also be configured in logging.xml in your config
- If you are using EDN-DB, a lot of debugging information may not be
accessible due to the many activities that occurred in the database which
couldn’t be logged in the server. Hence, a servlet web page that accesses the
debug logging table is implemented to assist the debugging process. The page is
located at: http://hostname:port/soa-infra/events/edn-db-log and you do need to have administrative role to access the servlet
- There are commands on the servlet web page to enable and disable
logging and for clearing the log table. The table will be filled with messages,
so it is inadvisable to leave logging turned on for large amounts of events. It
is recommended to clear the log regularly.
- Messages in the log are grouped together. Usually the first line
in the group will indicate what operation is being performed (e.g. enqueuing an
event or handling an event that has been dequeued).