小编art*_*tur的帖子

是同步Collection的toArray()方法同步?

如果我有这样的同步集合

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)

java collections synchronized

7
推荐指数
1
解决办法
1228
查看次数

在xml架构中使用keyref为具有值列表的属性

我正在尝试设计一个模式来验证已经在应用程序中使用的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'找不到元素的身份约束.

无论如何,在模式中表示列表的值是逗号分隔的对另一个实体的引用列表,并仍然获得身份约束验证的好处?

java xml schema xsd xerces

7
推荐指数
1
解决办法
1256
查看次数

Spring组件扫描中base-package属性中的通配符

有人可以解释一下**在弹簧配置方面的含义吗?

<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

5
推荐指数
2
解决办法
1万
查看次数

Java:声明未经检查的异常的最佳实践

假设您有一些声明抛出未经检查的异常的方法

编辑:让我们说这不是你设计这个方法的人,而是一个非常可敬的框架的作者(Spring,aekhm!),你只是称它为

void someMethod() throws UncheckedException;
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是:

  1. 除了在throws子句中声明未经检查的异常之外,还有其他原因吗?

假设您有其他方法正在调用 someMethod

void someOtherMethod() {
    someMethod()
}
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是:

  1. 什么是决定是否宣布投掷的最佳实践UncheckedExceptionsomeOtherMethod

只是一点背景:

Spring框架的异常基于未经检查的异常.因此,例如,某些方法正在抛出(并在其中声明throws)DataAccessException.如果我的代码正在使用这些调用,它是否应该声明抛出这些异常?为什么?

java exception-handling

5
推荐指数
2
解决办法
4208
查看次数

Apache Camel 如何从路由动态添加/删除端点

我正在尝试熟悉 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 服务器并处理文件并将其上传到队列。所以你想要的是

  1. (灵活性)能够从您的应用程序动态添加/删除服务器
  2. (扩展)能够处理潜在的大量此类服务器

让我们忘记#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 integration apache-camel

5
推荐指数
1
解决办法
3721
查看次数