我需要从一个石英工作中调用一个ejb方法,因为我在定位ejb工作时遇到了麻烦.我已经定义了一个Local接口和一个无状态实现.在websphere 7上部署时,EjbInvokerJob无法在我的jndi树中找到我的组件.这是我的石英作业定义(这是通过quartz init servlet加载的)
JobDetail jd = JobBuilder//
.newJob(EJBInvokerJob.class)//
.withIdentity("job", "group")//
.usingJobData(EJBInvokerJob.EJB_JNDI_NAME_KEY, "ejb/myBean")//
.usingJobData(EJBInvokerJob.EJB_METHOD_KEY, "update")//
.build();
String cronExpr = getInitParameter("cronExpr");
Trigger cronTrigger = TriggerBuilder//
.newTrigger() //
.forJob(jd) //
.startNow() //
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpr))//
.build();
Scheduler sched = StdSchedulerFactory.getDefaultScheduler();
sched.scheduleJob(jd, cronTrigger);
sched.start();
Run Code Online (Sandbox Code Playgroud)
我的bean在它上面有这个注释
@Stateless(name = "myBean")
Run Code Online (Sandbox Code Playgroud)
我该如何绑定EJB_JNDI_NAME_KEY?在websphere中,或者我应该能够通过此配置执行此操作.我认为问题在于我缺乏jndi树知识.由于启动作业的servlet在同一个jvm中运行,因此本地接口应该足够了
我有一个Web应用程序,有一些奇怪的行为,我无法真正指责.我的问题的核心是我的休息端点返回的值存在不一致的行为.当我启动应用程序时,每次调用此端点时,我的查询都会返回相同的值.当我更新实体时,我的实体管理器开始表现得很奇怪.现在我的查询开始返回不同的结果.有一次它返回旧值而不是数据库中的值,或者我的结果列表包含代理而不是对象(混合).

我已经验证我的@transaction方法正确放置并且在我的调试堆栈中我看到事务拦截器和实体管理器是根据后端的请求创建的(所以没有guice持久性过滤器)
我的感觉表明问题出在会话环境中.我有这种感觉(但我无法真正掌握它)它在多个请求中重用了我的持久化上下文.
我已经将一些框架放在一起使这一切都有效.我使用resteasy作为jax-rs实现者.guice(4.0beta4)作为cdi实现者,hibernate作为jpa实现者.因为我们在注入entitymanager时需要使用提供者(因为每个事务都创建了entitymanager),所以我将它包装在EntityManagerProxy中.此类实现EntityManager接口,并将所有方法委托给provider.get().method().
public class EntityManagerProxy implements EntityManager {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public EntityManagerProxy(final Provider<EntityManager> entityManagerProvider) {
this.entityManagerProvider = entityManagerProvider;
}
private EntityManager getEntityManager() {
return entityManagerProvider.get();
}
@Override
public void persist(final Object entity) {
getEntityManager().persist(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
我的guice模块看起来像这样
public class OptiWEEEModule extends ServletModule implements Module {
@Override
protected void configureServlets() {
super.configureServlets();
bind(EntityManagerProxy.class);
// JPA
install(new JpaPersistModule("myPU"));
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一个模糊的问题,但有人可以帮助我朝着正确的方向前进吗?这不是一个我可以提供错误消息的问题.
编辑:我现在指出问题所在.使用分析器,我看起来实体上下文被guice重用.这意味着它不是每次都执行查询,而是使用现有的实体管理器,每次传递@transactional注释时都应该创建该实体管理器.
我已经在生产中使用 apache httpclient 4.5 一段时间了,但最近,随着新用例的添加,系统开始出现故障。
我们有多个通过 REST Web 服务进行通信的服务,客户端是 apache httpclient 4.5 的包装器。
假设我有服务 A 与服务 B 进行通信。通信工作正常,直到我重新启动服务 B。由于超时,我从服务 A 向服务 B 发起的下一次调用失败。经过一些研究后,我发现出于性能原因(不再有 2 次握手等),底层 TCP 连接被重用。由于服务器已重新启动,底层 TCP 连接已失效。
阅读文档后,我发现我的连接可以在n秒后过期。假设我重新启动服务 B,那么调用将在前n秒内失败,但之后连接会重建。这是我实现的keepAliveStrategy
connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(100);
connManager.setDefaultMaxPerRoute(10);
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy() {
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
long keepAliveDuration = super.getKeepAliveDuration(response, context);
if (keepAliveDuration == -1) {
keepAliveDuration = 45 * 1000; // 45 seconds
}
return keepAliveDuration;
}
};
CloseableHttpClient closeableHttpClient = …Run Code Online (Sandbox Code Playgroud) java ×2
ejb-3.0 ×1
guice ×1
httpclient ×1
jndi ×1
jpa-2.0 ×1
keep-alive ×1
resteasy ×1
websphere ×1