如果我有这样的同步集合
Collection c = Collections.synchronizedCollection(myCollection);
javadoc synchronizedCollection提到外部迭代必须像这样同步:
synchronized (c) {
Iterator i = c.iterator();
while (i.hasNext()) {
process (i.next());
}
}
Run Code Online (Sandbox Code Playgroud)
我可以假设它c.toArray()是同步的,因此当方法执行时不会对集合进行任何更改吗?
或者我也需要同步它:
synchronized (c) {
c.toArray();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一个模式来验证已经在应用程序中使用的xml格式(重新设计xml的空间不大).
我正在尝试利用xml架构字典的key和keyref元素来验证身份约束.
一个特别的问题是xml模拟一对多关系的方式
<spaceships>
<spaceship guns="gun1 gun2 gun3"/>
</spaceships>
<guns>
<gun id="gun1"/>
<gun id="gun2"/>
<gun id="gun3"/>
</guns>
Run Code Online (Sandbox Code Playgroud)
我在我的架构中想出了这对key/keyref
<xs:key name="gunKey">
<xs:selector xpath="guns/gun" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="gunRef" refer="gunKey">
<xs:selector xpath="spaceships/spaceship" />
<xs:field xpath="@guns" />
</xs:keyref>
Run Code Online (Sandbox Code Playgroud)
这不会与xerces抗议验证:
键'gun1 gun2 gun3'键'gunRef'找不到元素的身份约束.
无论如何,在模式中表示列表的值是逗号分隔的对另一个实体的引用列表,并仍然获得身份约束验证的好处?
有人可以解释一下**在弹簧配置方面的含义吗?
<context:component-scan base-package="a.b.**" />
Run Code Online (Sandbox Code Playgroud)
这有什么不同呢?
<context:component-scan base-package="a.b" />
Run Code Online (Sandbox Code Playgroud)
我找不到任何关于在component-scan元素的base-package属性中使用通配符/ ant样式路径的信息.
你能否指出我在组件扫描属性中使用通配符解释的任何文档/源代码?我的google-fu是没用的
编辑: 我根据接受的答案做了一些实验,现在知道如何将base-package属性的值"转换"为资源字符串.
所以,我创建了两个Spring托管组件
a.b.SpringBean2
a.b.c.d.SpringBean1
Run Code Online (Sandbox Code Playgroud)
SpringBean1使用@Autowired注入SpringBean2
所以不仅如此:
<context:component-scan base-package="a.b"/>
Run Code Online (Sandbox Code Playgroud)
还有这个:
<context:component-scan base-package="a.b.**"/>
Run Code Online (Sandbox Code Playgroud)
在SpringBean2可以被正确解析以在SpringBean1中注入的意义上工作正常,但这些也可以工作:
<context:component-scan base-package="a.b.**.**.**"/> <!-- as many .** as you want-->
<context:component-scan base-package="a.b**"/>
<context:component-scan base-package="a.b*"/>
Run Code Online (Sandbox Code Playgroud)
但是,由于未解析的SpringBean2类型,这将因NoSuchBeanDefinitionException而失败:
<context:component-scan base-package="a.b.*"/>
Run Code Online (Sandbox Code Playgroud) 假设您有一些声明抛出未经检查的异常的方法
编辑:让我们说这不是你设计这个方法的人,而是一个非常可敬的框架的作者(Spring,aekhm!),你只是称它为
void someMethod() throws UncheckedException;
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是:
假设您有其他方法正在调用 someMethod
void someOtherMethod() {
someMethod()
}
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是:
UncheckedException的someOtherMethod?只是一点背景:
Spring框架的异常基于未经检查的异常.因此,例如,某些方法正在抛出(并在其中声明throws)DataAccessException.如果我的代码正在使用这些调用,它是否应该声明抛出这些异常?为什么?
我正在尝试熟悉 EIP 和 Apache Camel,并且我有一个用例,我不太确定如何使用 Camel 来表达或实现
使用案例:
假设您设计了一个集成解决方案,该解决方案从 ftp 获取文件,进行一些处理并将其上传到队列。您选择 Apache Camel 来实现此解决方案,并且 Java DSL 中的路线如下所示:
from("ftp://user@hostname/directoryname")
.process(new Processor() {
public void process(Exchange exchange) throws Exception
{
//my fantastic prosessing goes here
}
}).to("jms:queue:queueName");
Run Code Online (Sandbox Code Playgroud)
路线可能比这复杂得多,但这并不重要。想象一下,您的解决方案取得了如此巨大的成功,以至于有计划实施一项服务,任何人都可以添加他的 ftp 服务器并处理文件并将其上传到队列。所以你想要的是
让我们忘记#2,专注于灵活性部分。
所以问题是,我想:
如何动态(在运行时)向 Apache Camel 路由添加/删除端点?
到目前为止我所考虑的:
首先,我承认我对集成模式不太熟悉,但只要浏览一下目录,唯一符合要求的就是 Content Enricher。它可以接受一条消息,然后去其他地方并带来其他东西。所以我在想如果有人添加一个 ftp 服务器,连接详细信息可以封装在消息中,然后内容丰富器可以连接到该 ftp 服务器并获取文件并通过路由进一步推送......所以它实际上是能够连接到多个 ftp 服务器的 Content Enricher...这听起来是错误的。首先,我不认为这是该模式背后的意图,其次,由于 Camel 中有 ftp组件,我应该能够在该场景中使用它
第二种方法是将路由分成两部分,就像使用vm组件一样,如下所示:
from("ftp://user@hostname/directoryname").to("vm:internalQ");
from("vm:internalQ")
.process(new Processor() {
public void process(Exchange exchange) …Run Code Online (Sandbox Code Playgroud) java ×4
apache-camel ×1
collections ×1
integration ×1
schema ×1
spring ×1
synchronized ×1
xerces ×1
xml ×1
xsd ×1