List Info

Thread: Updated: (JBREM-960) Remoting configured with Servlet invoker can return m




Updated: (JBREM-960) Remoting configured with Servlet invoker can return m
country flaguser name
United States
2008-06-03 17:03:21
     [ 
http://jira.jboss.com/jira/browse/JBREM-960?page=all ]

Ron Sigal updated JBREM-960:
----------------------------

    Fix Version/s: 2.2.2.SP8
         Assignee: Ron Sigal  (was: Galder Zamarreno)

> Remoting configured with Servlet invoker can return
misleading Exceptions when Servlet path is incorrect
>
------------------------------------------------------------
--------------------------------------------
>
>                 Key: JBREM-960
>                 URL: http://ji
ra.jboss.com/jira/browse/JBREM-960
>             Project: JBoss Remoting
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: transport
>    Affects Versions: 2.4.0.GA (Pinto), 2.2.2.SP8,
2.4.1.Beta
>            Reporter: Galder Zamarreno
>         Assigned To: Ron Sigal
>             Fix For: 2.2.2.SP8
>
>
> I've been struggling to set up a ServletInvoker in
Remoting to be able to 
> use the unified invoker to talk to EJB2 beans in AS/EAP
4.x. I had the Connector 
> set up like this:
>    <mbean
code="org.jboss.remoting.transport.Connector"
>      
name="jboss.remoting:service=connector,transport=servle
t"
>       display-name="Servlet transport
Connector">
>       <attribute name="Configuration">
>          <config>
>             <invoker
transport="servlet">
>                <attribute name="dataType"
isParam="true">invocation</attribute>
>                <attribute
name="marshaller"
isParam="true">org.jboss.invocation.unified.mar
shall.InvocationMarshaller</attribute>
>                <attribute
name="unmarshaller"
isParam="true">org.jboss.invocation.unified.mar
shall.InvocationUnMarshaller</attribute>
>                <attribute
name="serverBindAddress">${jboss.bind.address}&
lt;/attribute>
>                <attribute
name="serverBindPort">8080</attribute>
>                <attribute
name="path">unified-http-invoker/ServerInvokerS
ervlet</attribute>
>             </invoker>
>             <handlers>
>                <handler
subsystem="invoker">jboss:service=invoker,type=
unified-http</handler>
>             </handlers>
>          </config>
>       </attribute>      
>    </mbean>
> But the path attribute was incorrect. Remoting was
coming back with something like this:
> org.jboss.remoting.CannotConnectException: Can not
connect http client invoker.
> 	at
org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpU
RLConnection(HTTPClientInvoker.java:333)
> 	at
org.jboss.remoting.transport.http.HTTPClientInvoker.transpor
t(HTTPClientInvoker.java:135)
> 	at
org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemo
teClientInvoker.java:122)
> 	at org.jboss.remoting.Client.invoke(Client.java:1634)
> 	at org.jboss.remoting.Client.invoke(Client.java:548)
> 	at
org.jboss.invocation.unified.interfaces.UnifiedInvokerProxy.
invoke(UnifiedInvokerProxy.java:183)
> 	at
org.jboss.invocation.InvokerInterceptor.invokeInvoker(Invoke
rInterceptor.java:365)
> 	at
org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterc
eptor.java:197)
> 	at
org.jboss.proxy.TransactionInterceptor.invoke(TransactionInt
erceptor.java:61)
> 	at
org.jboss.proxy.SecurityInterceptor.invoke(SecurityIntercept
or.java:70)
> 	at
org.jboss.proxy.ejb.HomeInterceptor.invoke(HomeInterceptor.j
ava:184)
> 	at
org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:
100)
> 	at $Proxy0.create(Unknown Source)
> 	at
com.acme.ejb2.slsb.TimerEnquirerHttpTest.test000(TimerEnquir
erHttpTest.java:34)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
> 	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
ssorImpl.java:39)
> 	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
thodAccessorImpl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at
junit.framework.TestCase.runTest(TestCase.java:164)
> 	at
junit.framework.TestCase.runBare(TestCase.java:130)
> 	at
junit.framework.TestResult$1.protect(TestResult.java:106)
> 	at
junit.framework.TestResult.runProtected(TestResult.java:124)

