Java 服务器端设计

Java 服务器端设计,java,concurrency,backend,Java,Concurrency,Backend,我是新来的,想寻求一些关于我的系统设计的指导。我正在开发一个队列系统,它将根据客户端的请求从队列中创建、更新和删除票证。我用它构建了一个spring boot restful api(TicketController)。 我想避免并发问题,所以我使用@Component和synchronized关键字来处理任何添加/删除操作 TicketController.java @Autowired TicketManager ticketManager; @RequestMapping

我是新来的,想寻求一些关于我的系统设计的指导。我正在开发一个队列系统,它将根据客户端的请求从队列中创建、更新和删除票证。我用它构建了一个spring boot restful api(TicketController)。
我想避免并发问题,所以我使用@Component和synchronized关键字来处理任何添加/删除操作

TicketController.java

@Autowired
    TicketManager ticketManager;

    @RequestMapping(value = "tickets", method = RequestMethod.GET)
    public ResponseEntity<List<Ticket>> getTickets(
            @RequestParam(value = "device", defaultValue = "") String device) {

        log.info("Ticket GET LIST");

        // get full list of tickets
        List<Ticket> tickets = ticketManager.getTickets();

    }
@Autowired
TicketManager TicketManager;
@RequestMapping(value=“tickets”,method=RequestMethod.GET)
公众反应(
@RequestParam(value=“device”,defaultValue=“”)字符串设备){
日志信息(“票务获取列表”);
//获取完整的门票列表
List tickets=ticketManager.getTickets();
}
TicketManager.java

@Service 
public class TicketManager { 

  // ticket list on memory 
  @Autowired 
private TicketList ticketList = new TicketList(); 

  // actual db services using JPA 
  @Autowired 
private TicketService ticketService; 

/*******************/
/* ticket methods */ 
/*******************/ 
  @Override 
  public Ticket getTicket(BigInteger ticketId) { 
    return ticketList.getTicket(ticketId); 
  } 

  @Override 
  public List<Ticket> getTickets() { 
    return ticketList.getTicketList(); 
  } 

  @Override 
  public synchronized Ticket createTicket(Ticket ticket) throws Exception 
  { 
    // some validation 
    ... 

    // create ticket in DB
    Ticket newTicket = ticketService.createTicket(ticket); 

    // add ticket in memory list. 
    ticketList.add(newTicket); 

    // some other operations ... 
  } 

// some more methods for Ticket update, delete etc. 
  ... 
}
@服务
公共类TicketManager{
//内存中的票务列表
@自动连线
private TicketList TicketList=新建TicketList();
//使用JPA的实际数据库服务
@自动连线
私人票务票务服务;
/*******************/
/*票务方法*/
/*******************/ 
@凌驾
公共票证getTicket(biginger ticketId){
返回ticketList.getTicket(ticketId);
} 
@凌驾
公共列表getTickets(){
返回ticketList.getTicketList();
} 
@凌驾
公共同步票证createTicket(票证)引发异常
{ 
//一些验证
... 
//在DB中创建票证
票证newTicket=ticketService.createTicket(票证);
//在内存列表中添加票证。
ticketList.add(newTicket);
//其他一些行动。。。
} 
//更多的票证更新、删除等方法。
... 
}
TicketList.java

@Component 
public class TicketList extends Observable {

private List<Queue> queueList;

@PostConstruct
public void init()
{
    queueList = new ArrayList<Queue>(); 
}

// get a specific queue
public List<Queue> getQueueList()
{
    return queueList;
}

// get a specific ticket
public Ticket getTicket(int id)
{
    Ticket ticket = queueList.stream().flatMap(q -> 
        q.getTicketList().stream().filter(t -> t.getId==id) 
    ).findFirst().orElse(null);
    return ticket;
}

// add ticket
public void add(Ticket ticket)
{
    if (ticket != null)
    {
        Queue queue = ticket.getQueue();

        // find the correct queue to add this ticket
        Queue existingQueue = queueList.stream().filter(q -> q.getId()==queue.getId()).findFirst().orElse(null);

        if (existingQueue != null)
        {
            // ticket list exists, add new ticket to the queue list.
            if (existingQueue.getTicketList() != null)
            {
                // add tickets if not exists in queue already.
                if (!existingQueue.getTicketList().stream().anyMatch(t -> t.getId()==ticket.getId()))
                {
                    existingQueue.getTicketList().add(ticket);
                }
            }
        }
    }
}

// update, delete functions, etc
...
}
@组件
公共类票证列表扩展为可观察{
私有列表队列列表;
@施工后
公共void init()
{
queueList=新的ArrayList();
}
//获取特定队列
公共列表getQueueList()
{
返回队列列表;
}
//拿到一张特别的票
公共票证获取(int id)
{
票证票证=queueList.stream().flatMap(q->
q、 getTicketList().stream().filter(t->t.getId==id)
).findFirst().orElse(null);
回程票;
}
//加票
公共无效添加(票证)
{
如果(票证!=null)
{
Queue Queue=ticket.getQueue();
//找到添加此票证的正确队列
Queue existingQueue=queueList.stream().filter(q->q.getId()==Queue.getId()).findFirst().orElse(null);
if(existingQueue!=null)
{
//票证列表已存在,请将新票证添加到队列列表。
if(existingQueue.getTicketList()!=null)
{
//如果队列中不存在票证,则添加票证。
如果(!existingQueue.getTicketList().stream().anyMatch(t->t.getId()==ticket.getId()))
{
existingQueue.getTicketList().add(票证);
}
}
}
}
}
//更新、删除功能等
...
}
当我想添加更多restful控制器时,问题就会出现,例如UserController、QueueController等

例如,如果我想添加QueueController rest api类,我必须增强这个TicketManager来处理作业,以保持TicketList对象同步

现在,如果我想添加另一个UserController类,我还应该继续在TicketManager类中添加东西吗?用户对象也是触发票证更新操作的一个因素,我应该继续增强我的TicketManager以处理所有restful控制器的所有内容,还是有其他方法可以实现,以便根据不同的对象清除每个模块?(例如,创建QueueManager、UserManager以处理特定作业,但我担心我的TicketList对象将由不同的线程/实例输入,并且不同步。)


提前感谢。

您已经有了不同的控制器(UserController、TicketController),可以从这些控制器调用服务。为什么需要Manager类?原因是我试图保留一个容器(TicketList类),以便在系统加载时将票证和队列存储在内存中。每当有人使用add/edit/remove访问容器时,我都会通知一些其他服务来处理其他工作,例如SMS_服务向用户发送通知等(这就是为什么您会看到票证列表扩展了Observable类)。因此,我希望所有不同的控制器使用容器类中相同的数据集。Manager类为这些控制器提供入口,还用于处理任何业务逻辑和验证。您已经有了不同的控制器(UserController、TicketController),可以从这些控制器调用服务。为什么需要Manager类?原因是我试图保留一个容器(TicketList类),以便在系统加载时将票证和队列存储在内存中。每当有人使用add/edit/remove访问容器时,我都会通知一些其他服务来处理其他工作,例如SMS_服务向用户发送通知等(这就是为什么您会看到票证列表扩展了Observable类)。因此,我希望所有不同的控制器使用容器类中相同的数据集。Manager类为这些控制器提供入口,还用于处理任何业务逻辑和验证。