Hmm, I find embedded servers really useful for testing the network
protocol. But opinions on embedded servers aside, I found some more
pointers:

http://stackoverflow.com/questions/9074704/embedded-jetty-different-ports-for-internally-and-externally-visible-endpoints
http://code.google.com/p/google-guice/issues/detail?id=635

I haven't gotten it to work yet, but I'm getting closer...

Peter

On Mar 10, 3:31 pm, Alen Vrečko <[email protected]> wrote:
> GuiceFilter has static state. Normally that is not a problem since you'd
> have one GuiceFilter per WebAppClassLoader.
>
> In your case you have GuiceFilter defined in the same ClassLoader as both
> of your servers. What happens is:
>
> The second server overwrites the GuiceFilter#pipeline field (with warning).
> This makes guice servlet behave the same for both servers.
>
> A couple of ideas
> o) refactor GuiceFilter not to use static state ;)
> o) use custom classloaders to force isolation (don't forget to set the
> Thread.currentThread().setContextClassLoader(server1cl))
>
> What I'd probably do
> o) don't use embedded server
>
> I think it is best to test on the same server and same setup as you are
> using in production so there are no surprises. Your test environment should
> be a close copy of production.
>
> I don't like embedded servers for testing in general case. What I'd
> probably use is Arquillian with Managed Container for Tomcat 7 (no embedded
> stuff). See here for usage
>
> https://github.com/arquillian/arquillian-container-tomcat/blob/master...https://github.com/arquillian/arquillian-container-tomcat/blob/master...https://docs.jboss.org/author/display/ARQ/Multiple+Containers?_sscc=t
>
> You have many options. I am sure you will figure some more options if you
> haven't already.
>
> Cheers
> Alen
>
> Dne petek, 09. marec 2012 10:35:11 UTC+1 je oseba Peter napisala:
>
>
>
>
>
>
>
>
>
> > For testing, I want to set up two web servers on different ports
> > programmatically, each configured differently. However there seems to
> > be contamination of object instances between both servers, and I don't
> > understand where it's coming from. I am using Guice, Jersey and
> > GrizzlyWebServer. Guice gives me a warning "Multiple Servlet injectors
> > detected", which is intentional since I have two different servers. I
> > understand that singletongs (@Singleton) in Guice are per injector,
> > and not per JVM, so each server should have its own singleton
> > instance.
>
> > I've written a stand-alone program to illustrate the problem. It
> > starts up two servers on localhost on different ports. When pointing a
> > browser at "http://localhost:9991/context/"; I expect "9991" in the
> > body of the response, and analogously for port 9992. However, _both_
> > servers respond with "9992". I've also printed out the object hashes
> > in the body of the response, to illustrate that both servers are
> > sharing the same object, which is not what I want.
>
> > Can someone explain what I am doing wrong?
>
> > ---
> > package systemtest;
>
> > import com.google.inject.*;
> > import com.google.inject.servlet.GuiceFilter;
> > import com.google.inject.servlet.GuiceServletContextListener;
> > import com.sun.grizzly.http.embed.GrizzlyWebServer;
> > import com.sun.grizzly.http.servlet.ServletAdapter;
> > import com.sun.jersey.guice.JerseyServletModule;
> > import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
>
> > import javax.servlet.ServletContextEvent;
> > import javax.ws.rs.GET;
> > import javax.ws.rs.Path;
> > import javax.ws.rs.Produces;
> > import javax.ws.rs.core.MediaType;
> > import javax.ws.rs.core.Response;
> > import java.io.IOException;
>
> > /**
> >  * @author Peter De Maeyer
> >  */
> > public class MyWebServer {
>
> >   private final int port;
>
> >   private final GrizzlyWebServer webServer;
>
> >   public MyWebServer( int aPort ) {
> >     port = aPort;
> >     ServletAdapter adapter = new ServletAdapter();
> >     adapter.addServletListener( MyGuiceConfig.class.getName() );
> >     adapter.addFilter( new GuiceFilter(), "Guice filter", null );
> >     adapter.setServletPath( "/" );
> >     adapter.setContextPath( "/context" );
> >     adapter.addContextParameter( "port", String.valueOf( port ) );
> >     webServer = new GrizzlyWebServer( port );
> >     webServer.addGrizzlyAdapter( adapter, null );
> >   }
>
> >   public static void main( String[] aRgs ) throws IOException {
> >     MyWebServer server9991 = new MyWebServer( 9991 );
> >     try {
> >       server9991.start();
> >       MyWebServer server9992 = new MyWebServer( 9992 );
> >       try {
> >         server9992.start();
> >         System.out.println( "Press any key to stop..." );
> >         System.in.read();
> >       }
> >       finally {
> >         server9992.stop();
> >       }
> >     }
> >     finally {
> >       server9991.stop();
> >     }
> >   }
>
> >   public MyWebServer start() throws IOException {
> >     System.out.printf( "Starting web server on port %d",
> > port ).println();
> >     webServer.start();
> >     return this;
> >   }
>
> >   public MyWebServer stop() {
> >     System.out.printf( "Stopping web server on port %d",
> > port ).println();
> >     webServer.stop();
> >     return this;
> >   }
>
> >   public static class MyGuiceConfig extends
> > GuiceServletContextListener {
>
> >     private volatile String home;
>
> >     @Override protected Injector getInjector() {
> >       return Guice.createInjector( new MyModule( home ), new
> > MyServletModule() );
> >     }
>
> >     @Override public void contextInitialized( ServletContextEvent
> > aEvent ) {
> >       home = aEvent.getServletContext().getInitParameter( "port" );
> >       super.contextInitialized( aEvent );
> >     }
> >   }
>
> >   public static class MyModule implements Module {
>
> >     private final String port;
>
> >     public MyModule( String aPort ) {
> >       port = aPort;
> >     }
>
> >     @Override public void configure( Binder aBinder ) {
> >       aBinder.bind( MyService.class );
> >     }
>
> >     @Provides
> >     @Singleton
> >     public MyPort providePort() {
> >       return new MyPort( port );
> >     }
> >   }
>
> >   public static class MyPort {
>
> >     private final String port;
>
> >     public MyPort( String aPort ) {
> >       port = aPort;
> >     }
>
> >     @Override public String toString() {
> >       return port + " (port#" + System.identityHashCode( this ) + ")";
> >     }
> >   }
>
> >   @Path( "/" )
> >   public static class MyService {
>
> >     private final MyPort port;
>
> >     @Inject
> >     public MyService( MyPort aPort ) {
> >       port = aPort;
> >     }
>
> >     @GET
> >     @Produces( MediaType.TEXT_HTML )
> >     public Response get() {
> >       String content = "<html><body>" + port + " (service#" +
> > System.identityHashCode( this ) + ") </body></html>";
> >       return Response.ok( content ).build();
> >     }
> >   }
>
> >   public static class MyServletModule extends JerseyServletModule {
>
> >     @Override protected void configureServlets() {
> >       serve( "/*" ).with( GuiceContainer.class );
> >     }
> >   }
> > }
> > ---

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to