3

我正在用 Java(带有 jQ​​uery 前端)构建一个需要与第三方应用程序对话的应用程序。最多每两秒更新一次界面。

使用彗星是个好主意吗?如果是这样,它们如何融入图片中?

我可以使用哪些其他方式/技术来使应用程序更好?

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

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

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

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

我绝对一无所知,所以任何建议将不胜感激。

谢谢!

编辑:我打算这样做,以便桌面应用程序不断从第三部分轮询并写入数据库,而 Web 应用程序仅从数据库读取和显示,这将减少 Web 应用程序的负载及其所必须do 是从数据库中读取的。

4

5 回答 5

5

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

http://www.springsource.org/about

http://struts.apache.org/2.x/index.html

另一种选择是使用 Appfuse 等模板框架来启动和运行,而无需将大量框架集成在一起,请参阅:

http://appfuse.org/display/APF/AppFuse+QuickStart

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

从您对 2 秒的延迟要求来看,查看某种 AJAX 框架是明智的 - JQuery 或 Prototype/Scriptaculous 都是不错的起点。

http://jquery.com/

http://www.prototypejs.org/

就其他使事情变得更好的技术而言,您将需要考虑构建系统,Ant/Maven 与 Maven 很好,两者中稍微复杂一些。

http://ant.apache.org/

http://maven.apache.org/download.html

此外,考虑使用 JUnit 来测试应用程序。您可能需要考虑将 Selenium 用于前端的功能测试。

http://www.junit.org

http://seleniumhq.org/

于 2009-06-23T03:13:23.837 回答
4

这真的是股票交易应用程序吗?还是只是一个股价显示应用程序?我问是因为从你的描述中听起来像后者。

每秒轮询一次数据有多重要?具体来说,如果一些民意调查迟到一两秒,这会很重要吗?

如果您正在构建一个股票交易应用程序(其中时间是绝对关键的),或者如果您不能承受投票延迟,我建议您看一下 Java 实时解决方案之一:

除此之外,我唯一的建议是坚持良好的 OO 设计实践。例如,使用 DAO 写入数据库,这样,如果您发现 Berkeley DB 不适合您,您可以相对轻松地切换到关系数据库系统。如果您决定需要它,它还使您可以轻松地转向某些数据库分区解决方案(例如,Hibernate Shards )。

虽然我可能有自己的技术偏好(例如,我会像其他人提到的那样选择Spring MVC作为前端,我会尝试使用Hibernate来实现持久性),但我真的不能声称这些技术会比其他技术更好在那里。如果符合要求,请选择您熟悉的东西。

于 2009-06-24T13:13:36.470 回答
2

我认为在选择关注可扩展性和可扩展性的技术之前,您应该关注您的架构设计。一旦架构设计到位,您就可以查看可用的内容以及需要构建的内容,所有这些都应该非常明显。

虽然不能直接比较 Google、eBay 和 YouTube 如何处理它们面临的可扩展性问题。虽然交易系统不会遇到这些人在用户数量上遇到的问题,但您会在数据量和及时处理价格变动方面遇到类似的问题。

伦敦证交所已有 3000 个名字,乘以全球 10 个左右受欢迎的交易所,在每个市场开放期间,你会得到大量数据不断更新。为了让您了解从单个交易所捕获数据所涉及的内容,请查看http://kx.com/

从数据库的角度来看,您将需要允许集群并具有可靠复制的工业实力——对我来说,这意味着 Oracle。您还想查看时间序列数据库设计,根据我的经验,这是构建此类系统的最佳方式。

相同的扩展性和可靠性要求将适用于您的应用程序服务器,JBoss 是那里的合乎逻辑的选择,尽管我也认为 OSGi Spring 服务器 ( http://www.springsource.com/products/dmserver ) 具有轻量级特性可以让它更快。

您还需要 Apache 服务器来进行负载平衡和提供静态内容 - 快速 Google 会找到大量相关信息,因此我不会在此重复。

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

恕我直言,静态前端也不会减少芥末。看看市场上已经出现了什么——CNC Markets、IG Index 等都有非常令人印象深刻的实时交易应用程序。

顺便说一句,假设这是一个商业项目,并不意味着让整个事情变得沮丧,CNC Markets、IG Index 等公司从交易费中赚钱,软件是达到目的的一种手段,你得到了只需拥有一个帐户即可免费访问。交易软件的另一个目标是商业机构,如银行、投资经理等。我想要一个非常无懈可击的计划,以便在花费太多时间和精力之前如何打入这两个市场。

于 2009-06-23T08:54:02.740 回答
1

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

许多人会建议,使用 Spring 配置应用程序并进行任何依赖注入可能不是一个坏建议。

如果您正在寻找更轻量级的东西,您可能会考虑 grails。它快速发展并变得成熟。

确实,在不知道这将是什么样的“生产”环境的情况下,很难推荐一些东西。我们在谈论很多交易吗?(当然,这是一个股票交易程序,但它是一个有少量用户的模拟等等......)建议事情很有趣,但如果你是认真的,我不确定我会开始一个像这样的重大项目这个。有很多方法可以做到这一点,也有很多方法可以做到这一点。

于 2009-06-23T02:42:35.583 回答
0

您的意图是构建一个显示实时数据的 Web UI,例如:时间、市场数据等...

我个人使用的技术之一是Web Firm Framework ,它是Apache License 2.0下的开源框架。它是一个用于构建 Web UI 的 Java 服务器端框架。对于每个标签和属性,都有一个对应的 java 类。我们只是用 Java 代码而不是纯 HTML 和 JavaScript 构建 UI。优点是我们在服务器标签和属性对象中所做的任何更改都将反映到浏览器页面,而无需客户端的任何显式触发。在您的情况下,我们可以简单地使用在 UI 中进行数据更改。ScheduledExecutorService

例如:

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);

为了实时显示时间,您可以使用SharedTagContent<Date>ContentFormatter<Date>在特定时区显示时间。您可以观看此视频以更好地理解。您还可以从此github 存储库下载示例项目。

于 2019-12-27T07:34:33.147 回答