Saturday, February 25, 2012

matching inbound and outbound messages

When you begin a dialog, you do so between source and target. A conversation is begun on both source and target, and messages flow between the two. What would cause messages to build up on the source in sys.transmission_queue and not get transmitted to the target, with no error in the transmission_status column of sys.transmission_queues? The dialogs on the source have a state of 'co', indicating that messages should be flowing....

I checked the status of the queue I am having a problem with in sys.service_queues; all my queues have the is_receive_enabled and is_enqueue_enabled set to 1. I altered the state of the endpoint on each server to started, even though they were already started. I visited remus's blog and went down the checklist of things to look for when troubleshooting dialogs.

I attached the profiler to both source and target. Didnt see anything on the source to indicate an error (textdata simply said conversing for EventClass Broker:Conversation, and nothing for EventClass Broker:MessageClassify)

On the target I see stuff related to service broker, but no errors.

I created new dialogs between the source and the target and they are working fine.

What else do I need to check? Is there any way to see what sender conversation maps to which target conversation? Is there anyway to move messages from one conversation to another conversation (not to another conversation group)?

Thanks

Do you have the security events turned on in the profiler as well as the broker events? I suspect you are failing a security check of some kind. You will have to enable the security events in the profiler to see this.

-Gerald

|||

The dialog_id in sys.conversation_endpoints is the same on both the initiator and the target conversation endpoints.

The event Gerald is talking about is 'Security Security/Audit Broker Conversation' (i.e. it is in the 'Seucrity Audit' section).

HTH,
~ Remus

|||

Thanks.

This information was useful.

For clarification purposed, when I end the target end of a conversation, shouldnt the status of the source end of the conversation change? to 'do'? Should I still be able to send messages on the source end, and see nothing in the transmission_status column of sys.transmission_queue?

|||

When one ends one conversation endpoint, an 'end dialog' message is sent to the other conversation endpoint. As soon as this message reaches the other conversation endpoint that endpoint will change status to 'DO'.

After one ends a conversation, it cannot send messages or receive messages from/to it anymore.
After one receives an 'end dialog' message there is no reason to send anymore messages, since the peer has already announced that the conversation is ended from his point of views. Typically applications should react to an 'end dialog' message by ending the local endpoint of the conversation (using END CONVERSATION). Message still in transmission_queue will be cleaned up.

Whether it is valid for an application to end a conversation while there are still messages to be delivered, this depends on the application semantics. But we must guarantee that after one issued an END CONVERSATION it will never receive a message from this conversation. W/o this guarantee it would be very difficult to write Service Broker apps.

HTH,
~ Remus

No comments:

Post a Comment