- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理 wicket session 存储、数据存储、页面存储的自定义实现。我有 cu cluster wicket 并使其在以下情况下工作:
集群中有 2 个节点,节点 1 发生故障,用户应该能够在没有注意到的情况下继续流程,页面是有状态的,有很多 ajax 请求。现在,我将 wicket session 存储在 rmi 上的自定义存储中,并且我正在尝试扩展 DiskPageStore。新的挑战是 SessionEntry 内部类,它仍然由 ConcurrentMap 持有。
我的问题是:以前有人做过吗?您对如何完成此任务有任何建议吗?
最佳答案
我的建议是在您的情况下忘记 DiskPageStore 和 SessionEntry。您提到的 ConcurrentMap 保存在本地堆中。一旦其中一个节点发生故障,就无法访问其 ConcurrentMap,并且从 ConcurrentMap 引用的 Wicket 资源将无法释放。
因此,在集群环境中,您需要集群 Wicket 页面存储。页面版本可以根据某些策略过期,或者在相应 session 过期时故意删除。
我已经为生产中的企业 Web 应用程序中使用的 Apache Wicket 启用了 Web session 和数据存储集群,并且运行良好。我使用的软件是:
import java.util.concurrent.TimeUnit;
import javax.cache.expiry.Duration;
import javax.cache.expiry.TouchedExpiryPolicy;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheMemoryMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.eviction.lru.LruEvictionPolicy;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.wicket.pageStore.IDataStore;
import org.apache.wicket.pageStore.memory.IDataStoreEvictionStrategy;
import org.apache.wicket.pageStore.memory.PageTable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IgniteDataStore implements IDataStore {
private static final Logger log = LoggerFactory.getLogger(IgniteDataStore.class);
private final IDataStoreEvictionStrategy evictionStrategy;
private Ignite ignite;
IgniteCache<String, PageTable> igniteCache;
public IgniteDataStore(IDataStoreEvictionStrategy evictionStrategy) {
this.evictionStrategy = evictionStrategy;
CacheConfiguration<String, PageTable> cacheCfg = new CacheConfiguration<String, PageTable>("wicket-data-store");
cacheCfg.setCacheMode(CacheMode.PARTITIONED);
cacheCfg.setBackups(1);
cacheCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_VALUES);
cacheCfg.setOffHeapMaxMemory(2 * 1024L * 1024L * 1024L); // 2 Gigabytes.
cacheCfg.setEvictionPolicy(new LruEvictionPolicy<String, PageTable>(10000));
cacheCfg.setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(new Duration(TimeUnit.SECONDS, 14400)));
log.info("IgniteDataStore timeout is set to 14400 seconds.");
ignite = Ignition.ignite();
igniteCache = ignite.getOrCreateCache(cacheCfg);
}
@Override
public synchronized byte[] getData(String sessionId, int id) {
PageTable pageTable = getPageTable(sessionId, false);
byte[] pageAsBytes = null;
if (pageTable != null) {
pageAsBytes = pageTable.getPage(id);
}
return pageAsBytes;
}
@Override
public synchronized void removeData(String sessionId, int id) {
PageTable pageTable = getPageTable(sessionId, false);
if (pageTable != null) {
pageTable.removePage(id);
}
}
@Override
public synchronized void removeData(String sessionId) {
PageTable pageTable = getPageTable(sessionId, false);
if (pageTable != null) {
pageTable.clear();
}
igniteCache.remove(sessionId);
}
@Override
public synchronized void storeData(String sessionId, int id, byte[] data) {
PageTable pageTable = getPageTable(sessionId, true);
if (pageTable != null) {
pageTable.storePage(id, data);
evictionStrategy.evict(pageTable);
igniteCache.put(sessionId, pageTable);
} else {
log.error("Cannot store the data for page with id '{}' in session with id '{}'", id, sessionId);
}
}
@Override
public synchronized void destroy() {
igniteCache.clear();
}
@Override
public boolean isReplicated() {
return true;
}
@Override
public boolean canBeAsynchronous() {
return false;
}
private PageTable getPageTable(String sessionId, boolean create) {
if (igniteCache.containsKey(sessionId)) {
return igniteCache.get(sessionId);
}
if (!create) {
return null;
}
PageTable pageTable = new PageTable();
igniteCache.put(sessionId, pageTable);
return pageTable;
}
}
关于session - Wicket 集群 session 存储、页面存储、数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991767/
过去,我为我的表单构建了如下标签: : 我还需要使用wicket:label吗?标签?我没有使用 wicket:label在 wicket 7 中,它似乎工作正常。我可能不理解使用 wicket:la
是否可以为 MarkupContainer 生成标记?动态地,即不为其存储 HTML 文件? 我考虑将标记作为纯字符串从数据库中读取,以提供类似 CMS 的功能。 最佳答案 有趣的问题,我不确定这是否
是否有适用于 Wicket 1.5 的有效、支持和维护的脚手架解决方案?我知道 Wicketopia 位于两个不同地点 sourceforge和 github但这仍然针对 wicket 1.4,带来了
我想了解一些关于 wicket 支持泛型模型的信息。我了解了模型、 Prop 模型和 Prop 复合模型。 但是 Model 类呢?如果我这样做会发生什么: Label label = new Lab
如何在 Wicket 中实现多选下拉。我能够使用 bootstrap 创建多选下拉 View ,但我无法获得如何将所选选项与下拉组件的 IModel 相关联? Wicket 有没有可能?我不想使用 L
我正在使用 wicket 1.4.9 并实现了 spring + wicket auth-role 并根据页面上的角色使用@AuthorizeInstantiation。我有多个自定义角色。 我已经按
如何在 Wicket 1.5 中执行以下操作? page.getRequestCycle().setRequestTarget(new RedirectRequestTarget("http://ww
我想用密码保护 Wicket 中的网页,以便用户只有在他/她登录后才能访问它。 我还希望该页面显示登录页面,然后在登录用户试图访问的原始页面后。 这是如何用 wicket 完成的?我已经创建了一个登录
我使用的是 wicket 1.5,但在 getClientInfo() 方法中看不到 (WebRequest)RequestCycle.get().getRequest() 我在另一个地方看到了这段代
我刚刚尝试了 Apache Wicket“Hello, world”应用程序,我注意到在呈现的 HTML 输出中,Wicket 暴露了它的内部属性。 这是呈现的 HTML 在浏览器的“查看源代码”中的
我找不到像 wicket:include 之类的 wicket 标签?谁能建议我什么?我想在 html 文件中包含/注入(inject)原始源代码?如果没有这样的实用程序,有什么建议来开发它吗? 更新
在页面中查找特定(已知 wicket id)Wicket 组件的方法是什么? 最佳答案 您的选择是: get()搜索一个组件的方法 特定路径上的组件。 安 iterator()在拥有他所有 child
我正在为 wicket 页面编写测试。我的页面上有三个下拉菜单。根据从下拉列表中选择的值,面板会被渲染(面板包含一个数据表)。 如何更改 wicket 测试中下拉菜单的值,以便我可以针对所选值的不同组
在我的 wicket 应用程序中,有一些页面供用户使用,具体取决于他们的角色和不同的标准。在我的数据库中,我存储了用作该用户背景的图像路径。每个用户都有一个独特的页面。我知道我可以添加读取图像,如果我
如何在 Wicket 中定义我自己的反馈消息? 例如:如果我提供了一个错误的用户名,我想得到一个错误信息,如“用户名不正确,请尝试再次登录”。而不是使用默认的错误消息。 一个例子会是什么样的? 最佳答
假设我想要 3 个不同的 *.html 用于 WebPage。 F.e. page_small.html、page_tablet.html、page_desktop.html。我如何解析 screen
我无法确定 Wicket 应用程序中 RuntimeException 的原因。我设置了许多断点,但是当我提交表单时,只有在加载表单时,没有一个断点被触发。这是堆栈: WicketMessage: N
我刚刚编写了我的第一个 Wicket 组件 :) 它包含一个 ListView 和一些 Radio 输入字段。现在我想对所选值是否进入模型进行单元测试。 由于 WicketTester.newForm
我的类属性有两个 CSS 类值。 HTML 开头是这样的: 我想动态地把它改成这样: 目前我正在这样做: component.add(new SimpleAttributeModifier("cl
我有一个使用 PropertyModel 的文本字段,如下所示: TextField ageField = new TextField("age", new
我是一名优秀的程序员,十分优秀!