小编S73*_*17H的帖子

使用NIO和NIO.2的Java非阻塞和异步IO(JSR203) - Reactor/Proactor实现

所以我在这里阅读我最喜欢的软件模式书之一(面向模式的软件架构 - 并发和网络对象的模式),特别是有关Proactor/Reactor异步IO模式的部分.我可以看到如何通过使用可选择的通道,我可以很容易地实现Reactor风格的异步IO机制(并且已经这样做了).但是,我无法看到如何使用非阻塞写入实现适当的Proactor机制.这是利用OS管理的非阻塞写入功能.

操作系统特定调用支持的功能,如win32下的GetQueuedCompletionStatus.

我确实看到Java 7通过异步完成处理程序为NIO带来了一些更新(这似乎是在正确的方向).话虽如此......鉴于缺乏对操作系统管理的异步操作(特别是异步写入)的统一跨平台支持,我假设这是一个不使用本机操作系统支持的quassy实现.

所以我的问题是,基于proactor的IO处理是否可以在Java中以这样的方式处理,以便用于特定场景; 并且,如果Java NIO确实支持基于proactor的IO处理(在Java 6或Java 7中),那么是否正在使用OS管理的异步IO支持(即来自OS的完成回调)?此外,如果实现纯粹是在VM中,则性能优势很小,使用主动事件处理只提供构建并发网络处理软件的不同(可能更简单)方式.

对于那些对主动事件处理感兴趣的人来说,这是一篇很好的文章,概述了优点/缺点以及与传统的每个连接线程和反应式IO模型的比较.

java design-patterns asynchronous nio asyncsocket

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

服务层中的已检查与未检查的例外

我处理具有遗留服务层的项目,如果请求的记录不存在,则在许多地方返回null,或者由于呼叫者未被授权而无法访问.我在谈论ID要求的特定记录.例如,类似于:

UserService.get(userId);
Run Code Online (Sandbox Code Playgroud)

我最近推动改变这个API,或者补充一个抛出异常的新API.关于已检查与未经检查的例外的争论随之而来.

从JPA/Hibernate等人的设计者那里得到一个说明,我建议未经检查的异常可能是最合适的.我的论点是,无法合理地期望API的用户从这些异常中恢复,并且在99%的情况下,我们最多只能通知应用程序用户发生了一些错误.

将运行时异常传播到通用处理机制显然会减少处理边缘情况异常所涉及的许多复杂性和所需的分支处理.但是,围绕这种方法存在很多担忧(这是正确的).

为什么选择JPA/EJB和Hibernate等项目的设计者使用未经检查的异常模型?它有充分的理由吗?有什么利弊.使用这些框架的开发人员是否仍然可以使用适配器包装器之类的东西处理接近它们抛出位置的运行时异常?

我希望这些问题的答案可以帮助我们对自己的服务层做出"正确"的决定.

java jpa unchecked service-layer checked-exceptions

16
推荐指数
1
解决办法
3530
查看次数

IntelliJ IDEA的充满活力的墨水主题

我一直试图在最后一小时找不到IntelliJ IDEA的Vibrant Ink主题的移植版本.在任何地方找不到工作链接!

有没有其他人使用这个主题的IDEA,如果是这样,你知道在哪里获得它的移植版本?

themes editor intellij-idea

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

使用Maven实现更智能的本机依赖性处理

我目前正在转换大型多模块项目(约100个子模块)以使用Maven.目前我们使用Ant + Ivy.

到目前为止,没有出现任何重大问题,我觉得Maven仍然很合适.但是,我想知道是否有更好的方法来处理本机依赖项.

到目前为止,我得出以下结论.

  1. 最好将每个本机依赖项安装到maven repo中,作为独立库或包含多个依赖项的归档包.
  2. 我没有在使用Maven依赖插件声明每个依赖项时迷失方向,而是选择给每个分类器(例如natives-win32)并在父POM中使用以下内容:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <includeScope>runtime</includeScope>
                        <includeClassifiers>natives-win32</includeClassifiers>
                        <outputDirectory>${project.build.directory}/natives</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    
    Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎是一个简单的全面解决方案,不需要太多的麻烦添加新的本机依赖项.它还为我提供了一个简单的全方位管理本地解决方案.我唯一要做的就是确保在java.library.path上定义了我的/ natives /目录.

困扰我(一点点)关于这种方法的一件事是,我的所有本机依赖项都被复制到表达对它们的传递依赖的每个子模块,而我的快乐jar库被添加到引用它们所在位置的类路径中我的本地存储库(无需复制).

有没有办法变得更聪明,并让我的本地人参考他们的存储库位置(假设我没有存档,即dll).这样可以节省大量不必要的复制.

有没有其他潜在的问题,我应该关注上述方法?

java dependencies maven-3

6
推荐指数
1
解决办法
1645
查看次数

JTextPane同步样式选择UI问题

我正在用Java开发一个简单的WYSIWYG RTF编辑器并且有一个小问题.我需要能够将样式选择切换按钮(例如粗体,斜体,下划线)与用户文本选择同步.例如,如果当前的文本选择是平原,没有被选择的粗体,斜体和下划线的切换按钮,但是当用户选择一些文字,是粗体和下划线,粗体和下划线的切换按钮被选择.

现在我很确定能JTextPane.getInputAttributes()获得我想要的选择属性但是在监听插入更新事件时存在问题.问题是附加到的插入符号监听器JTextPane似乎在输入属性发生更改后被调用.所以选择总是落后一步.也就是说,我必须在切换按钮更新之前选择文本两次!

这里重要的代码是:

textPane.addCaretListener(new CaretListener() {

        @Override
        public void caretUpdate(CaretEvent e) {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });
Run Code Online (Sandbox Code Playgroud)

和:

private void syncAttributesWithUI(AttributeSet attributes) {
    boldButton.setSelected(StyleConstants.isBold(attributes));
    italicButton.setSelected(StyleConstants.isItalic(attributes));
    underlineButton.setSelected(StyleConstants.isUnderline(attributes));
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

java user-interface swing jtextpane

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