就像标题所说的那样.我对Java EE6认证的内部工作原理知之甚少.但是,似乎TomEE +只是TomEE的超集,那么TomEE +也不应该通过Java EE6认证吗?
我们刚刚决定为我们内部开发的管理应用程序构建Tomcat(而不是使用Glassfish中的许多功能),我对TomEE +非常感兴趣,因为它几乎拥有我们想要的一切.
仅供参考,我们原本只是看Tomcat7,并安装Jersey和Hibernate.
我有以下代码在Apache-tomee上运行,我使用eclipse进行编码,我想在应用程序启动时使用@Schedule注释运行我的简单调度作业.
@Startup
@Singleton
public class ScheduleEJB {
private static int count = 0;
@Schedule(second="*/10", minute="*", hour="*", info="MyTimer")
public void execute() {
System.out.println("its running count..."+count);
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在Tomee上部署此代码时,它会让我听到以下消息并且无法在启动时自动运行我的调度方法execute(),因为此代码在glassfish中工作正常,但我不会使用它或者是jboss的glassfish.
2012年12月21日上午9:59:45 org.quartz.impl.StdSchedulerFactory实例化
INFO:使用ThreadExecutor的默认实现
2012年12月21日上午9:59:45 org.quartz.core.SchedulerSignalerImpl
INFO:类型的初始化调度程序信号器: class org.quartz.core.SchedulerSignalerImpl
2012年12月21日上午9:59:45 org.quartz.core.QuartzScheduler
信息:Quartz Scheduler v.2.1.6创建.
2012年12月21日上午9:59:45 org.quartz.simpl.RAMJobStore初始化
INFO:RAMJobStore已初始化.
2012年12月21日上午9:59:45 org.quartz.core.QuartzScheduler初始化
INFO:调度程序元数据:Quartz调度程序(v2.1.6)'OpenEJB-TimerService-Scheduler'与instanceId'OpenEJB'
调度程序类:'org. quartz.core.QuartzScheduler' - 在本地运行.
没有开始.
目前处于待机模式.
执行的作业数:0
使用线程池'org.apache.openejb.core.timer.DefaultTimerThreadPoolAdapter' - 带0个线程.
使用job-store'org.quartz.simpl.RAMJobStore' - 它不支持持久性.并没有聚集.
2012年12月21日上午9:59:45 org.quartz.impl.StdSchedulerFactory实例化
INFO:从外部提供的属性实例初始化的Quartz调度程序'OpenEJB-TimerService-Scheduler'.
2012年12月21日上午9:59:45 org.quartz.impl.StdSchedulerFactory实例化
INFO:Quartz调度程序版本:2.1.6
2012年12月21日上午9:59:45 org.quartz.core.QuartzScheduler启动
INFO:Scheduler OpenEJB- TimerService-Scheduler _ $ _ OpenEJB启动.
2012年12月21日上午9:59:45 org.apache.openejb.assembler.classic.Assembler createApplication INFO:创建Ejb …
我目前正在尝试使用Arquillian和TestNG进行JSFUnit-Test,但JSFServerSession和JSFClientSession-object为NULL.有JSFUnit和TestNG的工作示例吗?或者这里有什么不对吗?
我的测试班:
package my.beautiful.tests;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.faces.component.UIComponent;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.arquillian.testng.Arquillian;
import org.jboss.jsfunit.api.InitialPage;
import org.jboss.jsfunit.jsfsession.JSFClientSession;
import org.jboss.jsfunit.jsfsession.JSFServerSession;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
public class JSFUnitTestExample /* Arquillian needs this, not TestNG */extends Arquillian {
@ArquillianResource URL context;
@Deployment
public static WebArchive createDeployment() {
return ShrinkWrap.create( WebArchive.class, "jsfunit_test.war" ).addClass( JSFUnitBean.class )
.addAsWebInfResource( new File( "src/main/webapp/WEB-INF", "faces-config.xml" ), "faces-config.xml" )
.addAsWebInfResource( new File( "src/main/webapp/WEB-INF", "beans.xml" ), "beans.xml" )
.setWebXML( new File( "src/main/webapp/WEB-INF", …Run Code Online (Sandbox Code Playgroud) 考虑以下服务:
@Path("/")
@Stateless
public class SomethingService {
@Context
final HttpServletRequest request
@POST
@Path("post/something/")
@Produces("application/json; charset=UTF-8")
public String addSomething(@FormParam("something") final String something) {
// access to request methods results in NullPointerException
}
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException当方法执行时,我得到了,尽管在调试角度我注意到request它并不是真正的null,而是org.apache.openejb.rest.ThreadLocalHttpServletRequest. 当我将@Context注入移至方法参数级别时,一切正常:
public String addSomething(@FormParam("something") final String something,
@Context final HttpServletRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)
这是什么原因呢?据我记得,在我将服务设为 EJB 之前它曾经可以工作(我这样做是为了使用@EJB或@Inject可能注入 DAO)。JAX-RS 是否为每个请求创建此类服务的实例,因此能够通过类级别注入@Context?EJB 是否会在 JAX-RS 执行任何操作之前通过创建实例并填充代理对象来防止这种情况发生?
我不知道可能是我的问题完全没有意义,但我找不到任何关于它的直接信息.
我有我的JSF + Tomcat应用程序,它运行得很好.我想实现Restful服务和JAAS逻辑.为了做到这一点,我改用了TomEE ++.
切换到TomEE意味着我的服务器现在会更加沉重,我担心它比我在Amazon AWS微实例中需要的资源cpu和ram资源更多.
问题是:如果我只从JSF托管bean切换到JSF + EJB,性能是否会下降?
子问题是: EJB注入可以做什么,而JSF托管bean不能做什么?(例如,JSF不允许循环注入)
我正在构建一个基于 MVC 架构的简单 Web 应用程序。我有一个带有 HTML 表单的小型 JSP 页面。表单数据被转发到 servlet,然后委托给 Controller 类。
单击表单上的提交时,我收到 HTTP Status 500 - 由“UnsatisfiedResolutionException”引起的错误。容器好像找不到Controller?
文件Context.xml作为我的数据源。我正在使用 apache tomee webprofile 1.7.4。
错误:
type Exception report
message Error instantiating servlet class a1.DispatcherServlet
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error instantiating servlet class a1.DispatcherServlet
org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
root cause
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [a1.Controller] is not found with the qualifiers
Qualifiers: …Run Code Online (Sandbox Code Playgroud) 我有一个纯粹通过在 TomEE 7 环境中运行的注释配置的 JAX-WS Web 服务端点。基本上,被调用的方法必须返回一个List<String>包含在图形数据结构中的所有节点名称。此类请求的响应可以包含更多感谢 50k 元素。
With CXF 2.6.x this worked fine. However, when I call the WS-method under CXF 3.x (bundled in TomEE 7.x), the following exception is thrown on the server side:
org.apache.cxf.interceptor.Fault: Unmarshalling Error: Maximum Number of Child Elements limit (50000) Exceeded
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:906)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:712)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:179)
at org.apache.cxf.wsdl.interceptors.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1680)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1559)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1356)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:653)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) …Run Code Online (Sandbox Code Playgroud) 我想在 TomEE 中测试 hikaricp。我已将 jar 文件添加到我的 lib 文件夹中,并尝试定义如下资源:
<Resource id="myJtaDs" type="DataSource" class-name="com.zaxxer.hikari.HikariJNDIFactory" factory-name="getObjectInstance">
....
</Resource>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我在启动时收到以下错误:
org.apache.xbean.recipe.MissingFactoryMethodException: Instance factory method has signature public com.zaxxer.hikari.HikariJNDIFactory.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) but expected signature public com.zaxxer.hikari.HikariJNDIFactory.getObjectInstance()
Run Code Online (Sandbox Code Playgroud)
如何在 tomee.xml 中定义 HikariCP 数据源?
我在 TomEE Java 应用程序中使用 Instance 作为惰性/动态注入器,并且我注意到我的应用程序中存在内存泄漏。这对我来说是第一次,所以看到 Java EE 库中概述的内存泄漏警告实际上令人惊讶:
package javax.enterprise.inject;
public interface Instance<T> extends Iterable<T>, Provider<T>
{
/**
* Destroy the given Contextual Instance.
* This is especially intended for {@link javax.enterprise.context.Dependent} scoped beans
* which might otherwise create mem leaks.
* @param instance
*/
public void destroy(T instance);
}
Run Code Online (Sandbox Code Playgroud)
现在这很可能是由与@ApplicationScoped和 的冲突引起的Instance<T>。我已经提供了一个示例,说明层在我的类中的位置。注意嵌套的Instance<T>. 这是为了提供任务的动态注入。
外层
@ApplicationScoped
public class MessageListenerImpl implements MessageListener {
@Resource(name="example.mes")
private ManagedExecutorService mes;
@Inject @Any
private Instance<Worker<ExampleObject>> workerInstance;
// ...
@Override …Run Code Online (Sandbox Code Playgroud) 我的技术栈包括
为了能够ManagedExecutorService更明智、更安全地使用和管理线程,我想包含此依赖项
我尝试以不同的方式将 bean 注入到不同范围的 bean(基于视图、会话、基于应用程序)中。
@Inject
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
@Resource
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
@Resource(lookup="java:comp/DefaultManagedExecutorService")
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
似乎没有任何效果,异常消失
Run Code Online (Sandbox Code Playgroud)java.lang.RuntimeException: Error looking up java:comp/env/.../ManagedExecutorService in JNDI javax.naming.NameNotFoundException: Name [.../ManagedExecutorService] is not bound in this Context.
这可能是由于 bean 注册不当造成的。因为我没有找到。我扫描了整个类路径,但在ManagedExecutorService某处找不到任何定义或其任何实现的东西。
我试图自己注册它,context.xml但无济于事。我使用这个 TomEE 教程(天真地)假设我的非 EE Tomcat 的配置是相同的。
<Resource name="ManagedExecutorService"
type="javax.enterprise.concurrent.ManagedExecutorService" />
Run Code Online (Sandbox Code Playgroud)
<Resource id="ManagedExecutorService"
type="javax.enterprise.concurrent.ManagedExecutorService" />
Run Code Online (Sandbox Code Playgroud)
显然,事实并非如此。
我的问题是
是否可以在非 EE 服务器上设置并发实用程序,尤其是 …