首页 » SEO优化 » php隐蔽发件ip技巧_JQueue实现发件箱模式的库

php隐蔽发件ip技巧_JQueue实现发件箱模式的库

访客 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

JQueueRunner.runner(/ a JDBC DataSource /)

请把稳,作为参数,您必须通报本地事务中当前正在利用的数据源或连接。
在这种情形下,如果您的事务已提交,则推送也将被提交。
如果有任何失落败,统统都将被回滚。
您推入行列步队的事宜或任务可以是任何文本。
然后,要利用行列步队中的事宜或任务,您必须编写如下内容:

php隐蔽发件ip技巧_JQueue实现发件箱模式的库

JTxQueue.queue(/a JDBC Data Source or a JDBC Connection /) .push( "{\"type\": \"job_type1\", \"event\":{\"id\": \"an id\", \"value\": \"\" }}");

php隐蔽发件ip技巧_JQueue实现发件箱模式的库
(图片来自网络侵删)

上面的代码将循环处理行列步队中的所有条款,直到它为空。
它将读取行列步队数据并调用您必须供应的 Job 接口的实例,以便对数据实行任何您须要的操作。
这可能是将推送到代理或只是调用任何其他外部做事 API。
您可以利用任何调度程序库(例如 Quartz)以所需的频率调度 JQueue 运行器,以保持行列步队为空。
runner 利用“select for update skip locked ” SQL 语句,这是一些关系数据库已经实现的一种新功能,用于(除其他外)在关系表中实现行列步队。
这是目前使 JQueue 在 PostgreSQL v9.5+ 和 MySQL 8.0+ 中事情的缘故原由之一(JQueue 中对 Oracle 和 MS SQL 的支持即将推出,由于它们都支持跳过锁定功能)。
现在让我们展示一些如何在本地事务中推送事宜的示例。
假设您的做事创建了用户,当发生这种情形时,您须要发布NewUserEvent。
如果您的做事利用普通 JDBC,您可以实行以下操作:Connection conn = connection();try { conn.setAutoCommit(false); //your business logic first final PreparedStatement st = conn.prepareStatement( "insert into user(id, user_name, pwd, email) values(108, 'user1','anyPassword','user1@dot.com')"); st.executeUpdate(); //then push an event JTxQueue.queue(conn) .push(new NewUserEvent(108, "user1", "user1@dot.com").toJson()); conn.commit();} catch (SQLException | JQueueException e) { try { conn.rollback(); throw new RuntimeException(e); } catch (SQLException e1) { throw new RuntimeException(e1); }} finally { try { conn.setAutoCommit(true); conn.close(); } catch (SQLException e) { throw new RuntimeException(e); }}如果您的做事利用 JPA/Hibernate,您可以实行以下操作:EntityManagerFactory emf = Persistence.createEntityManagerFactory("...");EntityManager em = emf.createEntityManager();EntityTransaction tx = em.getTransaction();try { tx.begin(); //your business logic first User u = new User("username1", "pwd1", "user@dot.com"); em.persist(u); //Then push an event Session session = em.unwrap(Session.class); session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { JTxQueue.queue(connection) .push(new NewUserEvent(u.id(), u.userName(), u.email()).toJson()); } }); tx.commit();} catch (Exception e) { tx.rollback(); throw new RuntimeException(e);} finally { if (em != null && em.isOpen()) em.close(); if (emf != null) emf.close();}而且,如果您的做事利用 Spring,您可以这样做:@RestController@RequestMapping("/api/users")public class UserController { @Autowired private UserRepository userRepository; @Autowired private DataSource dataSource; @PostMapping @ResponseStatus(HttpStatus.CREATED) @Transactional public User create(@RequestBody User user) throws SQLException { //your business logic first User u = userRepository.save(user); //then push an event JTxQueue.queue(dataSource) .push(new NewUserEvent(u.id(), u.getUserName(), u.email()).toJson()); return u; }}在上面的所有示例中,事务包装了您的业务逻辑以及推送到行列步队中。
JQueue的灵感来自 Yii2 Queue 一个精良的 PHP 库。
希望它有助于使发件箱模式的实现更随意马虎和大略!

标签:

相关文章