构建一个基于Java的股票交易应用程序,需要使用技术的指针

构建一个基于Java的股票交易应用程序,需要使用技术的指针,java,jquery,jsp,web-applications,berkeley-db,Java,Jquery,Jsp,Web Applications,Berkeley Db,我正在用Java构建一个需要与第三方应用程序对话的应用程序(带有jQuery前端)。它最多需要每两秒钟更新一次接口 使用彗星是个好主意吗?如果是这样的话,它们如何融入到画面中 我还可以使用哪些其他方法/技术来改进应用程序 该应用程序将从第三方应用程序中轮询股票价格,将其写入数据库,然后每秒将其推送到前端。对于轮询,我有一个每秒运行一次的计时器来调用第三方应用程序获取数据,然后我必须使用JSP或其他方式将其显示到前端 在这一点上,我不确定我是否应该使用servlet将其写到前端,你会推荐什么?我该

我正在用Java构建一个需要与第三方应用程序对话的应用程序(带有jQuery前端)。它最多需要每两秒钟更新一次接口

使用彗星是个好主意吗?如果是这样的话,它们如何融入到画面中

我还可以使用哪些其他方法/技术来改进应用程序

该应用程序将从第三方应用程序中轮询股票价格,将其写入数据库,然后每秒将其推送到前端。对于轮询,我有一个每秒运行一次的计时器来调用第三方应用程序获取数据,然后我必须使用JSP或其他方式将其显示到前端

在这一点上,我不确定我是否应该使用servlet将其写到前端,你会推荐什么?我该怎么做呢

有什么新技术可以替代servlet吗

我还使用Berkeley db来存储数据,您认为这是一个好的选择吗?如果使用伯克利有什么缺点的话

我完全不懂,所以任何建议都将不胜感激

谢谢


编辑:我计划这样做,deskop应用程序不断地从第三部分轮询并写入数据库,而web应用程序只从数据库读取和显示数据,这将减少web应用程序的负载,它所要做的就是从db读取数据

PostgreSQL可能是正确的数据库。它比MySQL更具进取心。至于前端,有很多东西可以放在servlet、SpringMVC、Tapestry等的“最上面”。实际的servlet实现将对您隐藏

很多人会建议,使用Spring来配置应用程序和进行依赖注入可能不是一个坏建议

如果你正在寻找更轻的东西,你可以考虑GRAILS。它的发展很快,并且变得成熟


实际上,如果不知道这将是什么样的“生产”环境,就很难推荐产品。我们谈的是很多交易吗?(当然,这是一个股票交易程序,但它是一个有少量用户的模拟程序等等)提出建议很有趣,但如果你是认真的,我不确定我会启动这样一个大型项目。有很多方法可以做到这一点,也有很多方法可以做到这一点。

看看如何使用web应用程序框架而不是servlet,除非它是一个只有一个屏幕的基本项目。不幸的是,Java世界中有很多东西,它可能有点像雷区。坚持使用SpringMVC或Struts 2,最糟糕的部分是设置它们,但是看看示例应用程序加上一两个教程,然后从那里开始工作

另一种选择是使用模板框架(如Appfuse)启动并运行自己,而无需将许多框架集成在一起,请参见:

它为您提供了一个模板来设置SpringMVC,其中MySQL作为数据库,Spring作为POJO框架。这可能是一种快速启动和构建原型的方法

从2秒的延迟要求来看,最好看看某种AJAX框架——JQuery或Prototype/Scriptaculous都是很好的起点

<> P>在其他技术方面,为了使事情变得更好,你将需要考虑一个构建系统,Ant/Maven和Maven稍微复杂一些。p>

也可以考虑JUnit来测试应用程序。您可能需要考虑硒对前端功能测试的影响。


我认为在选择技术之前,您应该先关注架构设计,重点关注可伸缩性和可扩展性。一旦一个架构设计到位,你就可以看到什么是可用的,什么是需要构建的,所有这些都应该是显而易见的

虽然没有直接的可比性,但看看谷歌、eBay和YouTube如何处理它们所面临的可伸缩性问题。虽然交易系统不会出现这些家伙在用户数量方面的问题,但在数据量和能够及时处理价格波动方面,你也会遇到类似的问题

伦敦证交所有3000个名字,再乘以全球10个左右的热门交易所,在每个市场开放期间,有很多数据不断更新。为了让您了解从单个交换捕获数据涉及哪些内容,请查看

从数据库的角度来看,您将需要一些行业优势,以允许集群和可靠的复制—对我来说,这意味着Oracle。你还想看看a,根据我的经验,这是构建此类系统的最佳方式

相同的缩放和可靠性要求将应用于您的应用服务器,JBOSS是其中的逻辑选择,尽管我也会考虑OSGi Spring Server(),因为它的轻量级特性可以使其更快。p> 您还需要Apache服务器来实现负载平衡,并提供静态内容——快速的谷歌搜索将显示大量关于这方面的信息,因此我在此不再重复

也别忘了轮询,它不会扩展。查看如何使用消息传递和使用者进程进行跨进程通信,使用事件和工作线程进行进程内通信。这两种技术都实现了自然的负载平衡效果,可以根据需要通过增加使用者进程或工作线程的数量来进行调整

另外,一个静态前端也不会削减芥末,IMHO。看看市场上已经出现了什么——CNC市场、IG指数等都有令人印象深刻的实时交易应用程序

另一方面,假设这是一个商业项目,并不意味着让整个事情变得令人沮丧,像CNC Markets、IG这样的公司也加入了进来
AtomicReference<BigDecimal> oneUSDToOneGBPRef = new AtomicReference<>(new BigDecimal("0.77"));

SharedTagContent<BigDecimal> amountInBaseCurrencyUSD = new SharedTagContent<>(BigDecimal.ZERO);

Div usdToGBPDataDiv = new Div(null).give(dv -> {

    //the second argument is formatter
    new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {
        BigDecimal amountInUSD = content.getContent();
        if (amountInUSD != null) {
            return new SharedTagContent.Content<>(amountInUSD.toPlainString(), false);
        }
        return new SharedTagContent.Content<>("-", false);
    });

    new Span(dv).give(spn -> {
        new NoTag(spn, " USD to GBP: ");
    });

    new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {

        BigDecimal amountInUSD = content.getContent();
        if (amountInUSD != null) {

            BigDecimal oneUSDToOneGBP = oneUSDToOneGBPRef.get();

            BigDecimal usdToGBP = amountInUSD.multiply(oneUSDToOneGBP);

            return new SharedTagContent.Content<>(usdToGBP.toPlainString(), false);
        }
        return new SharedTagContent.Content<>("-", false);
    });
});

amountInBaseCurrencyUSD.setContent(BigDecimal.ONE);

//just to test
// will print <div><span>1</span><span> USD to GBP: </span><span>0.77</span></div>
System.out.println(usdToGBPDataDiv.toHtmlString());


ScheduledExecutorService scheduledExecutorService =
        Executors.newScheduledThreadPool(1);

Runnable task = () -> {

    //dynamically get USD to GBP exchange value
    oneUSDToOneGBPRef.set(new BigDecimal("0.77"));

    //to update latest converted value
    amountInBaseCurrencyUSD.setContent(amountInBaseCurrencyUSD.getContent());
};
ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(task, 1, TimeUnit.SECONDS);

//to cancel the realtime update
//scheduledFuture.cancel(false);