> 	at
junit.framework.TestResult.run(TestResult.java:109)
> 	at junit.framework.TestCase.run(TestCase.java:120)
> 	at
junit.framework.TestSuite.runTest(TestSuite.java:230)
> 	at junit.framework.TestSuite.run(TestSuite.java:225)
> 	at
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer
ence.run(JUnit3TestReference.java:130)
> 	at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test
Execution.java:38)
> 	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe
sts(RemoteTestRunner.java:460)
> 	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe
sts(RemoteTestRunner.java:673)
> 	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R
emoteTestRunner.java:386)
> 	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(
RemoteTestRunner.java:196)
> Caused by: java.io.StreamCorruptedException: invalid
stream header
> 	at
java.io.ObjectInputStream.readStreamHeader(ObjectInputStream
.java:764)
> 	at
java.io.ObjectInputStream.<init>(ObjectInputStream.jav
a:277)
> 	at
org.jboss.remoting.loading.ObjectInputStreamWithClassLoader.
<init>(ObjectInputStreamWithClassLoader.java:95)
> 	at
org.jboss.remoting.serialization.impl.java.JavaSerialization
Manager.createInput(JavaSerializationManager.java:54)
> 	at
org.jboss.remoting.marshal.serializable.SerializableUnMarsha
ller.getMarshallingStream(SerializableUnMarshaller.java:72)
> 	at
org.jboss.remoting.marshal.serializable.SerializableUnMarsha
ller.read(SerializableUnMarshaller.java:119)
> 	at
org.jboss.invocation.unified.marshall.InvocationUnMarshaller
.read(InvocationUnMarshaller.java:59)
> 	at
org.jboss.remoting.transport.http.HTTPClientInvoker.readResp
onse(HTTPClientInvoker.java:471)
> 	at
org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpU
RLConnection(HTTPClientInvoker.java:305)
> 	... 31 more
> Now, to get this Exception is very misleading. It
generally means that either you have different 
> client and server side Remoting versions, or you're
using different serialization methods on either 
> side.
> Once I started to dig into what Remoting was doing, I
spotted HTTPClientInvoker does the following in
> useHttpURLConnection() method:
>          if (sendingData)
>          {
>             //POST or PUT
>             conn.setDoOutput(true);
>             conn.setDoInput(true);
>             conn.setRequestMethod(type);
>             OutputStream stream =
conn.getOutputStream();
>             if (marshaller instanceof
VersionedMarshaller)
>                ((VersionedMarshaller)
marshaller).write(invocation, stream,
Version.getDefaultVersion());
>             else
>                marshaller.write(invocation, stream);
>             responseCode = conn.getResponseCode();
>             InputStream is = (responseCode < 400) ?
conn.getInputStream() : conn.getErrorStream();
>             Map headers = conn.getHeaderFields();
>             if (metadata == null)
>             {
>                metadata = new HashMap();
>             }
>             // sometimes I get headers with
"null" keys (I don't know who's fault is it), so I
need
>             // to clean the header map, unless I want
to get an NPE thrown by metadata.putAll()
>             if (headers != null)
>             {
>                for(Iterator i =
headers.entrySet().iterator(); i.hasNext(); )
>                {
>                   Map.Entry e = (Map.Entry)i.next();
>                   if (e.getKey() != null)
>                   {
>                      metadata.put(e.getKey(),
e.getValue());
>                   }
>                }
>             }
>            
metadata.put(HTTPMetadataConstants.RESPONSE_CODE_MESSAGE,
conn.getResponseMessage());
>            
metadata.put(HTTPMetadataConstants.RESPONSE_CODE, new
Integer(responseCode));
>             result = readResponse(metadata, headers,
unmarshaller, is);
>          }
> The Exception reported is coming from readResponse()
but before that if the Servlet was not available, 
> like in my case, conn.getResponseCode() was returning
404.
> Remoting code should check what the response code was,
whether this is an invalid code, i.e. does not exist...etc,

> and throw an Exception if invalid, like in this case,
giving the caller much better clue of what is going on.
> Thoughts?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the
administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atl
assian.com/software/jira

        
_______________________________________________
jboss-jira mailing list
jboss-jiralists.jboss.org
h
ttps://lists.jboss.org/mailman/listinfo/jboss-jira

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )