我不熟悉在Java 8中使用选项.我知道方法orElseGet()需要一个供应商,orElseThrow()也需要一个抛出异常的供应商.orElseThrow()可能是一个很好用的,如果我可以构造我自己的异常并在触发该异常时执行某些操作.
我的主要目标是使用一个方法来获取未包装的值,或者如果可选的包装为null,那么实际执行一个完全不同的函数.
寻找最接近的东西:
class DoInsteadClass {
public void doInstead() {
// Do this instead
}
}
Optional<String> myString = "Hello";
num.orElse(DoInsteadClass::doInstead);
Run Code Online (Sandbox Code Playgroud)
如果执行此操作的唯一方法是orElseThrow(),并且只要我可以使用'do this instead'代码处理异常,那也应该没问题.它只是使我的代码库更大,因为我必须为2或3个案例创建一些不同的自定义实用程序供应商,其中一些可选值将返回null.
问题是,.ifPresent()用值调用指定的使用者,否则什么也不做.如果值为null,我需要它来进行SOMETHING.我当前的代码使用自定义的解决方法,我首先检查值是否为null,如果是,则执行所选的函数.然后下一个语句是检查ifPresent()的语句.所以这是做同样的事情,我只是在寻找更多糖衣,一个声明版本.
我并不完全理解这两个功能在(WiredTiger)MongoDB程序中如何相互关联:
1)WiredTiger快照
2)数据锁定
如果使用WiredTiger引擎的每次读取操作在读取时都提供了数据库级别"快照"(以便创建一致性(ACID中的C),为什么我们还需要锁定?让我们使用一个示例.
我在文档级别执行查询(读取操作).好的,所以我知道我得到了数据库级别的快照,所以我的数据是一致的,即使另一个用户同时写入同一个文档,更新它.
那么在这一点上,在该文档上使用Shared-Lock有什么用处,它会阻止对该文档的所有写入(独占)操作,直到发布共享锁定为止?在我阅读文档的同时写入该文档可能会出现什么问题,如果我实际上使用了在阅读时提供给我的文档快照?为什么我会关心文件在阅读操作期间是否被锁定?我已经从那个时间点得到了(一致的)数据,不是吗?
我显然在这里错过了一个关键概念......任何帮助?
谢谢.
所以我在这里做所有被Docker化的工作。Traefik和我的docker Registry实例一样都在容器中运行。如果我在注册表中单击,则可以从注册表中正常进行推/拉操作mydomain.com:5000/myimage。
问题出在我尝试使用443击打它时mydomain.com/myimage。我在这里设置的是Traefik反向代理,在侦听443 mydomain.com,并将内部请求转发到:5000我的Registry实例。
当我从Traefik网址进行推/拉时,它挂起并倒数,等待在循环上重试。当我查看注册表的日志时,每一个我都可以看到实例IS实际上与反向代理Traefik通信,但是,我一遍又一遍地(在客户端的每次重试中)都遇到此错误:
2018/05/31 21:10:43 http: TLS handshake error from proxy_container_ip:port: remote error: tls: bad certificate
关于TLS问题,Docker Registry确实非常严格。由于我仍在开发中,因此我在这里使用所有自签名证书。知道是什么原因导致此错误吗?我假设Traefik代理检测到注册表提供的证书不可信(自签名),因此没有完成“推送”请求,反之亦然-发送注册表时,注册表返回到Traefik代理会检测到它不受信任。
如果需要,我可以提供其他信息。当前设置是Traefik和Registry都有自己的.crt和.key文件集。这两个(当然)都启用了TLS。
谢谢。