我有以下代码:
while(slowIterator.hasNext()) {
performLengthTask(slowIterator.next());
}
Run Code Online (Sandbox Code Playgroud)
因为迭代器和任务都很慢,所以将它们放入单独的线程是有意义的.以下是Iterator包装器的快速而脏的尝试:
class AsyncIterator<T> implements Iterator<T> {
private final BlockingQueue<T> queue = new ArrayBlockingQueue<T>(100);
private AsyncIterator(final Iterator<T> delegate) {
new Thread() {
@Override
public void run() {
while(delegate.hasNext()) {
queue.put(delegate.next()); // try/catch removed for brevity
}
}
}.start();
}
@Override
public boolean hasNext() {
return true;
}
@Override
public T next() {
return queue.take(); // try/catch removed for brevity
}
// ... remove() throws UnsupportedOperationException
}
Run Code Online (Sandbox Code Playgroud)
但是,这种实现缺乏对"hasNext()"的支持.当然可以阻止hasNext()方法阻塞,直到它知道是否返回true.我可以在我的AsyncIterator中有一个peek对象,我可以更改hasNext()从队列中获取一个对象并让next()返回此窥视.但是如果已达到委托迭代器的结尾,这将导致hasNext()无限期地阻塞.
我自己可以自己进行线程通信,而不是使用ArrayBlockingQueue:
private static class AsyncIterator<T> implements Iterator<T> {
private …
Run Code Online (Sandbox Code Playgroud) 嗨,我对Angular2,Karma和Jasmine相对较新.目前我正在使用Angular 2 RC4 Jasmine 2.4.x我有一个Angular 2服务,定期调用这样的http服务:
getDataFromDb() { return Observable.timer(0, 2000).flatMap(() => {
return this.http.get(this.backendUrl)
.map(this.extractData)
.catch(this.handleError);
});
}
Run Code Online (Sandbox Code Playgroud)
现在我想测试功能.出于测试目的,我刚刚在没有Observable.timer的单独函数上测试了"http.get":
const mockHttpProvider = {
deps: [MockBackend, BaseRequestOptions],
useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
describe('data.service test suite', () => {
var dataFromDbExpected: any;
beforeEachProviders(() => {
return [
DataService,
MockBackend,
BaseRequestOptions,
provide(Http, mockHttpProvider),
];
});
it('http call to obtain data',
inject(
[DataService, MockBackend],
fakeAsync((service: DataService, backend: MockBackend) => {
backend.connections.subscribe((connection: MockConnection) => {
dataFromDbExpected …
Run Code Online (Sandbox Code Playgroud) 我有一个在tomcat中运行的Java-Servlet应用程序,它运行在一个Docker容器中,该容器在Google容器引擎上运行.扩展docker镜像以便它还可以获取和刷新证书(每个域只有一个pod,因此不需要进行pod之间的通信).然而,certbot需要在某处保存它的凭据和证书,而pod的文件系统似乎是一个坏主意,因为它是短暂的,并且无法在pod重启后继续存在.根据存储选项表.谷歌云存储似乎是一个好主意,因为这是很便宜,体积自动大小,我还可以从多个位置访问它(我并不需要为每个单独的吊舱,这将是非常空创建一个磁盘)包括web-UI(后者可能对调试很有用),throuput和延迟对于这个用例来说真的没问题.
我创建了一个存储桶,现在我想从容器中访问该存储桶.谷歌描述了这里,并再次在这里,我可以安装使用FUSE桶.他们没有提到的是你需要让容器特权使用FUSE,这对我来说不太合适.此外,我需要安装整个谷歌云SDK并设置身份验证(我将存储...在哪里?).但实际上我并不需要保险丝访问.只需在启动时下载配置并在每次刷新后上传配置即可.所以与SCP类似的东西会......
有gcloud
可以从命令行访问文件,而不需要导火索,但它仍然需要与凭证莫名其妙初始化.
这里有 user326502提到
如果安装了App Engine SDK,则无法使用零配置[..]只要容器位于Google Compute Engine实例上,您就可以访问同一项目中的任何存储桶.
他进一步解释说,当我使用库时,我神奇地不需要任何凭据.我想我可以用这些库编写我自己的复制应用程序,但感觉事实是我没有从网上的任何人那里找到这样的东西让我觉得我完全走错了轨道.
那么如何从容器内实际访问谷歌云存储桶(尽可能简单)?
我有一个客户端/服务器应用程序,其中客户端是一个 angular-app。服务器确实为其提供的 API 提供了几个打字稿定义。这些定义是从项目外部文件夹加载的。到目前为止,这工作正常,但是现在我正在从 Angular 7 升级到 Angular 8(并且还将 Typescript 从 3.1 版升级到 3.5),并且当尝试使用定义中的非静态枚举时,现在会产生以下错误:
找不到模块:错误:无法解析“/path/to/server/definitions”中的“tslib”
当api.ts
-file 位于 client-dir 中时,一切正常。
为什么会发生这种情况,我能做些什么?
这是一个快速脚本,用于创建要重现的最小示例:
mkdir project
cd project
ng new client --minimal=true --skipGit=true --routing=false --style=css
mkdir server
echo 'export enum ApiSample { X = "X" }' > server/api.ts
sed -i 's/"compilerOptions": {/"compilerOptions": {"paths":{"api":["..\/server\/api"]},/' client/tsconfig.json
sed -i -e "1iimport { ApiSample } from 'api';" -e "s/title = 'client';/title = 'client' + ApiSample.X;/" client/src/app/app.component.ts
cd client
npm start
Run Code Online (Sandbox Code Playgroud)
或者,手动创建示例:
我需要修复我的应用程序中的一个错误,这显然会导致死锁.但是我不确定死锁实际发生在哪里.如果我能够获得所有线程的列表,包括使用IntelliJ的调试器暂停应用程序时它们拥有哪些监视器,那将非常有用.例如,类似于下面的文章解释了如何使用eclipse:
我尝试解析两个XML文档:<root/>
和<root xmlns="hallo"/>
.第一种情况正常,但后一种情况引发异常(xalan/xerces使用的是用OpenJDK 1.6/1.7进行的).一些谷歌搜索表明,这是因为使用没有前缀的XML命名空间.解析这样的文档对我来说感觉很正常而不是异国情调,所以我想知道如何解决这个问题.
我发现报告问题的所有其他人在SOAP应用程序的上下文中遇到了问题,并试图做一些复杂的东西,但是我找不到任何有简单设置的人就是我的.
有人建议将xalan升级到v2.7解决了这个问题.我不知道OpenJDK附带了哪个版本,但是我试图明确地将v2.7.1放在类路径上并且没有任何改变.(如何验证这是实际使用的版本?).
任何解决方法?
这是我的问题的测试:
public class DemoTest {
@Test(dataProvider = "provide_xml")
public void transform_doesNotThrowException(final String xml) throws Exception {
final SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
final SAXSource saxSource = new SAXSource(saxParser.getXMLReader(), new InputSource(new StringReader(xml)));
final Transformer transformer = TransformerFactory.newInstance().newTransformer();
final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
final DOMResult result = new DOMResult(document);
transformer.transform(saxSource, result);
}
@DataProvider
public Object[][] provide_xml() {
return new Object[][]{
{"<root/>"}, // works
{"<root xmlns=\"hello\"/>"} // broken
};
}
}
Run Code Online (Sandbox Code Playgroud)
这是抛出的异常:
ERROR: 'NAMESPACE_ERR: …
Run Code Online (Sandbox Code Playgroud) callFake 和 returnValue 的唯一区别是 callFake 可以根据自定义逻辑(参数/环境)返回不同的值?
还有其他区别吗?
请有人帮我理解这个数组的创建方式.
int[] it2= new int[][]{{1}}[0];
Run Code Online (Sandbox Code Playgroud)
it2
是一维数组,在右边我们有奇怪的初始化类型.代码编译得很好,但我能够理解它是如何工作的.
假设我有一个ArrayList的spring bean定义:
<bean id="availableLanguages" class="java.util.ArrayList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)
现在我可以将它注入各种bean中,例如:
@Controller
class Controller {
@Autowired
public Controller(ArrayList<String> availableLanguages) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.
但是,如果我稍微改变我的控制器并使用类型List
而不是ArrayList
这样:
@Controller
class Controller {
@Autowired
public Controller(List<String> availableLanguages) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我获得了所有类型bean的列表,String
而不是我定义的bean.但是我实际上想要将List包装到一个不可修改的List中,但只有将我的依赖项降级到列表才能实现.
以下XML文件:
<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)
与此控制器一起使用:
@Controller
class Controller { …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个node.js模块,我也希望用Jasmine测试它.
假设我的模块看起来与此类似:
var myModule = function (foo, bar) {
// Begin a workflow
var workflow = new (require('events').EventEmitter)();
workflow.on('test', function () {
var greet = greet();
return greet;
});
workflow.emit('test');
};
function greet () {
return "Hi!";
}
module.exports = {
myModule: myModule
};
Run Code Online (Sandbox Code Playgroud)
如何使用Jasmine测试我的模块,定位我发出的所有事件?
像这样的东西:
var myModule = require('../myModule.js');
describe('My Module test', function () {
it('should get greet value', function () {
myModule.on('test', function () { // "test" as I wrote in myModule
expect(myModule.greet).toHaveBeenCalled();
});
});
});
Run Code Online (Sandbox Code Playgroud) java ×4
angular ×2
concurrency ×2
jasmine ×2
javascript ×2
unit-testing ×2
angular-cli ×1
arrays ×1
asynchronous ×1
debugging ×1
mocking ×1
rxjs5 ×1
spring ×1
spring-ioc ×1
typescript ×1
xml-parsing ×1