You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Dennis Walter <de...@outlook.com> on 2013/08/19 09:38:44 UTC

Copy JMS headers from request to response in CXF

Hi,

In a SOAP over JMS setting using CXF 2.6.9, I have to copy non-standard JMS headers from the request to the response (on the server side). Unfortunately, I cannot find any documentation or hints on how to do that. I looked at the implementation of JMSDestination, where it looks as if I cannot do this at all. Ideally, I'd use an interceptor. Can anyone help?

Background: our enterprise service bus uses several connected "ESB clusters" and requires that all responses in a web service via SOAP over JMS MUST contain a certain set of custom-made JMS headers (e.g., "com_myenterprise_esb_state") copied 1-to-1 from the request. This requirement is not negotiable. 

We are using CXF 2.6.9, Websphere MQ 7.0.1.3, JBoss EAP 6.1.

Many thanks!
 		 	   		  

RE: Copy JMS headers from request to response in CXF

Posted by Dennis Walter <de...@outlook.com>.

> Date: Mon, 19 Aug 2013 11:04:49 +0300
> From: sberyozkin@gmail.com
> To: users@cxf.apache.org
> Subject: Re: Copy JMS headers from request to response in CXF
> 
> On 19/08/13 10:57, Dennis Walter wrote:
> >>> In a SOAP over JMS setting using CXF 2.6.9, I have to copy non-standard JMS headers from the request to the response (on the server side). Unfortunately, I cannot find any documentation or hints on how to do that. I looked at the implementation of JMSDestination, where it looks as if I cannot do this at all. Ideally, I'd use an interceptor. Can anyone help?
> >>>
> >>> Background: our enterprise service bus uses several connected "ESB clusters" and requires that all responses in a web service via SOAP over JMS MUST contain a certain set of custom-made JMS headers (e.g., "com_myenterprise_esb_state") copied 1-to-1 from the request. This requirement is not negotiable.
> >>>
> >>> We are using CXF 2.6.9, Websphere MQ 7.0.1.3, JBoss EAP 6.1.
> >> As far as I recall, all JMS headers will be available as
> >> Message.PROTOCOL_HEADERS map property on the inbound message, so what
> >> you can do is to add an outbound CXF interceptor which will do
> >>
> >> Message inMessage = outMessage.getExchange().getInMessage();
> >>
> >> then get the in headers from it and copy the required ones to the response
> >>
> > What phase would I have to add this interceptor to?  PRE_PROTOCOL?
> I guess any phase before MARSHAL will do, as headers would typically be 
> written out before the marshaling is done, but I'm not sure about JMS...
> 
Your solution works! You saved my day.
For reference, this is what I did to achieve copying of JMS headers from SOAP request to response:

In my applicationContext.xml, I added an outInterceptor to the jaxws:endpoint
      <jaxws:outInterceptors>
        <ref bean="webservice.soapJmsTimbOutInterceptor" />
      </jaxws:outInterceptors>

The interceptor class extends AbstractPhaseInterceptor<SoapMessage> and overrides handleMessage to set the configured Headers (List<String> includeHeadersList) as follows:

    @SuppressWarnings("unchecked")
    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        Map<String, List<String>> outHeaders =
                (Map<String, List<String>>)message.get(Message.PROTOCOL_HEADERS);
        if (outHeaders == null) {
            outHeaders = new TreeMap<String, List<String>>();
            message.put(Message.PROTOCOL_HEADERS, outHeaders);
        }
        Message inMessage = message.getExchange().getInMessage();
        Map<String, List<String>> inHeaders =
                (Map<String, List<String>>)inMessage.get(Message.PROTOCOL_HEADERS);
        if (inHeaders != null) {
            for (String header : includeHeadersList) {
                if (inHeaders.containsKey(header)) {
                    outHeaders.put(header, inHeaders.get(header));
                }
            }
        }
    }

> Cheers, Sergey
> 
> > Thank you!
> >
> >> HTH, Serggey
> >>>
> >>> Many thanks!
> >>>    		 	   		
> >>>
> >>
> >   		 	   		
> >
> 
 		 	   		  

