天道酬勤,学无止境

Using a CommonJ implementation with GlassFish and Spring 3

In my quest to unify deployment among Websphere 7 and GlassFish 3 environments, I decided to try implementing a CommonJ WorkManager and TimerManager in GlassFish. But it isn't quite working as expected. I have done the following:

Use the myFOO CommonJ implementation found at: http://commonj.myfoo.de/ and include the libraries into my domain/lib folder (including the Spring libs)

Added the following to the <resources> section of the glassfish domain.xml:

<custom-resource res-type="commonj.work.WorkManager" jndi-name="wm/default" factory-class="de.myfoo.commonj.work.FooWorkManagerFactory"></custom-resource>
<custom-resource res-type="commonj.timers.TimerManager" jndi-name="tm/default" factory-class="de.myfoo.commonj.timers.FooTimerManagerFactory"></custom-resource>

Include the references in the <servers>/<server> section of the domain.xml:

  <resource-ref ref="wm/default"></resource-ref>
  <resource-ref ref="tm/default"></resource-ref>

Add the appropriate resource references in the web.xml of my test application:

<resource-ref>
    <description>WorkManager</description>
    <res-ref-name>wm/default</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

<resource-ref>
    <description>TimerManager</description>
    <res-ref-name>tm/default</res-ref-name>
    <res-type>commonj.timers.TimerManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>

Add the following beans to my applicationContext.xml:

<bean id="threadTestTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
    <property name="workManagerName" value="wm/default" />
    <property name="resourceRef" value="true"/>
</bean>

<bean id="threadTestTimerExecutor" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler"> 
    <property name="timerManagerName" value="tm/default" />
    <property name="resourceRef" value="true" />
    <property name="shared" value="false" />
</bean>

<bean id="threadTest" class="test.ThreadTester"></bean>

<task:scheduled-tasks scheduler="threadTestTimerExecutor">
    <task:scheduled ref="threadTest" method="execute" fixed-delay="30000" />  <!-- 30 seconds -->
</task:scheduled-tasks>

After all of this set-up, everything loads find and the web application runs; however, the ThreadTester class does not run on the Timer.

I have stepped through the myFOO code and the TimerManager (FooTimerManager.java) main loop is running, it just never seems to recognize that every 30 seconds it's supposed to launch the class.

My questions:

Has anyone had experience implementing JSR 236/237 (CommonJ) with GlassFish 3 and Spring?

Is there another implementation somewhere other than myFOO that I could use and try out? Has anyone attempted to do what I've done? Would you be willing to share your results if you succeeded?

Thanks!

Edit 1:

I forgot to mention that using myFOO CommonJ implementation with GlassFish does work as far as the WorkManager is concerned. What does not work is the TimerManager. This means that I can launch threads on demand just fine but triggered scheduling doesn't work.

Edit 2:

Since updating to GlassFish 3.1.1, the myFOO CommonJ implementation of the TimerManager is working fine. So... great! This question is now more like a HOWTO Guide.

评论

I don't think it's a good idea to use the TimerManager of myFoo CommonJ - in addition to being dormant for about 6 years, the code is just strange at some points (referring to v1.1). E.g. the isExpired method of the FooTimer class looks like this:

public boolean isExpired() {
    return scheduledExcecutionTime >= System.currentTimeMillis();
}

So, the timer will expire when its scheduled next execution time is in the future? Nonsense - that should be the other way round!

