小编mku*_*ski的帖子

等待异步任务的安全有效方法

在系统中,我有一个对象-称为它TaskProcessor。它保存任务队列,这些任务由一些线程池(ExecutorService+ PriorityBlockingQueue)执行。每个任务的结果都保存在数据库中的某个唯一标识符下。

知道此唯一标识符的用户可以检查此任务的结果。结果可能在数据库中,但是任务仍然可以在队列中等待执行。在这种情况下,UserThread应等待任务完成。

此外,以下假设是有效的:

  • 如果其他人知道唯一标识符,则其他人可以将任务加入队列TaskProcessor而某些随机人UserThread可以访问结果。

  • UserThreadTaskProcess在同一个应用中。TaskProcessor包含线程池,并且UserThread只是servlet线程。

  • UserThread要求结果时应将其阻止,并且结果尚未完成。UserThreadTaskProcessor按唯一标识符分组的一项或多项完整任务完成后,应立即取消阻止

我的第一次尝试(幼稚的尝试)是在循环中检查结果并休眠一段时间:

// UserThread
while(!checkResultIsInDatabase(uniqueIdentifier))
  sleep(someTime)
Run Code Online (Sandbox Code Playgroud)

但是我不喜欢。首先,我在浪费数据库连接。此外,如果任务在睡眠后立即完成,那么即使结果刚刚出现,用户也将等待。

下次尝试基于等待/通知:

//UserThread 
while (!checkResultIsInDatabase())
  taskProcessor.wait()

//TaskProcessor
... some complicated calculations
this.notifyAll()
Run Code Online (Sandbox Code Playgroud)

但是我也不喜欢。如果UserThreads要使用更多功能TaskProcessor,那么每次完成某些任务时,它们都会被不必要地唤醒,而且它们还会进行不必要的数据库调用。

最后一次尝试是基于我所说的waitingRoom

//UserThread
Object mutex = new Object();
taskProcessor.addToWaitingRoom(uniqueIdentifier, mutex)
while (!checkResultIsInDatabase())
  mutex.wait()

//TaskProcessor
... Some complicated calculations
if (uniqueIdentifierExistInWaitingRoom(taskUniqueIdentifier))
  getMutexFromWaitingRoom(taskUniqueIdentifier).notify()
Run Code Online (Sandbox Code Playgroud)

但这似乎并不安全。在数据库check和之间 …

java concurrency multithreading

16
推荐指数
2
解决办法
337
查看次数

groovy - 从字符串中删除第一行

UNA:+.? '我必须从以下输入字符串中删除第一行 ( ):

UNA:+.? '
UNB+UNOA:2+422207530:9+8713381197918:14+20141212:1555+1082746344'
UNH+1+ORDERS:D:97A:UN'
BGM+220+105961-44+9'
DTM+137:20140121:102'
NAD+BY+0048003479::91'
NAD+SE+0000805406::91'
NAD+DP+0048003479::91'
CUX+2:USD+9'
PIA+1+M1PL05883LOT:BP::92'
PIA+1+927700077001:VP::91'
PRI+AAA:9:::1:PCE'
SCC+1'
QTY+21:10000:PCE'
DTM+2:11022014:102'
PIA+1+M1PL05883LOT:BP::92'
PIA+1+927700080201:VP::91'
PRI+AAA:9:::1:PCE'
SCC+1'
QTY+21:20000:PCE'
DTM+2:04022014:102'
UNS+S'
UNT++1'
UNZ+1+10596144'
Run Code Online (Sandbox Code Playgroud)

groovy

3
推荐指数
1
解决办法
5779
查看次数

Freemarker从列表中获取元素

我正在做 teplate,我将在 Smooks 转换中使用它。我需要在 freemarker 中获取列表的第二个元素,但我不知道该怎么做。freemarker 模板中有我的代码片段。

<#list partnerList as PARTNER>
    ${PARTNER.partnrid}
    ${PARTNER.name}
</#list>
Run Code Online (Sandbox Code Playgroud)

还有java类:

public class Partner {
    private String PARTNRID;
    private String NAME;

  public String getPartnrid() {
  return PARTNRID;
 }
 public void setPARTNRID(String PARTNRID) {
  this.PARTNRID = PARTNRID;
 }
 public String getName() {
  return NAME;
 }
 public void setNAME(String NAME) {
  this.NAME = NAME;
 }
}
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,我只需要第二个元素。我想避免打印其余项目。谢谢!

freemarker smooks

2
推荐指数
1
解决办法
2万
查看次数

如何为会议和研讨会设计关系数据库

我必须为组织会议的公司设计一个数据库(作为大学的作业)。私人客户或组织可以参加这些会议(每个组织可以报名几个人)。目前我需要一些如何完成我的项目的建议,因为我的老师说这是非常不正确的。

这是简短的描述:

  • 有些公司组织的会议可能需要一天或多天
  • 客户需通过www网站注册
  • 客户是个人或组织,但会议参加者是个人
  • 组织可以为会议预留一些空间,但应在会议开始前两周填写这些信息
  • 对于需要超过一天的会议,客户可以报名参加任何一天(例如仅第一天)
  • 此外,会议与研讨会相关(客户也可以参加研讨会),但前提是他们在这一天注册参加会议(会议日有许多研讨会)
  • 举办会议和研讨会的空间有限

@付款

  • 会议/研讨会的付款取决于:

    1. 如果参加者是学生 - 他有一些折扣

    2. 由于较早的与会者报名参加会议,折扣会更大

这是我几天前设计的架构。

在此输入图像描述

提前致谢

database sql-server database-design

0
推荐指数
1
解决办法
2699
查看次数