Re: Copy JMS headers from request to response in CXF

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 19/08/13 10:57, Dennis Walter wrote:
>>> In a SOAP over JMS setting using CXF 2.6.9, I have to copy non-standard JMS headers from the request to the response (on the server side). Unfortunately, I cannot find any documentation or hints on how to do that. I looked at the implementation of JMSDestination, where it looks as if I cannot do this at all. Ideally, I'd use an interceptor. Can anyone help?
>>>
>>> Background: our enterprise service bus uses several connected "ESB clusters" and requires that all responses in a web service via SOAP over JMS MUST contain a certain set of custom-made JMS headers (e.g., "com_myenterprise_esb_state") copied 1-to-1 from the request. This requirement is not negotiable.
>>>
>>> We are using CXF 2.6.9, Websphere MQ 7.0.1.3, JBoss EAP 6.1.
>> As far as I recall, all JMS headers will be available as
>> Message.PROTOCOL_HEADERS map property on the inbound message, so what
>> you can do is to add an outbound CXF interceptor which will do
>>
>> Message inMessage = outMessage.getExchange().getInMessage();
>>
>> then get the in headers from it and copy the required ones to the response
>>
> What phase would I have to add this interceptor to?  PRE_PROTOCOL?
I guess any phase before MARSHAL will do, as headers would typically be 
written out before the marshaling is done, but I'm not sure about JMS...

Cheers, Sergey

> Thank you!
>
>> HTH, Serggey
>>>
>>> Many thanks!
>>>    		 	   		
>>>
>>
>   		 	   		
>


RE: Copy JMS headers from request to response in CXF

Posted by Dennis Walter <de...@outlook.com>.
> > In a SOAP over JMS setting using CXF 2.6.9, I have to copy non-standard JMS headers from the request to the response (on the server side). Unfortunately, I cannot find any documentation or hints on how to do that. I looked at the implementation of JMSDestination, where it looks as if I cannot do this at all. Ideally, I'd use an interceptor. Can anyone help?
> >
> > Background: our enterprise service bus uses several connected "ESB clusters" and requires that all responses in a web service via SOAP over JMS MUST contain a certain set of custom-made JMS headers (e.g., "com_myenterprise_esb_state") copied 1-to-1 from the request. This requirement is not negotiable.
> >
> > We are using CXF 2.6.9, Websphere MQ 7.0.1.3, JBoss EAP 6.1.
> As far as I recall, all JMS headers will be available as 
> Message.PROTOCOL_HEADERS map property on the inbound message, so what 
> you can do is to add an outbound CXF interceptor which will do
> 
> Message inMessage = outMessage.getExchange().getInMessage();
> 
> then get the in headers from it and copy the required ones to the response
> 
What phase would I have to add this interceptor to?  PRE_PROTOCOL?
Thank you!

> HTH, Serggey
> >
> > Many thanks!
> >   		 	   		
> >
> 
 		 	   		  

Re: Copy JMS headers from request to response in CXF

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 19/08/13 10:38, Dennis Walter wrote:
> Hi,
>
> In a SOAP over JMS setting using CXF 2.6.9, I have to copy non-standard JMS headers from the request to the response (on the server side). Unfortunately, I cannot find any documentation or hints on how to do that. I looked at the implementation of JMSDestination, where it looks as if I cannot do this at all. Ideally, I'd use an interceptor. Can anyone help?
>
> Background: our enterprise service bus uses several connected "ESB clusters" and requires that all responses in a web service via SOAP over JMS MUST contain a certain set of custom-made JMS headers (e.g., "com_myenterprise_esb_state") copied 1-to-1 from the request. This requirement is not negotiable.
>
> We are using CXF 2.6.9, Websphere MQ 7.0.1.3, JBoss EAP 6.1.
As far as I recall, all JMS headers will be available as 
Message.PROTOCOL_HEADERS map property on the inbound message, so what 
you can do is to add an outbound CXF interceptor which will do

Message inMessage = outMessage.getExchange().getInMessage();

then get the in headers from it and copy the required ones to the response

HTH, Serggey
>
> Many thanks!
>   		 	   		
>