我需要在Jersey ServletContainer中热部署和-undeploy资源.
似乎无法在ResourceConfig上"取消注册"资源,因此我遵循的路线是用新集合替换所有资源.
虽然文档说ResourceConfig上的registerResources取代了所有资源,但浏览源代码似乎与此相矛盾.
我找到的解决方案是使用全新的ResourceConfig重新加载ServletContainer.
Set<Class<?>> classes = ...
ResourceConfig config = new ResourceConfig(classes);
container.reload(config);
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,直到我部署导致ModelValidationException的资源.之后,我无法让ServletContainer恢复正常状态.
如果我看一下源代码:
public void reload(final ResourceConfig configuration) {
try {
containerListener.onShutdown(this);
webComponent = new WebComponent(webComponent.webConfig, configuration);
containerListener = webComponent.appHandler;
containerListener.onReload(this);
containerListener.onStartup(this);
} catch (final ServletException ex) {
LOGGER.log(Level.SEVERE, "Reload failed", ex);
}
}
Run Code Online (Sandbox Code Playgroud)
从WebComponent构造函数抛出ModelValidationException.之后,任何对重新加载的调用都会导致onShutdown方法的异常,这是由ServiceLocatorImpl的preDestroy方法中的checkState引起的.
我可以通过忽略验证错误来避免异常
ResourceConfig config = new ResourceConfig(classes);
config.property(ServerProperties.RESOURCE_VALIDATION_IGNORE_ERRORS,
Boolean.TRUE);
container.reload(config);
Run Code Online (Sandbox Code Playgroud)
然而,现在没有办法找出是否有任何错误,但要探索日志记录,这真的很糟糕.
根据heenenee的评论,我尝试了子类化ServletContainer,但是这样的事情会产生问题,因为ResourceConfig不能放在两个WebComponents中.
我尝试在关闭之前创建WebComponent以获得提前退出,但如果资源中没有错误,则无法实际重新加载(因为在创建web组件后无法修改resourceconfig)
@Override
public void reload(ResourceConfig configuration) {
try {
new WebComponent(new WebServletConfig(this), configuration);
} catch (ServletException …Run Code Online (Sandbox Code Playgroud) 我有一个Java程序占用100%的CPU,但似乎什么都不做.
如果我进行线程转储,则有4个线程(在5个池中)等待锁定.
"Incoming WorkPool 5" - Thread t@363
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- waiting to lock <7212149b> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "Incoming WorkPool 3" t@354
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1019)
at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)
Run Code Online (Sandbox Code Playgroud)
他们正在等待的线程是RUNNABLE
"Incoming WorkPool 3" - Thread t@354
java.lang.Thread.State: RUNNABLE
at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1024)
at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)
Run Code Online (Sandbox Code Playgroud)
这是JDK 7.0.25,所以似乎有一个线程被卡住了
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
Run Code Online (Sandbox Code Playgroud)
有两个AWT EventQueue线程,试图获得相同的pushpoplock.
VM作为服务运行,所以它不应该尝试做AWT的东西,但它是由我正在使用的库完成的.
有任何想法吗?我可以防止这种情况发生吗?
谢谢!
我目前正在使用一个更大的数据库,虽然我没有具体问题,但我想要一些建议,如果有人有的话.
该数据库为2.2千兆字节(重建/压缩后).它包含大约50个表.其中一个表包含blob和一些元数据.它目前有大约22000行.如果我从表中删除blob(UPDATE表SET blob = null),数据库大小将减少到大约200兆字节(重新创建/压缩后).元数据被大量访问,然而blob并不经常需要.
我目前使用的数据库URL是:
jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288
Run Code Online (Sandbox Code Playgroud)
它运行在我们的Java VM中,最大堆容量为4GB.
我想知道一些事情:
我有一个应用程序,我想在 PostgreSQL 和 SQL Server 上运行。我想使用 java.util.UUID 作为 ID。
我已将 SQL Server 中的列定义为
id UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE
Run Code Online (Sandbox Code Playgroud)
我已将 PostgreSQL 中的列定义为
id UUID NOT NULL
Run Code Online (Sandbox Code Playgroud)
这些列在我的 JPA 实体中定义为
@Id
@Column(name = "id")
public UUID getId() {
return id;
}
Run Code Online (Sandbox Code Playgroud)
这适用于 PostgreSQL,因为它将 UUID 传递给 PostgreSQL JDBC 驱动程序。这种方式适用于 SQL Server,因为 Hibernate 在将 UUID 发送到 SQL Server 之前将其转换为其二进制形式。不幸的是,二进制格式略有不同,导致 GUID 的字符串表示(例如,使用 SSMS 查看它们时)不同,这至少是令人困惑的。
这可以在 SQL Server 中通过将列的类型更改为 uuid-char 来解决
@Id
@Type(type = "uuid-char")
@Column(name = "id")
public UUID getId() {
return …Run Code Online (Sandbox Code Playgroud) 现在我按如下方式访问CRM SDK
IServiceManagement<IDiscoveryService> serviceManagement =
ServiceConfigurationFactory.CreateManagement<IDiscoveryService>(discoveryUri);
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = new System.Net.NetworkCredential(userName, password, domain);
using (DiscoveryServiceProxy serviceProxy = new DiscoveryServiceProxy(new DiscoveryServiceProxy(serviceManagement, credentials))
{
RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();
RetrieveOrganizationsResponse orgResponse =
(RetrieveOrganizationsResponse)service.Execute(orgRequest);
// do something with organisations
}
Run Code Online (Sandbox Code Playgroud)
但是,如果域凭据不正确,则会出现Windows登录提示(位于其中service.Execute).我不想要登录提示.我已经解决了这个问题,通过验证凭证,PrincipalContext然后再将它们传递给DiscoveryServiceProxy,但我对此并不完全满意.
有没有办法禁用登录提示?
java ×4
awt ×1
c# ×1
database ×1
h2 ×1
hibernate ×1
jersey ×1
jersey-2.0 ×1
postgresql ×1
sql-server ×1
swing ×1
uuid ×1
wcf ×1