我正在尝试使用Maven shade插件将Grizzly打包为Jersey作为单个jar.但我总是得到消息No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler
代码在Eclipse中运行良好,但在打包的jar中不行:
public class Main {
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(9998).build();
}
public static final URI BASE_URI = getBaseURI();
protected static HttpServer startServer() throws IOException {
System.out.println("Starting grizzly...");
ResourceConfig rc = new PackagesResourceConfig("share.test");
rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
}
public static void main(String[] args) throws IOException {
HttpServer httpServer = startServer();
System.in.read();
httpServer.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
这是完整的例外
$ java -jar target/webServiceTest-0.0.1-SNAPSHOT.jar
Starting grizzly...
Mar 20, 2012 12:48:53 PM com.sun.jersey.api.core.PackagesResourceConfig init …
Run Code Online (Sandbox Code Playgroud) 我试图在我编写的Servlet中获取一些注入的上下文(例如Session或HttpServletRequest),在Grizzly上运行,但我做的任何事情似乎都没有用.整个过程似乎过早停顿,出现以下错误:
SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.test.server.LolCat.hsr
Run Code Online (Sandbox Code Playgroud)
服务器很简单,它由两个文件组成,静态入口点(Main.java):
package com.test.server;
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.grizzly.http.server.HttpServer;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
public class Main {
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(8080).build();
}
public static final URI BASE_URI = getBaseURI();
public static void main(String[] args) throws IOException {
ResourceConfig rc = new ClassNamesResourceConfig(LolCat.class);
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
System.in.read();
httpServer.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
和serlvet(LolCat.java):
package com.test.server;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
@Path(value = "/lol") …
Run Code Online (Sandbox Code Playgroud) 产生大量线程绝不是一个好主意(当你创建太多时,你可能会耗尽内存).
通常,Jersey需要为每个请求创建一个线程.这似乎是这种情况,无论我使用async()
(泽西为我创建线程 - 我在调试器中调查过这个),或者不是(我显然必须自己创建线程).
所以这是一个不够好的具体情况:
我是HTTP发布到远程服务器,速率高达500请求/秒.但由于响应可能需要一些时间才能到达(我计算最多30秒),线程总数可以轻松达到数千(此时,JVM进程通常会崩溃).而且,创建这么多线程真的很疯狂.对于处理该负载的可用处理器/网络/ OS资源而言,它实际上应该是一块蛋糕.
所以我想做的是,只需触发请求 - 并在HTTP响应到达时通知操作系统.
target.request(...).async()....
并不能解决问题(因为那时,泽西岛只会产生自己的线程).new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)
是没有用的,因为这意味着一次最多发送10个请求,这显然不是我想要的(它只会堆积队列).我尝试过new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())
获得NIO支持 - 但根本没有看到任何行为上的差异.
那么有没有办法发出请求而不必为每个请求创建一个额外的线程?
我有一个服务器客户端应用程序(Java EE和Android),通过websockets进行通信.通信工作以及协议本身用于以json方式发送对象,这些对象将被正确包装,序列化,发送,反序列化,解包和重建.两个应用程序都使用另一个库项目,包含所有可能的请求和响应类.
现在我的问题: 图书馆还应实施非阻塞通信策略,但透明的请求 - 响应实现.可能我不是第一个遇到这个问题的人,所以我认为那里可能有一些不错的实现:).
我想要的是:
// server should sleep 5000ms and then return 3*3
Future<Integer> f1 = server.put(
new SleepAndReturnSquareRequest(5000, 3),
new FutureCallback<Integer>{
public void onSuccess(Integer square) {
runOnUiThread(new Runnable{
// Android Toast show square
});
}
// impl onFailure
}
);
Future<Date> f2 = server.put(
new TimeRequest(),
new FutureCallback<Date>{
public void onSuccess(Date date) {
// called before other onSuccess
}
// impl onFailure
}
);
// e.g. when the activity in android changes I'll cancel all futures. …
Run Code Online (Sandbox Code Playgroud) 我来自Windows .NET背景,但我正在尝试扩展我的专业知识,所以已经选择了一些Java项目.目前,我正在尝试创建一个REST API,所以我决定在这里浏览Jersey:http://jersey.java.net/nonav/documentation/latest/getting-started.html
我已经让Hello World项目在Windows中运行良好(使用NetBeans和Maven),但是当我尝试在Ubuntu中做同样的事情时(再次使用NetBeans和Maven)我收到以下错误:
Starting grizzly...
Aug 09, 2012 11:27:46 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
com.javarest.javarest2
Aug 09, 2012 11:27:47 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
class com.javarest.javarest2.HelloWorldResource
Aug 09, 2012 11:27:47 AM com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
Exception in thread "main" java.lang.IllegalArgumentException: No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler
at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:196)
at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:134)
at com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory.createHttpServer(GrizzlyServerFactory.java:242)
at Main.startServer(Main.java:25)
at Main.main(Main.java:29)
Java Result: …
Run Code Online (Sandbox Code Playgroud) I have a Jersey application running on embedded Grizzly, that is initialized like the following:
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
Run Code Online (Sandbox Code Playgroud)
What i want to achieve is let the running requests finish when shutting down, but not let new requests in. I couldn't find a way to achieve this through public methods of HttpServer, or not even with private methods and such (although it is not nice, a solution by accessing private stuff through reflection is also ok)
Does anyone know …
我正在使用最后的quickstart原型构建Jersey Moxy服务.我的代码工作正常,我可以返回一些JSON.然而,正如我正在开发的那样,如果我犯了一个错误,说请求处理程序有一个不支持的类型,我将得到一个空的500响应,这使调试变得困难.例如,如果我使用@XmlElementRef错误地修饰属性,我将得到如下响应:
$ curl -i http://localhost:8080/myapp/test
HTTP/1.1 500 Internal Server Error
Date: Thu, 05 Sep 2013 10:27:55 GMT
Connection: close
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)
服务器将表现为没有错误:
Sep 5, 2013 11:27:46 AM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Jersey app started with WADL available at http://localhost:8080/application.wadl
Hit enter to stop it...
Run Code Online (Sandbox Code Playgroud)
我尝试使用日志配置文件:
-Djava.util.logging.config.file=log.conf
Run Code Online (Sandbox Code Playgroud)
这会产生大量输出,但仍然没有显示任何异常.
我试过调查Grizzly配置,但我找不到办法关闭优雅的错误处理.理想情况下,我希望服务器抛出异常.关于我缺少什么的任何建议?
这是我的主要代码:
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.net.URI;
import java.util.*;
public class Main {
// Base URI the Grizzly HTTP server …
Run Code Online (Sandbox Code Playgroud) 我已经设法在Jersey,HK2和一个简单的GrizzlyServer中设置我自己的服务类的注入(进入资源类).(基本上遵循这个例子.)
我现在好奇将JPA EntityManagers注入我的资源类最好的是什么?(我目前正在考虑将一个请求作为一个工作单元).我目前正在探索的一个选项是以Factory<EntityManager>
下列方式使用a :
class MyEntityManagerFactory implements Factory<EntityManager> {
EntityManagerFactory emf;
public MyEntityManagerFactory() {
emf = Persistence.createEntityManagerFactory("manager1");
}
@Override
public void dispose(EntityManager em) {
em.close();
}
@Override
public EntityManager provide() {
return emf.createEntityManager();
}
}
Run Code Online (Sandbox Code Playgroud)
并按如下方式绑定它:
bindFactory(new MyEntityManagerFactory())
.to(EntityManager.class)
.in(RequestScoped.class);
Run Code Online (Sandbox Code Playgroud)
问题是dispose
从不调用-method.
我的问题:
(我宁愿不依赖于重量级容器或额外的依赖注入库来覆盖这个用例.)
我有用于安全websocket连接的spring-boot Tomcat服务器.服务器接受Android 4.4,iOS,Firefox和Chrome客户端,并且没有使用授权签名证书的失败.但是,Android 5.0无法通过SSL握手.
Caused by: javax.net.ssl.SSLHandshakeException: Handshake failed
at com.android.org.conscrypt.OpenSSLEngineImpl.unwrap(OpenSSLEngineImpl.java:436)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:1006)
at org.glassfish.grizzly.ssl.SSLConnectionContext.unwrap(SSLConnectionContext.java:172)
at org.glassfish.grizzly.ssl.SSLUtils.handshakeUnwrap(SSLUtils.java:263)
at org.glassfish.grizzly.ssl.SSLBaseFilter.doHandshakeStep(SSLBaseFilter.java:603)
at org.glassfish.grizzly.ssl.SSLFilter.doHandshakeStep(SSLFilter.java:312)
at org.glassfish.grizzly.ssl.SSLBaseFilter.doHandshakeStep(SSLBaseFilter.java:552)
at org.glassfish.grizzly.ssl.SSLBaseFilter.handleRead(SSLBaseFilter.java:273)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:818)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0xa1f34200: Failure in SSL library, usually a protocol error
error:1408E0F4:SSL routines:SSL3_GET_MESSAGE:unexpected message (external/openssl/ssl/s3_both.c:498 0xac526e61:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake_bio(Native Method)
at com.android.org.conscrypt.OpenSSLEngineImpl.unwrap(OpenSSLEngineImpl.java:423)
Run Code Online (Sandbox Code Playgroud)
我认为问题在于TLS或密码套件由于Android …
我写了以下测试代码:
@Test
public void testLeakWithGrizzly() throws Throwable {
ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);
Set<Future<Void>> futures = new HashSet<>();
InetSocketAddress inetSocketAddress = new InetSocketAddress(localhostAddress, 111);
for (int i = 0; i < N_THREADS; i++) {
Future<Void> future = executor.submit(new GrizzlyConnectTask(inetSocketAddress, requests, bindFailures, successfulOpens, failedOpens, successfulCloses, failedCloses));
futures.add(future);
}
for (Future<Void> future : futures) {
future.get(); //block
}
Thread.sleep(1000); //let everything calm down
reporter.report();
throw causeOfDeath;
}
private static class GrizzlyConnectTask implements Callable<Void> {
private final InetSocketAddress address;
private final Meter requests;
private …
Run Code Online (Sandbox Code Playgroud)