当前位置: 首页 > 知识库问答 >
问题:

Java-ee中的串行执行

吕翰飞
2023-03-14

我有一些传入的并发请求应该以串行方式处理。我试图通过将请求转换为消息并发布到jms队列来实现这一点。然后使用 mdb 处理队列。

使用特定于供应商的配置,我知道我可以将mdb限制为一个实例,但是有什么推荐的可移植的方法来解决这个问题呢?

编辑:忘了提一下我真的不需要jms的特性(可靠性等)。

共有1个答案

司空宗清
2023-03-14

假设你有这样的工作。

class LogJob implements Runnable{
    private final String name;
    public LogJob(String name){
        this.name = name;
    }
    @Override
    public void run() {
        System.out.println(" Starting ."+name);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(" End ."+name);
    }
}

它只是显示开始和结束作业。为演示放置睡眠

创建作业列表

        ArrayList<LogJob> jobs = new ArrayList<LogJob>();
        for ( int i=0;i<10;i++){
            LogJob job = new LogJob("Job"+i);
            jobs.add(job);
        }

让我们看看如何串行处理

   ExecutorService singleThread = Executors.newSingleThreadExecutor();
        for (Iterator<LogJob> iterator = jobs.iterator(); iterator.hasNext();) {
            singleThread.execute(iterator.next());
        }
        singleThread.shutdown();

这将提供输出。

Starting .Job0
 End .Job0
 Starting .Job1
 End .Job1
 Starting .Job2
 End .Job2
 Starting .Job3
 End .Job3
 Starting .Job4
 End .Job4
 Starting .Job5
 End .Job5
 Starting .Job6
 End .Job6
 Starting .Job7
 End .Job7
 Starting .Job8
 End .Job8
 Starting .Job9
 End .Job9

更新

根据评论中的对话,我知道你必须在Java环境中使用它。正如你所说,你必须使用ManagedExecutorService。你怎么可能不需要使用单例Ejb和并发链接队列。

您可以将作业实现为可调用的,并且可以使用 Future.get() 阻止进一步的处理

String name = managedService.submit(iterator.next()).get();

来自API

    If you would like to immediately block waiting for a task, 
you can use constructions of the form result = exec.submit(aCallable).get();
 类似资料:
  • 这是我不想检查的30行Java EE管道方法调用! 在单步执行一个方法时,跳过所有这些的唯一可靠方法是在下一个方法调用中放一个断点,然后点击“单步执行”而不是“单步执行”。然而,与简单的“一步进入”相比,一直这样设置断点是一个主要的麻烦。当我需要走出我正在检查的方法时,我必须重复同样的事情。 我了解Eclipse中的步骤过滤器,并尝试使用这些过滤器,但是一些自动生成的代理类被注入到我自己的包中,所

  • 问题内容: 我有一个Java EE应用程序,该应用程序在部署后应该与外部系统启动一次同步过程。 我该如何执行此要求? 问题答案: 我测试了使用和注释的建议解决方案。事实证明,Glassfish不会在完成所有带有注释的方法之前完成应用程序的部署。因此,就我而言,部署将需要几分钟到一个小时。 但是我想出了一种实现我想要的东西的不同方法。最好的解决方案似乎是计时器回调方法,该方法在执行后取消其计时器。

  • 问题内容: 我想知道当前的方法是关于使用JSF 2.0(以及是否存在任何组件)和Java EE 6核心机制(登录/检查许可权/注销)的Web应用程序的用户身份验证,并将用户信息保存在JPA中实体。Oracle Java EE教程对此有点稀疏(仅处理servlet)。 这并没有利用诸如Spring-Security(acegi)或Seam之类的其他框架,而是尽可能地希望使用新的Java EE 6平台

  • 这是SUN公司推出的J2EE SDK,是J2EE的参考实现,是实现J2EE最全的开发工具包,不过最好只在开发中使用。 J2EE,Java2平台企业版(Java 2 Platform Enterprise Edition), 是Sun公司为企业级应用推出的标准平台(Platform)。Java平台共分为三个主要版本Java EE、Java SE和Java ME。 Sun公司在1998年发表JDK1.

  • 问题内容: 我需要在Java字符串之间执行Diffs。我希望能够使用原始的string和diff版本重建字符串。有人用Java完成吗?你使用什么图书馆? 问题答案: 这个库似乎可以解决问题:google-diff-match-patch。它可以根据差异创建补丁字符串,并允许重新应用补丁。

  • 问题内容: 我已经为Web API实现了多个软件包,每个软件包都有自己的测试用例。使用测试通过每个包装时通过。如果我想一次用测试案例运行所有测试,则总是失败。 在每个测试案例中,我使用来重新创建整个架构,并应用所有迁移。测试套件随机报告错误,说不存在关系/表,所以我猜每个测试套件(每个程序包)都以某种方式并行运行,从而弄乱了数据库状态。 我试图通过一些测试标志,例如没有成功。 这里的问题可能是并行