Somewhere else (TimerExecutor#run), notifyAll is called on an object (TimerManager) that the current thread has no monitor for, constantly causing java.lang.IllegalMonitorStateExceptions.

Hands off!

If you're working in Spring, why are you using another Timer implementation? Why not just use the Spring scheduling integration? Then you don't need to worry about in which server your app is running, as Spring doesn't care.

Well, it looks like that since updating to GlassFish 3.1.1, I no longer have the problem with the myFOO implementation of the TimerManager. My @Scheduled beans are working just fine now.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 非托管线程Spring Quartz Websphere Hibernate(Unmanaged Threads Spring Quartz Websphere Hibernate)
    问题 看来我们使用Quartz-JDBCJobStore以及Spring,Hibernate和Websphere的实现抛出了非托管线程。 我读了一些书,发现IBM的一篇技术文章指出将Quartz与Spring一起使用会导致这种情况。 他们提出使用CommnonJ解决此问题的建议。 我进行了一些进一步的研究,到目前为止,我所看到的唯一示例都处理了不在数据库中的旧JobStore计划。 因此,我想知道是否有人有解决此问题的示例。 谢谢 回答1 我们有一个可行的解决方案(实际上有两个)。 1)更改石英源代码,以将WorkManager守护程序线程用于主调度程序线程。 它可以工作,但需要更换夸脱。 不过我们没有使用它,因为我们不想维护被黑的石英版本。 (这使我想起了,我打算将其提交给项目,但完全忘记了) 2)创建一个WorkManagerThreadPool用作石英线程池。 实现石英ThreadPool的接口,以便在石英内触发的每个任务都包装在commonj Work对象中,然后将在WorkManager中安排该对象。 关键是必须在启动调度程序之前从Java EE线程(例如Servlet初始化)初始化WorkManagerThreadPool中的WorkManager。 然后,WorkManagerThreadPool必须创建一个守护程序线程
  • 使 Spring 计划任务与任务执行程序线程一起运行(Getting Spring scheduled tasks to run with the task executor thread)
    问题 背景:我在我的 Websphere 7 应用程序中使用 Spring 3.0.x 来获取 CommonJ WorkManager 和 TimerManager。 我使用这些在我部署的应用程序中以特定时间间隔执行任意任务。 问题: 我刚刚了解到在调度程序中设置 bean 时,如下所示: <bean id="threadTest" class="test.ThreadTester" /> <task:scheduled-tasks scheduler="myTimerExecutor"> <task:scheduled ref="threadTest" method="execute" fixed-delay="300000" /> </task:scheduled-tasks> 在 Websphere 中,它会直接在 TimerManager 线程池中运行ThreadTester类。 该线程池比 WorkManager 线程池具有更高的优先级(和更少的线程)。 我希望线程与 WorkManager 一起运行,而不是以适当的优先级运行,并使用为线程设置的适当资源。 作为替代方案,我可以在ThreadTester类中使用 Spring @Scheduled注释,而不是像上面那样在调度程序中设置 bean,如下所示: @Scheduled(fixedDelay = 300000)
  • Getting Spring scheduled tasks to run with the task executor thread
    Background: I use Spring 3.0.x in my Websphere 7 applications to grab the CommonJ WorkManager and TimerManager. I use these to do arbitrary tasks at certain intervals in my deployed applications. Problem: I just learned that when setting a bean in the scheduler like so: <bean id="threadTest" class="test.ThreadTester" /> <task:scheduled-tasks scheduler="myTimerExecutor"> <task:scheduled ref="threadTest" method="execute" fixed-delay="300000" /> </task:scheduled-tasks> In Websphere, it will run the ThreadTester class directly in the TimerManager thread pool. This thread pool has a much higher
  • sbt assembly error encontered during merge
    I try to create a fat jar using sbt assembly and I get the following error: [warn] Merging 'org\eclipse\persistence\descriptors\copying' with strategy 'rename' [warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard' [warn] Merging 'META-INF\maven\commons-logging\commons-logging\pom.properties' with strategy 'discard' [warn] Merging 'META-INF\maven\commons-logging\commons-logging\pom.xml' with strategy 'discard' [warn] Merging 'META-INF\maven\javax.validation\validation-api\pom.properties' with strategy 'discard' [warn] Merging 'META-INF\maven\javax.validation\validation-api\pom.xml' with
  • 合并期间出现 sbt 程序集错误(sbt assembly error encontered during merge)
    问题 我尝试使用 sbt 程序集创建一个胖罐子,但出现以下错误: [warn] Merging 'org\eclipse\persistence\descriptors\copying' with strategy 'rename' [warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard' [warn] Merging 'META-INF\maven\commons-logging\commons-logging\pom.properties' with strategy 'discard' [warn] Merging 'META-INF\maven\commons-logging\commons-logging\pom.xml' with strategy 'discard' [warn] Merging 'META-INF\maven\javax.validation\validation-api\pom.properties' with strategy 'discard' [warn] Merging 'META-INF\maven\javax.validation\validation-api\pom.xml' with strategy 'discard' [warn] Merging 'META
  • Weblogic Server 11g 上的自定义线程(Custom Thread on Weblogic Server 11g)
    问题 我的 weblogic 服务器上需要一个自定义线程; 我不能使用 TimerEJB 或 Delayed MDB,因为我必须使用 3d 库。 我知道不鼓励应用服务器上的自定义线程; 这里有一篇相关的帖子(4 岁):为什么不鼓励在 Java EE 容器中生成线程? 是不是还气馁? 我可以使用ExecutorService或 Quartz 吗? 或者我只需要考虑 commonj 和工人经理? 回答1 在 Weblogic 11g (EJB3.0) 上,不鼓励创建“自己的线程执行器”(另请参阅 Java EE 规范和多线程),您应该使用: 定时器服务 例子: MyEjb { @Stateless public class TimerBean implements TimerRemote { @Resource TimerService service; @Override public void startTimer() { Timer timer = service.createTimer(1000, 1000, null); System.out.println("Timers set"); } @Timeout public void handleTimeout(Timer timer) { System.out.println("Handle timeout event
  • 使用Java EE API替换不推荐使用的JPMS模块(Replacements for deprecated JPMS modules with Java EE APIs)
    问题 Java 9已弃用了六个包含Java EE API的模块,它们将很快被删除: 带有javax.activation包的java.activation java.corba与javax.activity , javax.rmi , javax.rmi.CORBA ,并org.omg.* packages 带有javax.transaction包的java.transaction java.xml.bind和所有javax.xml.bind.*软件包带有javax.jws , javax.jws.soap , javax.xml.soap和所有javax.xml.ws.*包的java.xml.ws 带有javax.annotation包的java.xml.ws.annotation 哪些维护的第三方工件提供了这些API? 它们提供这些API的性能如何或它们必须提供哪些其他功能都无关紧要-重要的是,它们是这些模块/软件包的直接替代品吗? 为了更轻松地收集知识,我用到目前为止的知识进行了回答,并将答案设置为社区Wiki。 我希望人们能扩展它,而不是写自己的答案。 在您投票关闭之前: 是的,各个模块上已经存在一些问题,对此问题的答案当然会重复该信息。 但是AFAIK并没有一点可以了解所有这些知识,我认为它具有很大的价值。 要求图书馆推荐的问题通常被认为是题外话,因为
  • 在Tomcat中从Servlet产生线程的推荐方法是什么(What is recommended way for spawning threads from a servlet in Tomcat)
    问题 大概重复一遍! 我正在使用Tomcat作为服务器,并且想知道什么是在servlet中产生确定性结果的最佳方式。 我正在从servlet操作中运行一些长期运行的更新,并希望请求完成并在后台进行更新。 我认为我可以生成一个可以在后台运行并在自己的时间内完成的线程,而不是添加像RabbitMQ这样的消息传递中间件。 我在其他SO线程中读到,服务器终止了服务器派生的线程,以使其很好地管理资源。 使用Tomcat时,是否有建议的方法来生成线程,后台作业。 我还将Spring MVC用于该应用程序。 回答1 在像Tomcat或Jetty这样的准系统servlet容器中,最安全的选择是使用最大线程数的applicaton宽线程池,以便在必要时将任务排队。 ExecutorService在此方面非常有帮助。 在应用程序启动或servlet初始化后,使用Executors类创建一个: executor = Executors.newFixedThreadPool(10); // Max 10 threads. 然后在Servlet的服务期间(对于您不感兴趣的情况,您可以忽略结果,或者将其存储在会话中以供以后访问): Future<ReturnType> result = executor.submit(new YourTask(yourData))
  • 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
    本文借助一次开源项目的编译过程,梳理了一些java相关概念,与大家分享此文。从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta目录从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta3.1 javax.ws.rs3.2 jersey和jetty3.3 hk22.1 JSR2.2 javax2.3 JSR3112.4 JSR-3302.5 JSR 2502.6 Jakarta2.7 GlassFish2.8 Jetty2.9 概念关系2.3.1 JSR3112.3.2 javax.ws.rs2.3.3 框架2.3.4 Jersey2.4.1 JSR-3302.4.2 javax.inject2.4.3 框架2.4.4 hk22.5.1 JSR 2502.5.2 javax.annotation2.5.3 框架0x00 摘要0x01 缘由0x02 概念0x03 在SOFARegistry的使用0xFF 参考0x00 摘要本文借助一次开源项目的编译过程,梳理了一些java相关概念,与大家分享此文。0x01 缘由最近在编译蚂蚁金服的sofa-registry,因为不可名状的原因,无法完全下载依赖的maven包,所以只能手动一个一个下载。事实证明,这是一个痛苦的过程
  • jersey-spring3 实例化 Spring 管理的 bean(空!)(jersey-spring3 instantiating Spring-managed bean (null!))
    问题 我首先想指出,总的来说,这是我职业生涯中处理过的最大的时间浪费问题。 (现在连续两天基本上是 0 进展。)我尝试过的每一个“变通办法”或“解决方案”都没有奏效,所以我被阻止并且非常渴望得到一些帮助。 简而言之,问题在于 Jersey/HK2 似乎总是在它们已经被 Spring 实例化之后实例化我的 Spring 管理的 bean,这告诉我 jersey-spring3 没有完成它的工作,或者至少不是我当前的设置(或迄今为止我尝试过的大约 50 种设置排列中的任何一种。) 请注意,当我使用空构造函数时,这些资源字段在运行时为空。 我不明白为什么我当前的设置不起作用,因为我实际上是在复制这个在线示例 任何帮助都非常感谢!! 配置 - - - - - pom.xml - - - - - <!-- ... --> <dependencies> <!-- Spring Dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId>
  • EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配(EclipseLink 2.7.0 and JPA API 2.2.0 - signature mismatch)
    问题 运行由 Maven 构建的具有以下依赖项的项目时: <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.0</version> </dependency> 我在运行时收到以下错误: java.lang.SecurityException: class "javax.persistence.Cacheable"'s signer information does not match signer information of other classes in the same package javax.persistence-2.2.0 工件已签名并包含 javax.persistence.Cacheable.class 注释,而 eclipselink-2.7.0 工件未签名且还包含相同的 java 类注释。 如何解决这个问题? 编辑 用 2.1
  • javax.validation.ValidationException:HV000183:无法加载'javax.el.E​​xpressionFactory'(javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory')
    问题 我尝试使用休眠验证器编写非常简单的应用程序: 我的步骤: 在pom.xml中添加以下依赖项: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.1.Final</version> </dependency> 编写代码: class Configuration { Range(min=1,max=100) int threadNumber; //... public static void main(String[] args) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Configuration configuration = new Configuration(); configuration.threadNumber = 12; //... Set<ConstraintViolation<Configuration>> constraintViolations = validator.validate
  • 使用 jersey-spring3 从 JerseyTest 容器中检索托管 bean(Retrieve a managed bean from a JerseyTest container with jersey-spring3)
    问题 这个问题是上一个问题Specify Custom Application Context的后续问题。 我们正在将我们的一些数据服务从使用 jersey-spring 的 Jersey 1.x 迁移到使用 jersey-spring3 的 Jersey 2.x。 我们有一些继承自 JerseyTest 的测试类。 其中一些类使用未在 web.xml 文件中指定的自定义 applicationContext.xml 文件。 出于对象模拟的目的,我们将模拟 Jersey 资源中的一些组件。 在 Jersey 1.x 中,我们可以通过以下方式模拟应用程序上下文文件中的对象 <bean id="mockBean" class="org.easymock.EasyMock" factory-method="createStrictMock" autowire="byName"> <constructor-arg index="0" value="com.xxx.xxx.ClassToMock" /> </bean> 并按如下方式检索这些模拟实例 ClassToMock obj = (ClassToMock)ContextLoader .getCurrentWebApplicationContext() .getAutowireCapableBeanFactory() .getBean(
  • How to deserialize Joda DateTime using Jackson with Jersey 2 Client in Spring MVC?
    I've been bashing my head with this proof of concept for a while. I want to consume a REST endpoint that returns JSON payload with an ISO8601 UTC timestamp: { ... "timestamp" : "2014-08-20T11:51:31.233Z" } and I want to consume it using a command line Java client written as a Jersey 2 client with Jackson/Spring Boot. The marshalling POJO is defined as follows: @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(Include.NON_NULL) public class GreetingResource { @JsonProperty("timestamp") private DateTime date; ... } After following recommendations shown in: https://jersey.java.net
  • Glassfish4 + EJB + Spring, deploy fails
    I am upgrading an application from Java7 on Glassfish 3.1.2.2, to Java8 on Glassfish 4.1. The application is packaged as an ear file, containing a jar-file with remote EJBs and Spring beans, as well as a war-file with a couple of servlets and some webservices. There are only some minor changes done to the actual application, compared to how it was with Glassfish 3.x, the total changes made are: Built with Java8 instead of Java7. Deployed on Glassfish 4.1 instead of 3.1.2.2 Newer version of Hibernate Newer version of ActiveMQ (client) I can't see any difference between the previous ear-file and
  • 纯粹的 JerseyTest 不会让 Spring 搞乱服务(Pure JerseyTest without letting Spring messing with services)
    问题 我在 JerseyTest 和 Spring 上遇到了困难。 以前在非 Spring Java 项目中,我通常为我的 REST API 做的是从 JerseyTest 扩展我的测试,模拟服务类并简单地(单元)测试我的 REST API。 现在我在我的项目中使用 spring,在我的 REST 资源类中,服务用@Autowired 进行了注释。 现在我正在使用相同的场景。 Spring 介入并抱怨缺少 applicationcontext.xml 之类的东西。 我确实想在我的生产中使用 spring,但对于我的单元测试,我不需要我的测试对 Spring 及其所有自动装配和类路径注释处理有任何了解! 我怎样才能做到这一点? 这些类看起来像这样: public class RESTResource{ @Autowired MyService service; @GET public Response getSomeStuff(){ ... service.getStuff() } } 这是测试类 public class RESTResourceTest extends JerseyTest{ private Service service; @Override public Application configure(){ RESTResource resource = new
  • Tomcat支持哪些技术?(Which technologies does Tomcat support?)
    问题 我阅读了很多有关GlassFish应用服务器的信息,该服务器支持整个Java EE 6规范。 但是Tomcat支持哪些功能? 我知道Tomcat是一个JSP / Servlet容器,但是我在Web上看到有关“ JSF和Tomcat”,“ Hibernate和Tomcat”以及更多内容的文章。 tomcat可以使用以下技术吗:EJB,JSF,JPA,Hibernate,Spring等。 回答1 Tomcat作为一个基本的servlet容器,实际上仅提供开箱即用的JSP,Servlet,EL和WS API。 但是,您可以自己提供JSF,JSTL,CDI,JPA,Hibernate,Spring等,并随Web应用程序一起提供/WEB-INF/lib文件夹中JAR文件形式的Web应用程序,并在必要时提供一些配置文件。 EJB只是一个故事,因为您不能仅仅添加“某些JAR”来使之工作,但实际上是的,如果修改服务器核心,您也可以在Tomcat之上放置一个EJB容器。 这基本上也是TomEE所做的。 如果您打算使用Java EE,则不妨考虑一下。 也可以看看: Java EE到底是什么? 回答2 我阅读了很多有关GlassFish应用服务器的信息,该服务器支持整个Java EE 6规范。 但是Tomcat支持哪些功能? Tomcat(从Java EE 5开始就不再是Servlet规范的RI
  • Java EE 6与Spring 3堆栈(Java EE 6 vs. Spring 3 stack [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我现在开始一个新项目。 我必须选择技术。 我需要一些东西,所以不需要EJB或Seam。 另一方面,我需要带有IceFaces的JPA(休眠或替代)和JSF。 您认为在Spring 3上的Tomcat上部署这样的堆栈是一个不错的选择吗? 还是Java EE 6 Web应用程序可能更好? 恐怕Java EE 6是一项新技术,尚未有充分的文档证明。 Tomcat似乎比Glassfish 3更易于维护。 你怎么看? 你有经验吗? 回答1 我需要一些东西,所以不需要EJB或Seam。 您是否愿意解释自EJB3以来,什么使EJB变得笨重? 您是否意识到我们已经不在2004年了? 我真的很想阅读您对光的定义和您的论点(并且我会很高兴地更新我的答案,因为我敢肯定我会说几句话)。 另一方面,我需要带有IceFaces的JPA(休眠或替代)和JSF。 包括JSF 2.0,JPA 2.0,Bean验证,EJB 3.1 Lite,CDI等的Java EE 6 Web Profile对此非常适合,您可以使用GlassFish v3 Web
  • Spring boot 中的异常处理程序不起作用?(Exception Handler in Spring boot not working?)
    问题 我正在使用 Spring Boot 在我的项目中实现全局错误处理。 当我的“客户”对象为“空”时,我抛出“ResourceNotFoundException”。 但是 Spring 异常处理程序没有捕获它。 我的 RestController 类: @RestController @Path("/customer") public class CustomerEndpoint { private static final Logger LOGGER = LoggerFactory.getLogger(CustomerEndpoint.class); @Autowired private ICustomerService customerService; @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public Response getCustomerById(@PathParam("id") Integer id) throws ResourceNotFoundException { CustomerVO article = customerService.getCustomerById(id); if (article == null) { throw new
  • CommonJ TimerManager versus EJB3 TimerService
    I have to implement a simple (not clustered) timer for WebLogic and it seems there are two different 'standard' options Timer and Work Manager API (CommonJ) EJB3.0 TimerService Does anyone have any advice on using the CommonJ TimerManager versus using the EJB3 TimerService in WebLogic 10.0? Thank you.