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